Плюшка CMS#

/* Создан для быстрой разработки приложений */
Скачать Демо

15.2. Бакэнд

10.10.2015

В базе данных есть таблица widgetType, которая содержит описание всех типов виджетов. Её поля таковы:

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

Запросы админки обрабатывает контроллер, указанный в поле «controller» таблицы «widgetType». Как правило этот же контроллер обрабатывает запросы, связанные с обслуживанием основного контента. В контроллере для каждого виджета должны быть предусмотрены два метода:

public function actionWidgetNAME($data=null) {
if(!$data) $data=array(...
);
...
}

public function actionWidgetNAMESubmit($data) {
...
return $data;
}

Тут NAMEэто имя виджета.

Первый метод вызывается при нажатии кнопки «добавить виджет» в диалоговом окне «управление виджетами в этой области», при выборе типа виджета из списка. А также при редактировании виджета из того же диалогового окна. Он должен сформировать дополнительные элементы управления, при помощи которых осуществляется настройка виджета. Метод принимает один параметр, содержащий настройки виджета, если он уже существует, если же виджет только создаётся, то этот параметр будет null.

Стоит обратить внимание на то, что данный метод является действием контроллера, поэтому он может возвращать MVC представление также, как и любое другое действие, кроме того также можно устанавливать подсказки, использую $this->cite, а вот заголовок страницы и метатеги не имеют никакого смысла.

Второй метод — это submit-действие, ему передаются данные формы (из $_POST). Он должен вернуть сформированные настройки виджета — это может быть либо строка либо массив. Если форма была заполнена неправильно, то метод должен установить сообщение об ошибке в атрибут $this->error. При этом настройки виджета не будут сохранены, а метод действия будет вызван повторно, возвращаемое submit-действием значение игнорируется.

Довольно часто в submit-действии виджета можно сразу же вернуть полученный атрибут $data, однко это может привести к тому, что в возвращаемое значение попадут излишние данные — этого следует избегать, т. к. настройки виджета хранятся в базе данных и подгружаются при каждом его показе на фронтенде.

Движок может проводить кеширование виджетов автоматически, для этого нужно лишь задать время жизни кеша. Вопросы кеширования — это задачи программиста, а не администратора, поэтому время кеширования задаётся программистом. Для этого возвращаемое submit-действием значение должно быть массивом и содержать элемент «cacheTime», в котором указывается время актуальности кеша (в минутах). Стоит заметить, что кеширование не работает, если сайт работает в отладочном режиме.

Виджет может иметь дополнительные кнопки административного интерфейса и они работают точно также как и в случае кнопок основного контента, о чём было сказано ранее.

Так как описанные выше процедуры являются действиями контроллера, то для них также нужно настраивать права доступа при помощи описанного выше метода controller::right().

Очень часто виджеты создают какие-либо файлы или записи в базе данных, поэтому нужно всегда удалять созданные данные при удалении виджета. Например, виджет «произвольный текст», создаёт файл, который этот текст содержит. Очевидно, что при удалении виджета нужно также удалить этот файл. Для этого нужно установить обработчик для события «widgetDelete». Внутри этого обработчика нужно проверить, что удаляется именно виджет «html» (произвольный текст) и если это так, то удалить соответствующий файл. События в административной части сайта работают также, как и в общедоступной. О событиях было написано в разделе «События (хуки)».