Модули:Модуль системы администрирования
Материал из Booot
Модули системы администрирования хранятся в каталоге
/admin/modules/
Имя файла должно соответствовать имени класса данного модуля, объявляемый класс является расширением класса AdminModule.
Содержание |
Структура модуля
class NewModule extends AdminModule {
const name = 'Имя модуля';
const order = 1;
function Info() {
$this->title = 'Новый модуль';
$this->content = 'Whatever you want';
$this->hint = array(
'title' => 'А вы знаете что',
'text' => 'Это новый модуль и он несет счастье людям'
);
}
}
name — Константа, задает имя модуля в списке модулей
order — Константа, определяет очередность вывода модулей в списке, значение 0 скрывает модуль
Info() — Метод вызываемый по-умолчанию
$this->title — Переменная, содержимое которой будет выведено в заголовке
$this->content — Переменная, содержимое которой будет выведено в содержании страницы
$this->hint['title'] — Переменная, содержимое которой будет выведено в заголовке вспомогательного блока
$this->hint['text'] — Переменная, содержимое которой будет выведено в содержании вспомогательного блока
Вспомогательные методы из AdminModule
Методы существенно упрощающие все стандартные операции по созданию модулей.
Получение ссылки в системе администрирования
GetLink($method="", $data=array(), $module="")
Все параметры опциональны, если они не заданы, то ссылка будет на модуль и метод где была вызвана GetLink.
$method — На какой метод отдать ссылку в текущем модуле
$data — Дополнительные параметры в ссылке (GET запроса). Ассоциированный одноуровневый массив
$module — На какой модуль отдать ссылку
Создание простой таблицы с данными
DataTable($table, $options=array(), $fields=array(), $where="", $order="")
Создает таблицу примерно такого вида
$table — Имя таблицы в mysql без префикса
$options — Объявление системных полей, контролов и табов
$fields — Поля и их свойства
$where — Уточнение выборки для таблицы
$order — Задание сортировки по-умолчанию
Пример
$this->content = $this->DataTable(
'products',
array(
//Имена системных полей
'nouns' => array(
'id' => 'id', // INT
'name' => 'name', // VARCHAR
'order' => 'order', // INT
'deleted' => 'deleted', // ENUM(Y,N)
'created' => 'created', // DATETIME
'modified' => 'modified', // DATETIME
'text' => 'text', // TEXT
'image' => true
),
//Отображение контролов
'controls' => array(
'add',
'edit',
'del'
),
//Табы (методы этого класса)
'tabs' => array(
'Images' => 'Изображения',
'Types' => 'Характеристики',
'Media' => 'Медиа/Файлы'
)
),
array(
'id' => array('name' => '№', 'class' => 'min'),
'name' => array('name' => 'Наименование', 'length'=>'1-128'),
'brand_name' => array('name' => 'Бренд', 'length'=>'0-128', 'autocomplete' => 'this'),
'supplier_name' => array('name' => 'Поставщик', 'length'=>'1-128', 'autocomplete' => array('LEGO', 'Кроха', 'Московский диллер')),
'price' => array(
'name' => 'Цена',
'length'=>'1-16',
'regex'=>'/^[0-9]*\.?[0-9]*$/i',
'regex_error'=>'Цена может быть только числовой и положительной',
'default'=>0
),
'anons' => array('name' => 'Анонс товара', 'hide_from_table'=>true),
'show' => array('name' => 'Показывать', 'class'=>'min'),
'is_action' => array('name' => 'Акция', 'class'=>'min',
'transform' => function($str){
if($str == 'Y') return 'Да';
elseif($str == 'N') return 'Нет';
else return $str;
}
),
'is_featured' => array('name' => 'Рекомендуемый', 'class'=>'min', 'transform'=>'YesNo'),
'order' => array('name' => 'Порядок', 'class'=>'min'),
'relations' => array('name' => 'Зависимые товары (№(id) через запятую)', 'length'=>'0-255', 'hide_from_table'=>true),
'top' => array(
'name' => 'Раздел',
'default' => $_GET['top'],
'select' => array(
//Обязательные
'table' => 'content',
'name' => 'name',
//Необязательные
'id' => 'id',
'order' => 'order',
'allow_null'=> true,
'top' => 'top'
)
)
),
'`top` = '.(int)$_GET['top']
);
nouns — Имена всех системных полей, если они есть их нужно указать, в примере перечислены все доступные
controls
- add — Разрешает добавление
- edit — редактирование
- del — удаление позиций таблицы
tabs — Указание методов для отображения во вкладках и имен вкладок
Опции поля таблицы, ключами являются имена полей:
- name — Отображаемое имя поля
- class — Класс ячейки заголовка таблицы, 'class'=>'min' максимально сжимает столбец
- hide_from_table — Скрывает столбец из таблицы, но оставляет в форме редактирования
- length — Указывается в формате «от-до» и не дает пользователю ввести строку длинны вне указанного диапазона
- default — Задает значение по-умолчанию, для формы добавления это значение будет сразу в указанном поле
- regex — Регулярное выражение для проверки вводимых данных, отрабатывает на клиенте и на сервере
- regex_error — Ошибка выводимая пользователю при непрохождении regex'а
- if_empty_make_uri — «Если пусто, сделать URI», указывается поле из которого перевести текст и сделать из него ссылку
- autocomplete — Позволяет создать поле с автокомплитом (autocomplete), принимает массив доступных значений (array(...)) или строку this. В случае this варианты будут выбраны из ранее введенных этого же поля.
- select — Создает select элемент для формы редактирования, поддерживает древовидные структуры. Хелпер default влияет на выбранный пункт по-умолчанию. Обязательные параметры: table — имя таблицы, name — имя поля содержащего имена пунктов. Необязательные параметры: id — имя поля содержащего ключи пунктов, order — имя поля для сортировки, allow_null — Разрешает пустой нулевой пункт, top — имя поля таблицы для построения древовидной структуры.
- transform — Создает обработчик для текущего поля, может принимать имя метода из текущего класса или inline-функцию (см. пример). Например, даты можно обрабатывать так: 'transform'=>function($date){return goodDate($date);}
Создание таблицы с большим массивом данных
DataTableAdvanced($table, $options=array(), $fields=array(), $where="", $order="")
Создает таблицу примерно такого вида
Входящие параметры идентичны DataTable
Создание дерева разделов
DataTree($table, $options, $fields)
Создает дерево разделов такого вида
Входящие параметры схожи с DataTable, отличия:
controls
- add_root — Разрешает добавление корневого раздела
- add_sub — Разрешает добавление подраздела
- edit — Редактирование
- list — Ссылка на подтаблицу (например товары каталога)
'list' => $this->GetLink().'&top={id}'
- del — Разрешает удаление
Дополнительная секция inner (связанная подтаблица)
'table' => 'products', //Имя таблицы 'top_key' => 'top', //Ключ соответствия категории товарам 'deleted' => 'deleted' //Поле «удалено»
Пример
$this->content = $this->DataTree(
'products_topics',
array(
//Имена системных полей
'nouns' => array(
'id' => 'id', // INT
'name' => 'name', // VARCHAR
'order' => 'order', // INT
'deleted' => 'deleted', // ENUM(Y,N)
'created' => 'created', // DATETIME
'modified' => 'modified', // DATETIME
'text' => 'text', // TEXT
'top' => 'top',
'image' => true
),
//Отображение контролов
'controls' => array(
'add_root',
'add_sub',
'edit',
'list' => $this->GetLink().'&top={id}',
'del'
),
//Зависимая таблица (напрмер товары или новости по рубрикам)
'inner' => array(
'table' => 'products', //Имя таблицы
'top_key' => 'top', //Ключ соответствия категории товарам
'deleted' => 'deleted' //Поле «удалено»
),
//Табы (методы этого класса)
'tabs' => array(
'TypesTopic' => 'Задать характеристики'
)
),
array(
'id' => array('name' => '№', 'class' => 'min'),
'name' => array('name' => 'Наименование', 'length'=>'1-128', 'link'=>$this->GetLink().'&top={id}'),
'nav' => array(
'name' => 'URI ссылка',
'length'=>'0-32',
'regex'=>'/^([a-z0-9-_]+)?$/i',
'regex_error' => 'URI ссылка может быть только из цифр, латинских букв и дефиса',
'if_empty_make_uri' => 'name'
),
'order' => array('name' => 'Порядок', 'class'=>'min')
)
);
Создание табов (вкладок)
Общий вид табов
Для задания табов необходимо объявить их в секции tabs любой из функций: DataTable, DataTableAdvanced, DataTree
Ключом является имя метода вызываемого при открытии таба, а значением — отображаемое имя этого таба, например:
'tabs' => array( 'Images' => 'Изображения', 'Types' => 'Характеристики', 'Media' => 'Медиа/Файлы' )
Рекомендуемый шаблон метода для таба (метод нужно писать в том же классе где он и объявлен, т.е. в текущем модуле):
function Images() {
$id = (int)(isset($_REQUEST['id'])?$_REQUEST['id']:0);
if($id == 0) {
echo 'Сначала создайте запись';
exit();
}
//Здесь ваш код
//Который что-то делает и передает переменные в шаблон
//Если вы суровый и из Челябинска, то можно обойтись и без шаблона
//Просто echo и exit
echo tpl('modules/'.__CLASS__.'/'.__FUNCTION__, array(
'link' => $this->GetLink(),
'module_id' => $id
));
exit();
}



