Настройка модели
Для более тонкой настройки модели можно передать дополнительные параметры в свойстве $model_display_params в классе модели. Все опции действительны для административной панели и ее методов create(), update() и delete().
Пример списка всех настроек по умолчанию в базовом классе ModelBase.
protected $display_params = [
'visible_fields' => '*',
'hidden_fields' => [],
'editable_fields' => '*',
'not_editable_fields' => [],
'create_actions' => true,
'update_actions' => true,
'delete_actions' => true,
'mass_actions' => true,
'fields_groups' => [],
'default_table_columns' => [],
'default_filters' => [],
'show_empty_default_filters' => false,
'redirects_to_models' => [],
'foreign_keys_admin_links' => false,
'versions_limit' => 'config'
];
Редактируемые и не редактируемые поля
editable_fileds - редактируемые поля модели, по умолчанию: '*' (все поля)
not_editable_fields - не редактируемые поля модели в административном интерфейсе, по умолчанию: пустой массив
Видимые и скрытые поля
visible_fields - видимые поля модели , по умолчанию: '*' (все поля)
hidden_fields - скрытые поля модели, в административном интерфейсе не отображаются, по умолчанию: пустой массив
Виртуальные поля
Возможность создания виртуальных полей, которые не участвуют в CRUD, описана в разделе текстового типа данных.
Операции создания, редактирования и удаления
create_actions - возможность создания записей модели в административной панели
update_actions - возможность редактирования записей модели в административной панели
delete_actions - возможность удаления записей модели в административной панели
mass_actions - возможность массового редактирования/удаления записей модели в административной панели
Все четыре параметра по умолчанию имеют значение true.
Группировка полей по вкладкам
Если в модели много полей, то можно разгруппировать их по вкладкам, при создании и редактировании записей в административном интерфейсе.
'fields_groups' => [
'Основные параметры' => ['active', 'name', 'url'],
'Тексты и изображения' => ['content', 'images']
];
Поля по умолчанию в общей таблице
default_table_columns - массив полей, которые выводятся в общей таблице до того момента, как пользователь сам установил свои настройки полей
'default_table_columns' => ['name', 'date', 'color', 'options']
Переход в другие модели
Для некоторых записей модели в административной панели можно задать возможность перехода в другие модели. Такая необходимость возникает, например, в модели 'Меню страниц', когда пункт 'Новости' присутствует в списке записей модели, но при этом сами новости располагаются в модели 'Новости'. Для удобства пользователей можно задать возможность при клике на ссылку 'Новости' переходить не на следующий уровень дерева, а в саму модель 'Новости'.
redirects_to_models - массив параметров для перехода в другие модели по прописанным признакам ['id'=32, 'url'='news', 'name'='Галерея']. Данная опция задействуется только в древовидных моделях, с полем типа ‘parent’.
'redirects_to_models' => [
'url' => ['news' => 'News'],
'name' => ['Каталог' => 'Catalogs'],
'id' => ['8' => 'Faq']
];
Ссылки на внешние ключи
Если данная опция задана, то в общей таблице записей в административной панели к полю со значением внешнего ключа будет добавлена ссылка для перехода на страницу редактирования записи данного значения внешнего ключа.
'foreign_keys_admin_links' => true
Ограничение на количество версий
При обновлении записей через административную панель старая версия записи сохраняется, и возможно произвести откат до прежних значений полей. Ограничение на количество хранимых версий одной записи задается опцией 'ModelVersionsLimit' в файле config/settings.php и по умолчанию составляет 25. Для каждой модели данное значение может быть изменено или полностью отключена возможность сохранять версии. При достижении лимита версий для записи, версии начинают удаляться, начиная с самой старой.
'versions_limit' => 30
'versions_limit' => 0
Настройка фильтров модели
default_filters - массив фильтров, которые видны по умолчанию до запуска фильтрации, если опция не задана, то выводятся первые 7 фильтров модели
show_empty_default_filters - если опция включена, фильтры по умолчанию будут отображаться в колонке даже если они не запущены, а другие при этом запущены
'default_filters' => ['price', 'name'],
'show_empty_default_filters' => true
Параметры именных полей
Используется когда в модели отсутствует поле с именем 'name'. Данное является полем имени записи, которое отображается в статистике, например в истории операций пользователей. Параметр $name_field указывает какое поле в модели считать именным. Также можно задать дополнительный параметр $name_field_extra, чтобы присоединить к названию записи значение еще одного поля.
Пример, модель клиентов для регистрации на сайте.
class Clients extends Model
{
protected $name = 'Клиенты';
protected $name_field = 'first_name';
protected $name_field_extra = 'last_name';
protected $model_elements = [
['Активация', 'bool', 'active'],
['Подтверждение региcтрации', 'bool', 'confirm'],
['Имя', 'char', 'first_name', ['required' => true]],
['Фамилия', 'char', 'last_name', ['required' => true]],
['Индивидуальный ключ', 'char', 'token']
];
protected $model_display_params = [
'editable_fields' => ['active', 'first_name', 'last_name'],
'hidden_fields' => ['token'],
'create_actions' => false,
'delete_actions' => false,
'fields_groups' => ['Основные параметры' => ['first_name','last_name'],
'Прохождение регистрации' => ['active','confirm', 'token']],
'default_table_columns' => ['first_name', 'last_name', 'active'],
'default_filters' => ['first_name', 'last_name']
];
}
Модификация отображения полей в таблице
Возможно изменить отображения поля в общей таблице путем создание м модели специального метода.
class Clients extends Model
{
...
public function pocessAdminModelTableFields($field, $row)
{
if($field === 'last_name')
return 'Фамилия: '.$row['last_name'];
}
}
Событийные методы
Когда в административной части происходит создание, редактирование или удаление записи, могут быть вызваны специальные методы для проведения дополнительных операций над данными. Во всех методах $id - ключ текущей записи, $fields - ассоциированный массив полей записи вида ['name' => 'Maxim', 'age' => 27].
- beforeCreate($fields) - метод вызывается перед созданием записи (id еще не существует)
- afterCreate($id, $fields) - метод вызывается после создания записи (id уже получен после запроса INSERT)
- beforeUpdate($id, $old_fields, $new_fields) - перед редактированием записи (старые и новые значения полей)
- afterUpdate($id, $new_fields) - после редактирования записи (новые значения полей)
- beforeDelete($id, $fields) - до удаления в корзину
- afterDelete($id, $fields) - после удаления в корзину (записи в таблице модели уже нет)
- beforeRestore($id, $fields) - до восстановления из корзины
- afterRestore($id, $fields) - после восстановления из корзины
- beforeFinalDelete($id, $fields) - до окончательного удаления из корзины
- afterFinalDelete($id, $fields) - после окончательного удаления из корзины (записи в таблице корзины уже нет)
Методы beforeCreate и beforeUpdate могут возвращать массив измененных полей, которые будут записаны в базу данных и историю изменений. При этом, возвращаемый массив может содержать только те поля, которые были изменены внутри данного метода. В метод beforeUpdate на вход передаются старые и новые для сравнения значения полей записи. Смотрите примеры ниже.
Если beforeDelete() или beforeRestore() вернут значение false, операция по удалению (восстановлению) произведена не будет.
class Products extends Model
{
protected $name = 'Товары каталога';
protected $model_elements = [ ... ];
protected function beforeCreate($fields)
{
if(!$fields['price'])
return ['active' => 0];
}
protected function beforeUpdate($id, $old_fields, $new_fields)
{
if(!$old_fields['active'] && $new_fields['active'])
return ['status' => 'new', 'order' => 1];
}
protected function beforeDelete($id, $fields)
{
if($fields['type'] == 'special')
{
$this -> addError('Удаление не было произведено по причине...');
return false;
}
}
}
Вставка кода в административный интерфейс
При необходимости в административной панели можно добавлять собственные фрагменты HTML и PHP кода. Для этого в папке customs/models/ создаем файлы, которые будут автоматически подключаться в заранее обозначенных местах. В названии фалов вместо слова 'model' должно стоять название модели, например products-create.top.php.
Для обычных моделей
Список записей модели
- model-index-top.php - перед кнопками верхней навигации
- model-index-bottom.php - после постраничной разбивки
Создание новой записи
- model-create-top.php - перед формой
- model-create-form.php - перед кнопками до закрытия формы
- model-create-bottom.php - после формы и кнопок
Редактирование записи
- model-update-top.php - перед формой
- model-update-form.php - перед кнопками до закрытия формы
- model-update-bottom.php - после формы и кнопок
Создание и редактирование записи
- model-action-top.php - перед кнопками верхней навигации
- model-action-bottom.php - после формы и кнопок
Для простых моделей
Редактирование полей простой модели.
- model-index-top.php - перед формой
- model-index-form.php - перед кнопками до закрытия формы
- model-index-bottom.php - после формы
Пример подключаемого файла, добавим кнопку для перехода на специальную страницу в административной панели, которые описаны в разделе Дополнения к административной панели. Для модели товаров создадим файл с кнопкой, которая будет располагаться под таблицей с записями модели. Название файла для модели Products будет customs/models/products-index-bottom.php.
<?
//Если у пользователя есть права на редактирование, выводим ссылку,
//если нет, то сообщение о нехватке прав
if($system -> user -> checkModelRights($system -> model -> getModelClass(), 'update'))
$update_path = 'location.href="'.Registry::get('AdminPanelPath').'custom/?view=upload"';
else
$update_path = "dialogs.showAlertMessage('{no_rights}')";
?>
<button type='button' onclick='<? echo $update_path; ?>'>Обновить прайс</button>
Предыдущий раздел
Типы данных