Файл admin.extrafields.php в Cotonti CMF

Файл admin.extrafields.php в движке Cotonti CMF предназначен для управления дополнительными полями (extra fields) в административной панели. Это административный модуль, который позволяет настраивать дополнительные поля для различных сущностей в системе, таких как категории, страницы или другие данные, которые могут иметь специфические атрибуты.

Основное назначение и место в системе:

Этот файл является частью административной части системы Cotonti. Он управляет отображением, редактированием, удалением и созданием дополнительных полей (extrafields) для различных типов данных. Администраторы могут изменять атрибуты этих полей, такие как название, описание, тип данных, обязательность, параметры, значения по умолчанию и другие настройки.

  • Контролирует внешний вид и структуру полей, предоставляя администратору удобный интерфейс для работы с ними.
  • Подключает плагины для расширения функционала (через хуки), позволяя интегрировать сторонние решения.
  • Реализует пагинацию для просмотра большого количества дополнительных полей.
  • Использует механизмы системы шаблонов для формирования конечного HTML-кода, который отображается пользователю.

Основные задачи и условия выполнения:

  1. Загрузка данных дополнительных полей: Через запросы к базе данных извлекаются все дополнительные поля для указанного места (например, для категорий или страниц). Они сортируются по названию и разделяются на страницы с помощью пагинации.

  2. Управление полями:

    • Отображение текущих полей с возможностью редактирования и удаления.
    • Создание нового поля с настройками, такими как название, описание, тип данных и другие параметры.
  3. Работа с тегами:

    • Для каждого поля могут быть заданы теги, которые потом отображаются в виде списка на странице.
  4. Пагинация: Код реализует механизм перехода между страницами, если количество дополнительных полей превышает лимит на одной странице.

  5. Обработка формы: Формы для добавления или редактирования дополнительных полей (с различными параметрами, такими как обязательность и тип поля).

  6. Хуки: Использование хуков для интеграции дополнительных плагинов или изменения стандартного поведения страницы, например, для модификации полей или их поведения через внешние расширения.

Методы и функции:

В файле используются следующие основные функции и методы:

  • 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;  // Подключение каждого плагина
}
/* ===== */
  1. Формируется путь навигации для административной панели с добавлением ссылок на другие разделы.
  2. Устанавливается заголовок страницы панели для раздела "Extra fields".
  3. Определяется максимальное количество элементов, отображаемых на одной странице, с проверкой корректности значения в конфигурации.
  4. Создается шаблон страницы на основе имени файла шаблона для данного раздела.
  5. Вставляется механизм хуков, который позволяет подключать дополнительные плагины, связанные с разделом "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 {  // Если условие не выполнено, то выполняется альтернативный блок (он не показан в коде)

Объяснение:

  1. Если параметр $n пустой или содержится в черном списке, то:
    • Запрашиваются все таблицы из базы данных.
    • Перебираются таблицы, и те, которые не входят в черный список, добавляются в список.
    • Составляется список иконок и информации для отображения каждой таблицы.
  2. В шаблон передаются данные для отображения каждой таблицы, такие как имя, тип, иконка и URL для редактирования.
  3. Дополнительно подключаются плагины, если они есть, через хук.
  4. Также создается функциональность для чередования стилей строк таблицы (четные/нечетные строки).

 

$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);  // Перенаправление на страницу после удаления
}

Объяснение:

  1. Обработка обновления полей:

    • Код проверяет, если параметр a равен 'upd' (обновление) и форма отправлена.
    • Затем он обрабатывает массивы значений для каждого поля, извлекая их из POST-запроса.
    • Для каждого поля проверяется, было ли оно изменено, и если это так, вызывается функция обновления поля cot_extrafield_update.
  2. Хуки для плагинов:

    • В обоих случаях, обновление и удаление, перед выполнением основного действия подключаются плагины, что позволяет расширять функционал движка через сторонние модули.
  3. Обработка ошибок и сообщений:

    • Если операция прошла успешно, пользователю показывается сообщение о том, что поле было обновлено или удалено.
    • В случае ошибки, генерируются соответствующие ошибки, и пользователь перенаправляется на исходную страницу.
  4. Удаление полей:

    • Если параметр 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'); // Получение готового контента шаблона

 

 

 

 

 

 

 

 

 

 

 

 

 

20 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-28 17:28
  • Last update: 2025-01-28 17:43

Similar pages

Файл extrafields.php в Cotonti
1 Файл extrafields.php в системной папке Cotonti CMF отвечает за управление дополнительными пользовательскими полями (их
API экстраполей в Cotonti (Extrafields API)
2 API экстраполей (Extrafields API)Экстраполя служат для дополнения определенными данными какие-либо сущности на сайте.
Файл admin.cache.disk.php в Cotonti CMF
3 Файл admin.cache.disk.php в движке Cotonti CMF является частью административной панели, предназначенной для управления
Файл admin.config.php в Cotonti CMF
4 Основное назначение файла и его место в системе Файл admin.config.php является частью административной панели системы
Файл admin.extensions.php в Cotonti CMF
5 Файл "admin.extensions.php" в движке Cotonti CMF является важным компонентом административной части системы,