Файл admin.extrafields.php в Cotonti CMF
Файл admin.extrafields.php в движке Cotonti CMF предназначен для управления дополнительными полями (extra fields) в административной панели. Это административный модуль, который позволяет настраивать дополнительные поля для различных сущностей в системе, таких как категории, страницы или другие данные, которые могут иметь специфические атрибуты.
Основное назначение и место в системе:
Этот файл является частью административной части системы Cotonti. Он управляет отображением, редактированием, удалением и созданием дополнительных полей (extrafields) для различных типов данных. Администраторы могут изменять атрибуты этих полей, такие как название, описание, тип данных, обязательность, параметры, значения по умолчанию и другие настройки.
- Контролирует внешний вид и структуру полей, предоставляя администратору удобный интерфейс для работы с ними.
- Подключает плагины для расширения функционала (через хуки), позволяя интегрировать сторонние решения.
- Реализует пагинацию для просмотра большого количества дополнительных полей.
- Использует механизмы системы шаблонов для формирования конечного HTML-кода, который отображается пользователю.
Основные задачи и условия выполнения:
-
Загрузка данных дополнительных полей: Через запросы к базе данных извлекаются все дополнительные поля для указанного места (например, для категорий или страниц). Они сортируются по названию и разделяются на страницы с помощью пагинации.
-
Управление полями:
- Отображение текущих полей с возможностью редактирования и удаления.
- Создание нового поля с настройками, такими как название, описание, тип данных и другие параметры.
-
Работа с тегами:
- Для каждого поля могут быть заданы теги, которые потом отображаются в виде списка на странице.
-
Пагинация: Код реализует механизм перехода между страницами, если количество дополнительных полей превышает лимит на одной странице.
-
Обработка формы: Формы для добавления или редактирования дополнительных полей (с различными параметрами, такими как обязательность и тип поля).
-
Хуки: Использование хуков для интеграции дополнительных плагинов или изменения стандартного поведения страницы, например, для модификации полей или их поведения через внешние расширения.
Методы и функции:
В файле используются следующие основные функции и методы:
cot_load_extrafields(): Функция для загрузки настроек дополнительных полей.cot_pagenav(): Функция для создания пагинации (перелистывания страниц).cot_inputbox(): Функция для создания текстовых полей ввода.cot_textarea(): Функция для создания текстовых областей (textarea).cot_selectbox(): Функция для создания выпадающих списков.cot_checkbox(): Функция для создания флажков.cot_url(): Функция для генерации URL-адресов.cot_confirm_url(): Функция для создания URL с подтверждением действия.cot_getextplugins(): Функция для получения активных плагинов.cot_rc(): Функция для рендеринга шаблонов.
Характеристика стиля PHP:
-
Использование шаблонов: Основной механизм вывода данных использует систему шаблонов (например,
$t->assign()для передачи данных в шаблон и$t->parse()для рендеринга). Это позволяет отделить логику от представления, улучшая читаемость и поддержку кода. -
Модулярность через хуки: Код активно использует хуки (
cot_getextplugins()) для возможности добавления сторонних расширений, что является типичной практикой в расширяемых CMS. -
Использование ООП и процедурного стиля: Код сочетает в себе оба подхода: классовые вызовы через статические методы (например,
Cot::$db->query()) и процедурный стиль для работы с данными и шаблонами. -
Переменные с префиксами: Использование имен переменных с префиксами (например,
$db_extra_fields,$field_types,$tags_list) для обеспечения уникальности и ясности в контексте данного файла. -
Чистота кода: Код хорошо структурирован, с четким разделением на блоки (например, обработка тегов, пагинация, подключение плагинов). В коде встречаются комментарии и логические блоки для расширяемости.
Заключение:
Этот файл играет важную роль в административной панели Cotonti, управляя настройками дополнительных полей. Он предоставляет функциональность для работы с метаданными различных объектов в системе и является важным компонентом для кастомизации структуры данных на сайте.
находится по адресу: /system/admin/admin.extrafields.php движка php-фреймворка Cotonti
<?php
/**
* Административная панель - Редактор дополнительных полей для части структуры
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
(defined('COT_CODE') && defined('COT_ADMIN')) or die('Wrong URL.'); // Проверка, что код был вызван через правильный URL (защита от прямого доступа)
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('admin', 'a'); // Получение прав доступа для текущего пользователя в админ-панели
cot_block(Cot::$usr['isadmin']); // Проверка, что пользователь является администратором, если нет — блокировка доступа
require_once cot_incfile('extrafields'); // Подключение файла с дополнительной функциональностью для работы с полями
$extra_blacklist = [ // Массив с базами данных, которые исключаются из работы с дополнительными полями
$db_auth, // База данных с информацией о пользователях
$db_cache, // База данных кэша
$db_cache_bindings, // База данных с привязками кэша
$db_core, // Основная база данных
$db_updates, // База данных с обновлениями
$db_online, // База данных с онлайн-пользователями
$db_extra_fields, // База данных с дополнительными полями
$db_config, // База данных с настройками
$db_plugins // База данных с плагинами
];
$extra_whitelist = [ // Массив с базами данных, которые разрешены для работы с дополнительными полями
$db_structure => [ // Структура базы данных
'name' => $db_structure, // Имя базы данных
'caption' => Cot::$L['Categories'], // Заголовок (категории)
'type' => 'system', // Тип базы данных (системная)
'code' => 'structure', // Код (структура)
'icon' => '<img src="' . Cot::$cfg['icons_dir'] . '/' . Cot::$cfg['defaulticons']
. '/32/folder.png" alt="{PHP.L.Structure}" />', // Иконка для отображения структуры
'tags' => [ // Теги, связанные с этой базой данных
'page.list.tpl' => '{LIST_CAT_ROW_XXXXX}, {LIST_CAT_XXXXX}', // Шаблон для отображения списка категорий
'page.list.group.tpl' => '{LIST_CAT_ROW_XXXXX}, {LIST_CAT_XXXXX}', // Шаблон для отображения группы категорий
'page.tpl' => '{PAGE_CAT_XXXXX}, {PAGE_CAT_XXXXX_TITLE}', // Шаблон для отображения страниц в категориях
'admin.structure.inc.tpl' => '{ADMIN_STRUCTURE_XXXXX}, {ADMIN_STRUCTURE_XXXXX_TITLE},{ADMIN_STRUCTURE_FORMADD_XXXXX}, {ADMIN_STRUCTURE_FORMADD_XXXXX_TITLE}' // Шаблон для административной панели структуры
]
]
];
- В
extra_blacklistперечислены базы данных, которые не будут участвовать в операции с дополнительными полями. - В
extra_whitelistуказаны базы данных, которые разрешены для работы с дополнительными полями, и для одной из них ($db_structure) заданы дополнительные параметры, включая иконку и теги для различных шаблонов.
$adminPath[] = [cot_url('admin', 'm=other'), Cot::$L['Other']]; // Добавление ссылки на раздел "Other" в административной панели
$adminPath[] = [cot_url('admin', 'm=extrafields'), Cot::$L['adm_extrafields']]; // Добавление ссылки на раздел "Extra fields" в административной панели
$adminTitle = Cot::$L['adm_extrafields']; // Установка заголовка страницы административной панели на "Extra fields"
$maxperpage = (is_int(Cot::$cfg['maxrowsperpage']) && Cot::$cfg['maxrowsperpage'] > 0 || ctype_digit(Cot::$cfg['maxrowsperpage'])) ? Cot::$cfg['maxrowsperpage'] : 15; // Определение максимального числа элементов на странице, если значение конфигурации допустимо, иначе по умолчанию 15
$t = new XTemplate(cot_tplfile(['admin', 'extrafields', $n], 'core')); // Создание экземпляра шаблона для страницы административной панели с файлом шаблона 'admin/extrafields'
/* === Hook === */
foreach (cot_getextplugins('admin.extrafields.first') as $pl) { // Получение и подключение плагинов для хука 'admin.extrafields.first'
include $pl; // Подключение каждого плагина
}
/* ===== */
- Формируется путь навигации для административной панели с добавлением ссылок на другие разделы.
- Устанавливается заголовок страницы панели для раздела "Extra fields".
- Определяется максимальное количество элементов, отображаемых на одной странице, с проверкой корректности значения в конфигурации.
- Создается шаблон страницы на основе имени файла шаблона для данного раздела.
- Вставляется механизм хуков, который позволяет подключать дополнительные плагины, связанные с разделом "Extra fields" административной панели.
if (empty($n) || in_array($n, $extra_blacklist)) { // Проверка, если параметр $n пуст или присутствует в черном списке
// no params
$sql = $db->query("SHOW TABLES"); // Запрос для получения списка всех таблиц в базе данных
$tablelist = []; // Инициализация пустого массива для хранения допустимых таблиц
while ($row = $sql->fetch()) { // Перебор всех таблиц в базе данных
$table = current($row); // Получение имени текущей таблицы
if (!in_array($table, $extra_blacklist)) { // Проверка, если таблица не входит в черный список
if (cot_import('alltables', 'G', 'BOL')) { // Если параметр alltables передан в запросе как булево значение
$tablelist[] = $table; // Добавление таблицы в список
} elseif(isset($extra_whitelist[$table])) { // Если таблица существует в белом списке
$tablelist[] = $table; // Добавление таблицы в список
}
}
}
cot_import('alltables', 'G', 'BOL') && $adminPath[] = [cot_url('admin', 'm=extrafields&alltables=1'), Cot::$L['adm_extrafields_all']]; // Если alltables включен, добавление пути в навигацию
$ii = 0; // Инициализация счетчика
foreach ($tablelist as $table) { // Перебор всех таблиц в таблице $tablelist
$name = ''; // Инициализация переменной для имени
$ext_info = []; // Инициализация массива для информации о расширении
$type = null; // Инициализация переменной для типа
$icon = $extra_whitelist[$table]['icon'] ?? null; // Получение иконки из белого списка для текущей таблицы, если существует
if (isset($extra_whitelist[$table])) { // Если таблица существует в белом списке
if (isset($extra_whitelist[$table]['type'])) { // Если задан тип для таблицы
$type = $extra_whitelist[$table]['type']; // Присвоение типа
}
if ($type == 'module' || $type == 'plug') { // Если тип 'module' или 'plug'
$ext_info = cot_get_extensionparams($extra_whitelist[$table]['code'], $extra_whitelist[$table]['type'] == 'module'); // Получение параметров расширения
$name = $ext_info['name']; // Присвоение имени из параметров расширения
if (!empty($ext_info['icon'])) { // Если иконка указана в параметрах
$icon = $ext_info['icon']; // Присвоение иконки
}
}
$name = (empty($name)) ? $extra_whitelist[$table]['caption'] : $name; // Если имя пустое, используем подпись из белого списка
}
if ($icon === null) { // Если иконка не найдена
$fileNames = [
Cot::$cfg['icons_dir'] . '/' . Cot::$cfg['defaulticons'] . '/default.png', // Путь к иконке по умолчанию
Cot::$cfg['icons_dir'] . '/default/default.png', // Альтернативный путь к иконке по умолчанию
];
foreach ($fileNames as $fileName) { // Перебор всех путей к файлам иконок
if (file_exists($fileName)) { // Если файл иконки существует
$icon = cot_rc('img_none', ['src' => $fileName]); // Присвоение иконки с помощью функции cot_rc
}
}
}
$ii++; // Увеличение счетчика на 1
$t->assign([ // Присвоение значений для шаблона
'ADMIN_EXTRAFIELDS_ROW_ICON' => $icon ?? '', // Иконка строки
'ADMIN_EXTRAFIELDS_ROW_ITEMNAME' => $name, // Имя строки
'ADMIN_EXTRAFIELDS_ROW_TABLENAME' => $table . ((isset($extra_whitelist[$table])) ? " - " . $extra_whitelist[$table]['caption'] : ''), // Название таблицы с подписью, если есть
'ADMIN_EXTRAFIELDS_ROW_TABLE' => $table, // Имя таблицы
'ADMIN_EXTRAFIELDS_ROW_TYPE' => $type, // Тип таблицы
'ADMIN_EXTRAFIELDS_ROW_TABLEURL' => cot_url('admin', 'm=extrafields&n='.$table), // URL для редактирования таблицы
'ADMIN_EXTRAFIELDS_COUNTER_ROW' => $ii, // Счетчик строк
'ADMIN_EXTRAFIELDS_ODDEVEN' => cot_build_oddeven($ii) // Функция для чередования стилей строк (четные/нечетные)
]);
$t->parse('MAIN.TABLELIST.ROW'); // Парсинг строки в шаблон
}
$t->assign('ADMIN_EXTRAFIELDS_ALLTABLES', cot_url('admin', 'm=extrafields&alltables=1')); // Присвоение ссылки для отображения всех таблиц
/* === Hook === */
foreach (cot_getextplugins('admin.extrafields.tablelist.tags') as $pl) { // Получение и подключение плагинов для хука 'admin.extrafields.tablelist.tags'
include $pl; // Подключение каждого плагина
}
/* ===== */
$t->parse('MAIN.TABLELIST'); // Парсинг списка таблиц в шаблон
} else { // Если условие не выполнено, то выполняется альтернативный блок (он не показан в коде)
Объяснение:
- Если параметр
$nпустой или содержится в черном списке, то:- Запрашиваются все таблицы из базы данных.
- Перебираются таблицы, и те, которые не входят в черный список, добавляются в список.
- Составляется список иконок и информации для отображения каждой таблицы.
- В шаблон передаются данные для отображения каждой таблицы, такие как имя, тип, иконка и URL для редактирования.
- Дополнительно подключаются плагины, если они есть, через хук.
- Также создается функциональность для чередования стилей строк таблицы (четные/нечетные строки).
$a = cot_import('a', 'G', 'ALP'); // Получение параметра 'a' из GET-запроса (строка, только буквы)
$id = (int) cot_import('id', 'G', 'INT'); // Получение параметра 'id' из GET-запроса (целое число)
$name = cot_import('name', 'G', 'ALP'); // Получение параметра 'name' из GET-запроса (строка, только буквы)
list($pg, $d, $durl) = cot_import_pagenav('d', $maxperpage); // Получение параметров для пагинации
$parse_type = ['HTML', 'Text']; // Определение возможных типов парсинга
$adminPath[] = [cot_url('admin', 'm=extrafields&n='.$n), Cot::$L['adm_extrafields_table'] . ' '
. $n . ((isset($extra_whitelist[$n])) ? ' - ' . $extra_whitelist[$n]['caption'] : '')]; // Добавление пути в навигацию для текущего раздела
$redirectUrl = cot_url('admin', ['m' => 'extrafields', 'n' => $n, 'd' => $durl,], '', true); // Формирование URL для перенаправления
if ($a == 'add' && !empty($_POST)) { // Если параметр 'a' равен 'add' и форма отправлена
$field['field_name'] = cot_import('field_name', 'P', 'TXT'); // Получение значения поля 'field_name' из POST-запроса (текст)
$field['field_type'] = cot_import('field_type', 'P', 'ALP'); // Получение значения поля 'field_type' из POST-запроса (строка, только буквы)
$field['field_html'] = cot_import('field_html', 'P', 'NOC'); // Получение значения поля 'field_html' из POST-запроса (строка без HTML)
$field['field_variants'] = cot_import('field_variants', 'P', 'HTM'); // Получение значения поля 'field_variants' из POST-запроса (строка с HTML)
$field['field_params'] = cot_import('field_params', 'P', 'HTM'); // Получение значения поля 'field_params' из POST-запроса (строка с HTML)
$field['field_description'] = cot_import('field_description', 'P', 'NOC'); // Получение значения поля 'field_description' из POST-запроса (строка без HTML)
$field['field_default'] = cot_import('field_default', 'P', 'HTM'); // Получение значения поля 'field_default' из POST-запроса (строка с HTML)
$field['field_required'] = cot_import('field_required', 'P', 'BOL'); // Получение значения поля 'field_required' из POST-запроса (булево значение)
$field['field_parse'] = cot_import('field_parse', 'P', 'ALP'); // Получение значения поля 'field_parse' из POST-запроса (строка, только буквы)
$field['field_noalter'] = cot_import('field_noalter', 'P', 'BOL'); // Получение значения поля 'field_noalter' из POST-запроса (булево значение)
$field['field_enabled'] = 1; // Установка значения поля 'field_enabled' как включенное
/* === Hook === */
foreach (cot_getextplugins('admin.extrafields.add') as $pl) { // Подключение плагинов через хук 'admin.extrafields.add'
include $pl; // Включение каждого плагина
}
/* ===== */
if (empty($field['field_name'])) { // Если имя поля пустое
cot_error(Cot::$L['adm_extrafield_error_name_missing']); // Ошибка: имя поля не указано
} elseif (!preg_match('/^\d*[A-Za-z\d_]+$/', $field['field_name'])) { // Если имя поля не соответствует нужному шаблону
cot_error(Cot::$L['adm_extrafield_error_name']); // Ошибка: некорректное имя поля
}
if (empty($field['field_type'])) { // Если тип поля пустой
cot_error('adm_extrafield_not_added'); // Ошибка: тип поля не выбран
}
if (cot_error_found()) { // Если найдены ошибки
cot_redirect($redirectUrl); // Перенаправление на страницу с ошибками
}
if ( // Если успешное добавление нового поля
cot_extrafield_add(
$n, // Имя таблицы
$field['field_name'], // Имя нового поля
$field['field_type'], // Тип поля
$field['field_html'], // HTML-параметры поля
$field['field_variants'], // Варианты для поля
$field['field_default'], // Значение по умолчанию
$field['field_required'], // Нужно ли поле
$field['field_parse'], // Тип парсинга
$field['field_description'], // Описание поля
$field['field_params'], // Дополнительные параметры поля
$field['field_enabled'], // Статус включенности поля
$field['field_noalter'] // Признак невозможности изменения поля
)
) {
cot_message('adm_extrafield_added'); // Сообщение об успешном добавлении поля
} else {
cot_error('adm_extrafield_not_added'); // Ошибка: поле не добавлено
}
cot_redirect($redirectUrl); // Перенаправление на страницу
}
-
Обработка параметров:
- Код извлекает различные параметры запроса (
a,id,name) и параметры для пагинации.
- Код извлекает различные параметры запроса (
-
Установка путей для навигации:
- В навигацию добавляется путь к текущей странице с учетом названия.
-
Обработка формы добавления нового поля:
- Когда пользователь нажимает на кнопку добавления (
a == 'add'), проверяются значения из POST-запроса. - Проверка валидности введенных данных: если имя поля пусто или некорректно, генерируются ошибки.
- Когда пользователь нажимает на кнопку добавления (
-
Хуки и плагины:
- Подключаются плагины с помощью хука, что позволяет сторонним расширениям вмешиваться в процесс.
-
Добавление нового поля:
- Если все данные валидны, вызывается функция для добавления нового поля в базу данных.
-
Перенаправление и сообщение:
- После успешного добавления или ошибки происходит перенаправление на исходную страницу с соответствующим сообщением.
} elseif ($a == 'upd' && !empty($_POST)) { // Если параметр 'a' равен 'upd' и форма отправлена
$field_name = cot_import('field_name', 'P', 'ARR'); // Получение массива значений 'field_name' из POST-запроса
$field_type = cot_import('field_type', 'P', 'ARR'); // Получение массива значений 'field_type' из POST-запроса
$field_html = cot_import('field_html', 'P', 'ARR'); // Получение массива значений 'field_html' из POST-запроса
$field_variants = cot_import('field_variants', 'P', 'ARR'); // Получение массива значений 'field_variants' из POST-запроса
$field_params = cot_import('field_params', 'P', 'ARR'); // Получение массива значений 'field_params' из POST-запроса
$field_description = cot_import('field_description', 'P', 'ARR'); // Получение массива значений 'field_description' из POST-запроса
$field_default = cot_import('field_default', 'P', 'ARR'); // Получение массива значений 'field_default' из POST-запроса
$field_required = cot_import('field_required', 'P', 'ARR'); // Получение массива значений 'field_required' из POST-запроса
$field_parse = cot_import('field_parse', 'P', 'ARR'); // Получение массива значений 'field_parse' из POST-запроса
$field_enabled = cot_import('field_enabled', 'P', 'ARR'); // Получение массива значений 'field_enabled' из POST-запроса
/* === Hook - Part1 : Set === */
$extp = cot_getextplugins('admin.extrafields.update'); // Получение списка плагинов, которые обрабатывают обновление полей
/* ===== */
if (is_array($field_name)) { // Если массив 'field_name' не пуст
foreach ($field_name as $k => $v) { // Для каждого поля в массиве
$field['field_name'] = cot_import($field_name[$k], 'D', 'ALP'); // Импортируем название поля
$field['field_type'] = cot_import($field_type[$k], 'D', 'ALP'); // Импортируем тип поля
$field['field_html'] = cot_import($field_html[$k], 'D', 'NOC'); // Импортируем HTML-тип поля
$field['field_variants'] = isset($field_variants[$k]) ? cot_import($field_variants[$k], 'D', 'HTM') : null; // Импортируем варианты, если они есть
$field['field_params'] = isset($field_params[$k]) ? cot_import($field_params[$k], 'D', 'HTM') : null; // Импортируем параметры, если они есть
$field['field_description'] = cot_import($field_description[$k], 'D', 'NOC'); // Импортируем описание поля
$field['field_default'] = isset($field_default[$k]) ? cot_import($field_default[$k], 'D', 'HTM') : null; // Импортируем значение по умолчанию
$field['field_required'] = cot_import($field_required[$k], 'D', 'BOL'); // Импортируем обязательность поля
$field['field_parse'] = cot_import($field_parse[$k], 'D', 'ALP'); // Импортируем тип парсинга
$field['field_enabled'] = cot_import($field_enabled[$k], 'D', 'BOL'); // Импортируем статус включенности поля
$field['field_location'] = $n; // Устанавливаем местоположение поля
if ( // Проверка: если имя поля не пустое, поле отличается от текущего или оно новое, и тип поля указан
!empty($field['field_name'])
&& (
empty($cot_extrafields[$n][$field['field_name']])
|| $field != $cot_extrafields[$n][$field['field_name']]
)
&& !empty($field['field_type'])
) {
/* === Hook - Part2 : Include === */
foreach ($extp as $pl) { // Для каждого плагина обновления поля
include $pl; // Включаем плагин
}
/* ===== */
// Обновление поля
$fieldresult = cot_extrafield_update(
$n, // Таблица
$k, // Индекс поля
$field['field_name'], // Имя поля
$field['field_type'], // Тип поля
$field['field_html'], // HTML-тип поля
$field['field_variants'], // Варианты
$field['field_default'], // Значение по умолчанию
$field['field_required'], // Обязательность
$field['field_parse'], // Тип парсинга
$field['field_description'], // Описание
$field['field_params'], // Параметры
$field['field_enabled'] // Статус включенности
);
if ($fieldresult == 1) { // Если обновление успешно
cot_message(sprintf(Cot::$L['adm_extrafield_updated'], $k)); // Сообщение об успешном обновлении
} elseif (!$fieldresult) { // Если обновление не удалось
cot_error(sprintf(Cot::$L['adm_extrafield_not_updated'], $k)); // Ошибка обновления
}
}
}
}
cot_redirect($redirectUrl); // Перенаправление на страницу с результатами обновлений
} elseif ($a == 'del' && isset($name)) { // Если параметр 'a' равен 'del' и задано имя поля
/* === Hook === */
foreach (cot_getextplugins('admin.extrafields.delete') as $pl) { // Подключение плагинов для удаления поля
include $pl; // Включаем плагин
}
/* ===== */
// Удаление поля
if (cot_extrafield_remove($n, $name)) { // Если поле удалено
cot_message('adm_extrafield_removed'); // Сообщение об успешном удалении
} else { // Если удалить не удалось
cot_error('adm_extrafield_not_removed'); // Ошибка удаления
}
cot_redirect($redirectUrl); // Перенаправление на страницу после удаления
}
Объяснение:
-
Обработка обновления полей:
- Код проверяет, если параметр
aравен'upd'(обновление) и форма отправлена. - Затем он обрабатывает массивы значений для каждого поля, извлекая их из POST-запроса.
- Для каждого поля проверяется, было ли оно изменено, и если это так, вызывается функция обновления поля
cot_extrafield_update.
- Код проверяет, если параметр
-
Хуки для плагинов:
- В обоих случаях, обновление и удаление, перед выполнением основного действия подключаются плагины, что позволяет расширять функционал движка через сторонние модули.
-
Обработка ошибок и сообщений:
- Если операция прошла успешно, пользователю показывается сообщение о том, что поле было обновлено или удалено.
- В случае ошибки, генерируются соответствующие ошибки, и пользователь перенаправляется на исходную страницу.
-
Удаление полей:
- Если параметр
aравен'del'и указано имя поля, то поле удаляется с помощью функцииcot_extrafield_remove.
- Если параметр
cot_load_extrafields(true); // Загружает дополнительные поля для текущего модуля или компонента
$totalitems = Cot::$db->query("SELECT COUNT(*) FROM $db_extra_fields WHERE field_location = '$n'")->fetchColumn(); // Получает общее количество записей в таблице db_extra_fields для текущего местоположения (field_location = $n)
$res = Cot::$db->query("SELECT * FROM $db_extra_fields WHERE field_location = '$n' ORDER BY field_name ASC LIMIT $d, ".$maxperpage); // Извлекает данные из db_extra_fields для текущего местоположения, сортирует по имени поля и ограничивает количество записей для страницы
$pagenav = cot_pagenav('admin', 'm=extrafields&n='.$n, $d, $totalitems, $maxperpage, 'd', '', Cot::$cfg['jquery'] && Cot::$cfg['turnajax']); // Создает навигацию по страницам с учетом общего количества записей и параметров пагинации
$field_types = [ // Массив типов полей для дополнительных полей
'input', // Текстовое поле
'inputint', // Целочисленное поле
'currency', // Валюта
'double', // Дробное число
'textarea', // Текстовая область
'select', // Выпадающий список
'checkbox', // Флажок
'radio', // Радиокнопка
'datetime', // Дата и время
'country', // Страна
'range', // Диапазон
'checklistbox', // Множественный список
'file'/* , // Файл */
//'filesize' // Размер файла (закомментировано)
];
$ii = 0; // Счетчик строк в таблице
/* === Hook - Part1 : Set === */
$extp = cot_getextplugins('admin.extrafields.loop'); // Загружает плагины для обработки каждой строки таблицы
/* ===== */
$cols = 55; // Ширина текстовых областей
foreach ($res->fetchAll() as $row) { // Для каждой строки из результата запроса
$ii++; // Увеличивает счетчик строк
$deleteUrl = cot_url('admin', ['m' => 'extrafields', 'n' => $n, 'a' => 'del', 'name' => $row['field_name']]); // Формирует URL для удаления поля
$deleteConfirmUrl = cot_confirm_url($deleteUrl, 'admin'); // Формирует URL для подтверждения удаления поля
$t->assign([ // Присваивает значения переменным для шаблона
'ADMIN_EXTRAFIELDS_ROW_NAME' => cot_inputbox('text', 'field_name['.$row['field_name'].']', $row['field_name'], 'class="exfldname"'), // Поле для редактирования имени
'ADMIN_EXTRAFIELDS_ROW_FIELDNAME' => htmlspecialchars($row['field_name']), // Безопасное отображение имени поля
'ADMIN_EXTRAFIELDS_ROW_DESCRIPTION' => cot_textarea( // Текстовая область для описания
'field_description[' . $row['field_name'] . ']',
$row['field_description'],
1,
$cols,
'class="exflddesc"'
),
'ADMIN_EXTRAFIELDS_ROW_SELECT' => cot_selectbox($row['field_type'], 'field_type['.$row['field_name'].']', $field_types, $field_types, false, 'class="exfldtype"'), // Выпадающий список для выбора типа поля
'ADMIN_EXTRAFIELDS_ROW_VARIANTS' => cot_textarea( // Текстовая область для вариантов
'field_variants[' . $row['field_name'] . ']',
$row['field_variants'],
1,
$cols,
'class="exfldvariants"'
),
'ADMIN_EXTRAFIELDS_ROW_PARAMS' => cot_textarea( // Текстовая область для параметров
'field_params[' . $row['field_name'] . ']',
$row['field_params'],
1,
$cols,
'class="exfldparams"'
),
'ADMIN_EXTRAFIELDS_ROW_HTML' => cot_textarea( // Текстовая область для HTML-кода
'field_html[' . $row['field_name'] . ']',
$row['field_html'],
1,
$cols,
'class="exfldhtml"'
),
'ADMIN_EXTRAFIELDS_ROW_DEFAULT' => cot_textarea( // Текстовая область для значения по умолчанию
'field_default[' . $row['field_name'] . ']',
$row['field_default'],
1,
$cols,
'class="exflddefault"'
),
'ADMIN_EXTRAFIELDS_ROW_REQUIRED' => cot_checkbox( // Флажок для обязательности поля
$row['field_required'],
'field_required[' . $row['field_name'] . ']',
Cot::$L['adm_extrafield_required'],
'class="exfldrequired"'
),
'ADMIN_EXTRAFIELDS_ROW_ENABLED' => cot_checkbox($row['field_enabled'], 'field_enabled['.$row['field_name'].']', '', 'title="'.Cot::$L['adm_extrafield_enable'].'" class="exfldenabled" '), // Флажок для включения поля
'ADMIN_EXTRAFIELDS_ROW_PARSE' => cot_selectbox($row['field_parse'], 'field_parse['.$row['field_name'].']', $parse_type, [Cot::$L['Default'], Cot::$L['No']], false, 'class="exfldparse"'), // Выпадающий список для парсинга
'ADMIN_EXTRAFIELDS_ROW_BIGNAME' => strtoupper($row['field_name']), // Имя поля в верхнем регистре
'ADMIN_EXTRAFIELDS_ROW_ID' => $row['field_name'], // ID поля
'ADMIN_EXTRAFIELDS_ROW_DEL_URL' => $deleteUrl, // URL для удаления
'ADMIN_EXTRAFIELDS_ROW_DELETE_CONFIRM_URL' => $deleteConfirmUrl, // URL для подтверждения удаления
'ADMIN_EXTRAFIELDS_ROW_COUNTER_ROW' => $ii, // Счетчик строк
'ADMIN_EXTRAFIELDS_ROW_ODDEVEN' => cot_build_oddeven($ii) // Чередование классов для четных и нечетных строк
]);
/* === Hook - Part2 : Include === */
foreach ($extp as $pl) { // Подключает плагины, если они есть
include $pl;
}
/* ===== */
$t->parse('MAIN.TABLE.EXTRAFIELDS_ROW'); // Парсит строку в шаблоне
}
В данном фрагменте кода происходит следующее:
1. Загрузка дополнительных полей:
cot_load_extrafields(true);— загружает дополнительные поля для текущего модуля или компонента.
2. Получение общего количества и данных полей:
totalitems— количество всех записей в таблице$db_extra_fields, где полеfield_locationсоответствует переменной$n.res— результат запроса, который получает все записи из таблицы$db_extra_fieldsдля конкретного местоположения ($n), с сортировкой поfield_nameи ограничением по количеству записей на странице (через параметрыdиmaxperpage).
3. Создание навигации по страницам:
cot_pagenavиспользуется для создания пагинации (перелистывания страниц) для результатов, с параметрами:'d'— текущая страница.totalitems— общее количество записей.maxperpage— максимальное количество записей на странице.
4. Массив типов полей:
field_types— список типов полей, таких как текстовые поля, числовые, выпадающие списки и другие, которые могут быть использованы для выбора типа каждого дополнительного поля.
5. Перебор всех полей в базе данных:
- В цикле
foreach ($res->fetchAll() as $row)производится обработка каждой строки результата из базы данных. Для каждого поля создаются соответствующие элементы формы на странице:cot_inputbox('text', 'field_name['.$row['field_name'].']', $row['field_name'], 'class="exfldname"')— поле для редактирования имени поля.cot_textarea()— используется для текстовых областей (для описания поля, вариантов, параметров и т.д.).cot_selectbox()— используется для выпадающих списков (например, для выбора типа поля или способа парсинга).cot_checkbox()— для создания флажков (например, для выбора обязательности поля или включенности поля).
6. Хуки плагинов:
- Сначала, до основного цикла, загружаются плагины, которые могут быть использованы в процессе обработки (через
cot_getextplugins('admin.extrafields.loop')). - Затем, после обработки каждой строки, подключаются те же плагины.
7. Динамическое изменение данных:
- Используются функции
cot_message(), чтобы динамически передавать значения или статусы полей (например, статус обязательности или включенности поля).
8. Удаление поля:
- Для каждого поля создается ссылка для удаления поля, а также создается подтверждающая ссылка для подтверждения операции удаления (
cot_confirm_url()).
9. Параметры отображения в шаблоне:
- Для каждого поля создаются соответствую
$tags_list = ''; // Инициализация переменной для хранения списка тегов
$tags_list_li = ''; // Инициализация переменной для хранения списка тегов в виде HTML-списка
if (isset($extra_whitelist[$n])) { // Проверка наличия белого списка для текущего местоположения
if (is_array($extra_whitelist[$n]['tags'])) { // Проверка, что тегами является массив
foreach ($extra_whitelist[$n]['tags'] as $ktags => $vtags) { // Перебор тегов в массиве
$tags_list .= cot_rc('admin_exflds_array', ['tplfile' => $ktags, 'tags' => $vtags]); // Формирование строки с тегами
$tags_list_li .= '<li>' . cot_rc('admin_exflds_array', ['tplfile' => $ktags, 'tags' => $vtags]) . '</li>'; // Формирование строки с тегами в виде HTML-списка
}
}
}
$t->assign([ // Присваивание значений переменным для шаблона
'ADMIN_EXTRAFIELDS_URL_FORM_EDIT' => cot_url('admin', 'm=extrafields&n='.$n.'&a=upd&d='.$durl), // URL для редактирования формы
'ADMIN_EXTRAFIELDS_NAME' => cot_inputbox('text', 'field_name', '', 'class="exfldname"'), // Поле для ввода имени
'ADMIN_EXTRAFIELDS_DESCRIPTION' => cot_textarea('field_description', '', 1, 30, 'class="exflddesc"'), // Текстовая область для описания
'ADMIN_EXTRAFIELDS_SELECT' => cot_selectbox('input', 'field_type', $field_types, $field_types, false, 'class="exfldtype"'), // Выпадающий список для типа поля
'ADMIN_EXTRAFIELDS_VARIANTS' => cot_textarea('field_variants', '', 1, 60, 'class="exfldvariants"'), // Текстовая область для вариантов
'ADMIN_EXTRAFIELDS_PARAMS' => cot_textarea('field_params', '', 1, 60, 'class="exfldparams"'), // Текстовая область для параметров
'ADMIN_EXTRAFIELDS_HTML' => cot_textarea('field_html', '', 1, 60, 'class="exfldhtml"'), // Текстовая область для HTML
'ADMIN_EXTRAFIELDS_DEFAULT' => cot_textarea('field_default', '', 1, 60, 'class="exflddefault"'), // Текстовая область для значения по умолчанию
'ADMIN_EXTRAFIELDS_REQUIRED' => cot_checkbox( // Флажок для обязательности поля
0,
'field_required',
Cot::$L['adm_extrafield_required'],
'class="exfldrequired"'
),
'ADMIN_EXTRAFIELDS_PARSE' => cot_selectbox('HTML', 'field_parse', $parse_type, [Cot::$L['Default'], Cot::$L['No']], false, 'class="exfldparse"'), // Выпадающий список для парсинга
'ADMIN_EXTRAFIELDS_URL_FORM_ADD' => cot_url('admin', 'm=extrafields&n='.$n.'&a=add&d='.$durl), // URL для добавления нового поля
'ADMIN_EXTRAFIELDS_PAGINATION_PREV' => $pagenav['prev'], // Кнопка "Предыдущая" для навигации по страницам
'ADMIN_EXTRAFIELDS_PAGNAV' => $pagenav['main'], // Основная навигация по страницам
'ADMIN_EXTRAFIELDS_PAGINATION_NEXT' => $pagenav['next'], // Кнопка "Следующая" для навигации по страницам
'ADMIN_EXTRAFIELDS_ON_PAGE_ITEMS' => $pagenav['onpage'], // Количество элементов на странице
'ADMIN_EXTRAFIELDS_TOTALITEMS' => $totalitems, // Общее количество элементов
'ADMIN_EXTRAFIELDS_TAGS' => $tags_list // Список тегов
]);
cot_display_messages($t); // Отображение сообщений для шаблона
if (isset($extra_whitelist[$n]['help'])) { // Если в белом списке есть помощь для текущего местоположения
$adminHelp = $extra_whitelist[$n]['help']; // Присваиваем текст помощи
} else { // В противном случае используем текст по умолчанию
$adminHelp = Cot::$L['adm_help_info'];
if (!empty($tags_list)) { // Если список тегов не пуст
$adminHelp .= Cot::$L['adm_help_newtags'].'<ul class="follow">'.$tags_list_li.'</ul>'; // Добавляем информацию о новых тегах
}
}
/* === Hook === */
foreach (cot_getextplugins('admin.extrafields.tags') as $pl) { // Подключаем плагины для обработки тегов
include $pl;
}
/* ===== */
$t->parse('MAIN.TABLE'); // Парсинг таблицы
}
$t->parse('MAIN'); // Парсинг основного шаблона
$adminMain = $t->text('MAIN'); // Получение готового контента шаблона
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-07-05 18:32
- Page published: 2025-01-28 17:28
- Last update: 2025-01-28 17:43