Модели(компоненты)

Группы

Предусмотрено добавление практически неограниченного числа групп, с любой иерархией и системным весом. У каждой группы, как и у любой модели есть группа владелец. Вы можете назначать любого владельца из числа подчиненных вам по системному весу групп. И устанавливать группе любой системный вес меньше вашего собственного максимального системного веса.

Группам назначается лимит моделей(0 - безлимит) и каталог группы по умолчанию в файловой системе при создании файлов обработчиков моделей. При удалении группы или её очистке от моделей удаляются все файлы обработчики и модели принадлжежащие данной группе. Если файл обработчик указан так же в моделях других владельцев - такой файл удалён не будет.

Подчинённые вам группы можно отключать. Если группа отключена и пользователь состоит в данной группе, система ведет себя так будто данной группы не существует, т.е. просто игнорирует наличие пользователя в группе. При этом все модели становятся недоступными на чтение.

Пользователям групп можно массово добавлять другие группы и массово исключать пользователей из групп. Посредством групп вы можете управлять связанным функционалом целиком, а не только по отдельным компонентам(моделям).

Для групп включается и отключается запись логов действий.

Пользователи

При добавлении пользователя из админ панели вы можете назначать его группы доступа и владельца только из числа подчинённых вам групп. Вы видите конфиденциальные данные(ip, x-oauth-token, email) только подчинённых вам по системному весу пользователей. У каждого пользователя отключается x-oauth-token авторизация - от него не будут работать api запросы и соответсвенно cron задачи выполняющиеся от его аккаунта.

Вы можете входить под сессией подчиненных вам пользователей, кликнув на его id в таблице. В таблице пользователей выводятся не все данные, часть из них скрыта по умолчанию, для экономии места. Это изменяется в верхней панели, над таблицей. Есть кнопочка включающая асинхронное автообновление таблицы. Чтобы наблюдать за активностью пользователей и страниц на которых они находятся, воспользуйтесь этим и соответсвующими сортировками, поиском, фильтрами - все эти состояния сохраняются при перезагрузках в любых таблицах моделей.

Отключение пользователя выключает для него любой функционал и страницы, он везде получает ошибку/страницу 403. Отключать можно только подчинённых пользователей, как и любые действия производимые с изменением свойств любой модели.

Шаблоны

При создании шаблона пользователь может устанавливать любые группы доступа. Группы доступа шаблона - это те группы, которым будет доступен данный шаблон на чтение(может быть встроен - использоваться). Группу владельца, как и в любой модели, можно устанавливать только из числа подчинённых групп.

Можно добавлять неограниченное количество шаблонов, с различными вёрстками, различных типов и с различными доступами.

Более подробно о шаблонах и их типах

Все доступные шаблоны находятся и создаются в каталоге templates/

Страницы

При добавлении страниц вы можете указывать абсолютно любые группы доступа, в том числе с правами выше ваших. Даже если у вас будут пересекаться группы и у пользователей уже будут страницы с такими request uri, это никак не навредит им, поскольку эта логика разрешится uri роутером.

Группа владелец указывается только из числа подчиненных вам групп(на всех моделях!).

У различных страниц может быть указан один и тот же файл обработчик, и разные шаблоны, или наоборот, здесь вариаций - ваша фантазия. Отключение страницы делает её недоступной всем(403), кроме владельца. На доступных страницах линки на отключённые страницы(как и триггеры модалок и действий), автоматически скрываются средствами внедряющегося css - им добавляется правило display:none!important; За это отвечает Html/Hideout.php метод hide вызывающийся в include/session.php по завершении работы скрипта.

Заметки
Можно создавать страницы, шаблоны и спокойно натягивать например новую вёрстку, прямо на продакшене, а затем только останется переключить модели.

Любые страницы можно кешировать, указывая количество секунд актальности кеша. Ключем кеша страницы будет полный REQUEST_URI запроса(включая строку запроса).

Выборки

Работа api выборок по логике аналогична моделям страниц. Единственное отличие, запрос к выборке должен начинаться с /api/select/your-path/...

В обработчиках можно указывать любую свою логику. В контексте системных моделей - это json ответы плагину Datatables, в вашем случае это наверняка будет иная логика.

Любые выборки можно кешировать, указывая количество секунд актальности кеша. Ключем кеша выборки будет полный REQUEST_URI запроса(включая строку запроса).

Модальные окна

При добавлении модели модального окна логика групп доступа и владельца, та же что и при добавлении страниц/выборок. Также указывается шаблон модалки, из числа доступных данной группе шаблонов. Дополнительно можно указать флажок создать действие, вместе с модальным окном будет создана модель действия с теми же доступами. При этом, если добавляется окно с формой(а именно для этого обычно они и связываются логикой), то в форме модального окна будет автоматически установлен атрибут action соответствующий request uri созданного действия.

В модальном окне с формой по умолчанию так же идёт универсальный ajax обработчик реализующий submit и отправку формы, и её закрытие с перезагрузкой Datatable. Всё ненужное вы можете легко убрать или добавить свою логику в данный обработчик. При отправке формы она и вся страница автоматически блокируются прелоадерами - не беспокойтесь за повторные отправки, здесь всё предусмотрено!

Поскольку код модальных окон уничтожается из DOM при их закрытии, и добавляется вновь при вызове, мы можем вешать в нём каждый раз обработчики типа:

$("#<?= $basename ?> .classname").on("click", function() {
console.log("Hello");
});

не беспокоясь о том что он будет вызван дважды, при повторном вызове окна.

Внимание
Не стоит использовать в модальном окне обработчики типа:
$(document).on("click", "#<?= $basename ?> .classname", function() {
console.log("Hello");
});

Такой обработчик будет повешен на document, а не на элемент, каждый раз при вызове окна, и соответственно при клике на элементе .classname может выполниться несколько раз(сколько раз вызывалась форма). Для отключения такого поведения используйте метод jquery .off() Но лучше вешать обработчики, как сказал выше, непосредственно на элемент.

Для модальных окон предусмотрен удобный конструктор кнопок - триггеров

Не обязательно создавать модели-компоненты модальных окон с вызовом их через api, для этого можно воспользоваться шаблонами и встроить их в любую страницу по принципу incode шаблонов, наделив данные шаблоны нужными правами. А если не требуются ограничения прав доступа, то можно встраивать и вызывать окна напрямую стандартным способом. Окна, которые изначально присутствовали в DOM не будут уничтожены при закрытии, и даже более того, окна которые вы вызвали из api, их тоже можно не уничтожать из DOM после закрытия. Для такого поведения им нужно добавить атрибут data-noremove.

Действия

Логика добавления обработчиков действий аналогична модальным окнам относительно доступов. Дополнительно можно указать флажок создать модальное окно, вместе с действием будет создана модель модального окна, причем для него будет автоматически выбран шаблон с формой и в action атрибуте установлен соответствующий request uri созданного действия.

Логику, предусматривающую модели форма в модалке + действие, лучше создавать именно так. Рекомендуется идентично именовать uri запросы модальных окон и действий, хотя это и не обязательно.

Предупреждения
При назначении групп доступа действиям, следует быть более внимательным(кому и что позволяем), чем при назначении групп доступа другим моделям, потому что действия иногда приводят к необратимым последствиям, нежели просто визуализация(выборки, модалки, странички).

Задачи

Встроенные cron задачи позволяют реализовать практически любую логику изменения состояний системных моделей по расписанию - включение, отключение, замена, удаление, очистка, смена шаблонов с вёрсткой, страниц, uri.

Синтаксис расписаний такой же как в Linux. В остальном это такая же модель как и остальные, имеющая свою группу владельца, вы не сможете поставить задачу от не подчиненного вам по системному весу пользователя.

Более подробно о встроенном cron здесь