Модули
ajax — обработчик AJAX-запросов к сайту.
auth — авторизация пользователей.
block — простые блоки текста.
bread — строка навигации "хлебные крошки".
catalog — каталог.
error — страница ошибки.
file — модуль для загрузки файлов.
info — основной модуль для информационных разделов по типу новостных.
list — списки.
message — сообщения с сайта.
profile — профиль пользователя.
site_closed — страница "Сайт закрыт".
sitemap — модуль формирования карты сайта.
structure — отображает структуру сайта.
update — обновление CMS.
user — управление пользователями.
Общее описание работы модулей
Модули вызываются следующим образом:
module(string $module_name, string $module_template = '', array $module_option = [])
$module_name - имя модуля. Допустимые символы a-zA-Z0-9_-
$module_template - шаблон модуля. Допустимые символы a-zA-Z0-9_-
$module_option - массив настроек вызова. Логика определяется самим модулем.
При вызове модуля ядро читает файл init.php из папки модуля CORE/module/$module_name. Пример файла для модуля с одной таблицей:
<?php
if (!defined('MC2_CORE') || MC2_CORE !== true) {
die('Access denied.');
}
// Настройки модуля
$module_info = [
'table' => 'info', // Имя таблицы, только a-zA-Z0-9_-
'prefix' => 'n_',
'title' => 'Инфо',
'title_edit' => 'Редактирование новости',
'items' => 12, // Количество элементов на странице. 0 - все
'uri' => 'info', // корень раздела
'folder' => 'info', // папка по-умолчанию для файлов относительно /files
'ajax_append' => true,
'admin' => 'editor', // права админов через запятую ,
'in_admin' => true, // показывать ли раздел в админке
];
// Структура таблицы
$module_db = [
'id' => [
'type' => 'int',
'length' => 11,
'auto_increment' => true,
'primary_key' => true,
'nullable' => false,
],
'date_time' => [
'type' => 'datetime',
'nullable' => false,
],
'title' => [
'type' => 'varchar',
'length' => 255,
'nullable' => false,
],
'text' => [
'type' => 'mediumtext',
'nullable' => false,
],
...
];
// Описание формы
$module_form = [
'id' => [
'type' => 'hidden',
],
'status' => [
'type' => 'checkbox',
'label' => 'Статус',
'label_text' => 'Активно',
'col_left' => 'col-4 col-lg-2',
'col_right' => 'col-8 col-lg-10',
],
'date_time' => [
'type' => 'hidden',
'label' => 'Дата и время',
],
'_date' => [
'type' => 'date',
'label' => 'Дата',
'col_left' => 'col-4 col-lg-2',
'col_right' => 'col-8 col-lg-10',
],
...
];
В файле могут находиться массивы:
- $module_info — настройки модуля. Список элементов может быть любой и зависит от модуля. Движок использует параметры:
- table для создания нужной таблицы и её полей
- admin для определения администратора модуля
- in_admin нужно ли показывать модуль в админке
- $module_db — структура базы данных.
- $module_form — форма редактирования элементов модуля. Ключи элементов этого массива должны совпадать с ключами $module_db. Если же ключ начинается с символа "_", то он не привязывается к полю базы данных, а обрабатывается как-то иначе.
Далее движок ищет такой же файл по пути шаблона TMPL/$module_name, затем TMPL/$module_name/$module_template, загружает из них те же переменные массивов и объединяет с имеющимися. Таким образом, переменные шаблона дополняют или переопределяют переменные модуля.
Если модуль требует несколько таблиц, то в init.php используется параметр tables. Пример init.php для модуля с несколькими таблицами:
<?php
if (!defined('MC2_CORE') || MC2_CORE !== true) {
die('Access denied.');
}
// Настройки модуля
$module_info = [
'tables' => [ // не менять! внутренние id таблиц, НЕ названия. названия указываются в init_<id>.php
'catalog',
'element',
'catalog_param',
'element_param',
'basket',
'order',
'order_items',
'money',
],
'title' => 'Каталог',
'uri' => 'catalog', // корень раздела
'folder' => 'catalog', // папка по-умолчанию для файлов относительно /files
'admin' => 'catalog', // права админов через запятую ,
'in_admin' => true, // показывать ли раздел в админке
];
Если указан ключ tables, то модуль может иметь сколько угодно таблиц и форм для их заполнения. Настройки для каждой таблицы находятся в файлах init_<id>.php, которые загружаются в том же порядке, что и основной init.php.
Если требуется изменить любой файл модуля, то его следует скопировать в папку TMPL/module_name или TMPL/module_name/module_template. Для поиска подходящего файла используется функция $module->path($file), которая возвращает наиболее приоритетный путь к нужному файлу, и этот путь уже можно использовать в include. В отличие от схемы дополнения массивов при загрузках файлов init.php, поиск остальных файлов модуля полностью переопределяет выполнение. Если есть нужный файл в папке шаблона, то файл в папке модуля с таким же именем не выполняется.
Для доступа к переменным модуля используются методы класса module. Внутри шаблонов модуля для этого используется экземпляр класса $module. Пример обращения к массиву info, элементу title:
echo '<h1>' . $module->info('title') . '</h1>';
Класс module
Private переменные содержат информацию о модуле и его настройках. Доступ к ним осуществляется через методы класса.
private $name = '';
private $template = '';
private $option = [];
private $info = [];
private $db = [];
private $form = [];
private $table = [];
private $ret = null;
Доступные публичные методы класса:
init(string $_name, string $_template, array $_option)
Инициализирует модуль. Читает файлы конфигурации init.php, определят права доступа пользователя.
После чтения всех файлов конфигурации модуля, некоторые переменные (если они существуют) проходят валидацию:
- $info['table'] — разрешено только a-zA-Z0-9_-
- $info['prefix'] — разрешено только a-zA-Z0-9_-
- $info['title'] — результат выполнения функции safe_string()
- $info['title_edit'] — результат выполнения функции safe_string()
- $info['items'] — преобразование к int
- $info['uri'] — результат выполнения функции safe_path()
- $info['folder'] — результат выполнения функции safe_path()
- $info['notify_email'] — проверяет на массив и чтобы все элементы массива были электронными почтами, иначе удаляет элемент
- $info['notify_tg'] — проверяет на массив и чтобы все элементы массива были целыми числами != 0, иначе удаляет элемент
- $info['notify_vk'] — проверяет на массив и чтобы все элементы массива были целыми числами != 0, иначе удаляет элемент
info($param = '')
Возвращает информацию о параметрах модуля.
Если не указана $param, то возвращается весь массив.
Если указана $param, то только значение указанной переменной $info[$param]. Если такая переменная не найдена, возвращается пустая строка.
set_info(array $value)
Обновляет весь массив $info.
set_info_item(string $key, $value)
Обновляет элемент массива $info.
del_info_item(string $key)
Удаляет элемент $info[$key].
db()
Возвращает массив $db.
set_db(array $value)
Обновляет весь массив $db.
form(string $item = '', string $param = '')
Возвращает информацию о форме редактирования.
Если не указаны $item и $param, то возвращается весь массив form.
Если указана $item, то только значение указанной переменной $form[$item].
Если указана $param, то значение $form[$item][$param].
set_form(array $value)
Обновляет весь массив $form.
set_form_item(string $key, array $value)
Обновляет значение указанной переменной $form[$key].
set_form_param(string $key, string $param, $value)
Обновляет значение указанной переменной $form[$key][$param].
del_form_item(string $key)
Удаляет массив $form[$key] из формы.
table($param)
Возвращает объект для указанной таблицы.
Аналоги методов для модуля с несколькими таблицами:
table_info($table, $param = '')
table_form($table, string $item = '', string $param = '')
Работают точно так же, как info() и form(), только первым параметром нужно указать ключ таблицы.
name()
Возвращает текущее имя модуля.
template()
Возвращает текущее имя шаблона модуля.
option($param = '')
Возвращает информацию о настройках вызова модуля.
Если не указана $param, то возвращается весь массив.
Если указана $param, то только значение указанной настройки $option[$param]. Если такая настройка не найдена, возвращается пустая строка.
path(string $file): string
Возвращает путь до подходящего файла шаблона модуля по принципу:
- Максимальный приоритет у файла по пути TMPL/$moduleName/$moduleTemplate/$file. Если такой файл существует, то возвращается путь к нему.
- TMPL/$moduleName/$file
- Если оба вышестоящих файла не найдены, возвращается CORE/$moduleName/$file
Далее этот путь можно использовать в include.
Этот принцип позволяет заменять в папке шаблона любые файлы модуля своими. Если нужный файл в шаблоне отсутствует, то используется стандартный файл модуля.
Пример использования:
$info_items = 0;
$filePath = $module->path('list_item.php');
if ($filePath) {
foreach ($items as $item) {
$item = row2item($item, $module->info('prefix'));
include $filePath;
$info_items++;
}
}
fields(array $data = [], $obj = null): array
Генерирует и возвращает массив для HTML-формы.
Если не указан $obj, то используется схема для модуля с одной таблицей.
Если указан $obj, то используются данные для модуля с множественными таблицами.
set_return($value)
Устанавливает значение, которое модуль должен вернуть после завершения.
get_return()
Получает значение, которое модуль должен вернуть после завершения.
Public static методы класса:
module::module_load_init($name, $template = '', $init_file = 'init.php'): array
Загружает произвольный файл конфигурации модуля по тому же принципу, что и основной метод init(), заполняет только переменную $module_info и возвращает её. Можно вызывать из любого места с целью узнать конфигурацию произвольного модуля.
module::db_sync($db_array, $tableName, $fieldPrefix)
Синхронизирует структуру таблицы init файла с базой данных.
module::module_path($moduleName, $moduleTemplate, $file): string
То же самое, что и $module->path(string $file), только с возможность вызвать статично, указав имя модуля и шаблона.
module::info_validate($info): array
Валидирует некоторые переменные массива $info. Возвращает исправленный массив.