Плагин “Custom Extrafields” для Cotonti
плагин меняет стратегию хранения: для всех зарегистрированных через него экстраполей создаётся физически независимая таблица cot_xtradbrowpage. Каждая запись в ней жёстко привязана к идентификатору соответствующей страницы
Самое важное: Плагин “Custom Extrafields” - это пользовательские экстраполя для статей со своей собственной таблицей БД. Добавляет кастномные дополнительные поля к отдельным страницам, не засоряя неиспользованными ячейками в столбцах всю таблицу модуля Page. Плагин меняет стратегию хранения: для всех зарегистрированных через него экстраполей создаётся физически независимая таблица cot_xtradbrowpage. Каждая запись в ней жёстко привязана к идентификатору соответствующей страницы
В системе Cotonti экстраполя (extrafields) — это механизм расширения стандартных таблиц базы данных для хранения дополнительных атрибутов сущностей (пользователей, страниц, товаров и т.д.). Стандартные экстраполя для модуля page хранятся непосредственно в таблице cot_pages. Однако для определённых сценариев, когда требуется хранить данные, специфичные только для отдельных страниц и не влияющие на производительность списков страниц, используется отдельная таблица.
Плагин xtradbrowpage реализует именно такой подход: создаёт таблицу cot_xtradbrowpage, где каждая запись привязана к странице через поле itempagid (внешний ключ с каскадным удалением на cot_pages.page_id). Все остальные столбцы добавляются динамически через систему экстраполей Cotonti для локации cot_xtradbrowpage.
Основные преимущества
- Хранение кастомных экстраполей страниц в отдельной таблице.
- Полная интеграция с административной панелью экстраполей (
admin.extrafields.first). - Автоматическое сохранение, загрузка и удаление данных при работе со страницами.
- Поддержка тегов в шаблонах редактирования, просмотра и списков страниц.
- Поддержка специальных тегов для
<head>(SEO-метатеги). - Совместимость с парсерами контента Cotonti.
Плагин «xtradbrowpage» для Cotonti: полное руководство
(See the partial SQL Dump)
Cotonti 0.9.26 (PHP 8.4+). Дата: 24 апреля 2026 года.
Данное руководство — профессиональное, всестороннее описание плагина xtradbrowpage, предназначенного для системы управления контентом Cotonti версии 0.9.26 и выше. Плагин создан специально для модуля «page» (статьи/страницы) и решает задачу добавления настраиваемых экстраполей, которые физически хранятся в отдельной таблице базы данных cot_xtradbrowpage.
Руководство состоит из теоретической и практической частей, охватывает установку, настройку, работу с шаблонами, использование штатных и кастомных тегов, а также особенности интеграции плагина с административной панелью и хуковой системой Cotonti. Все сведения основаны исключительно на предоставленной автором документации, структуре файлов плагина и фрагментах ядра CMS; никакие домыслы не допускаются.
Содержание
- Введение и назначение плагина
- Архитектурные решения
- Требования и зависимости
- Установка и активация
- Работа с административным интерфейсом экстраполей
- Типы полей и их особенности
- Система тегов в шаблонах
- Использование в формах редактирования страниц
- Вывод данных на странице просмотра
- Теги для списков страниц и лент новостей
- SEO-теги и интеграция в секцию
<head> - Жизненный цикл данных: создание, обновление, удаление
- Структура базы данных и внешние ключи
- Безопасность и права доступа
- Расширенные сценарии использования
- Решение типичных проблем
- Заключительные рекомендации
постоянная ссылка на актуальный исходный код плагина
1. Введение и назначение плагина
Плагин xtradbrowpage расширяет стандартные возможности модуля «Статьи» (page) системы Cotonti. По умолчанию каждое дополнительное поле (extrafield), создаваемое администратором для страниц, сохраняется непосредственно в таблице cot_pages. Такой подход удобен, но при большом количестве полей или при необходимости хранить данные, используемые лишь в отдельных типах страниц, может приводить к разрастанию основной таблицы и усложнению запросов.
Данный плагин меняет стратегию хранения: для всех зарегистрированных через него экстраполей создаётся физически независимая таблица cot_xtradbrowpage. Каждая запись в ней жёстко привязана к идентификатору соответствующей страницы (внешний ключ с каскадным удалением). Таким образом, основные поля страницы остаются в cot_pages, а расширенные характеристики вынесены вовне, что улучшает структуру базы и снижает нагрузку при выборках, где дополнительные поля не нужны.
2. Архитектурные решения
Ключевые архитектурные особенности плагина, вытекающие из его внутреннего устройства:
- Отдельная таблица хранения. Все данные, относящиеся к плагину, располагаются в
cot_xtradbrowpage. Эта таблица создаётся установочным SQL‑скриптом и далее расширяется штатными средствами управления экстраполями Cotonti. - Регистрация в подсистеме extrafields. Плагин добавляет собственную локацию в белый список расширений, делая её доступной в административном интерфейсе «Расширения → Экстраполя».
- Перехват ключевых хуков. Для бесшовной интеграции используются хуки, позволяющие автоматически подгружать, сохранять и удалять данные вместе с родительской страницей, а также предоставлять теги для всех стандартных шаблонов.
- API-функции. Плагин включает набор функций, которые можно вызывать из любого места системы для получения или сохранения набора экстраполей конкретной страницы.
3. Требования и зависимости
Для корректной работы плагина необходимо соблюдение следующих условий:
- Версия Cotonti: 0.9.26 или более новая (официальная сборка с GitHub).
- Версия PHP: 8.4 или выше (требуется для использования современных возможностей языка и строгой типизации).
- Модуль «page»: должен быть установлен и активен. Зависимость прописана в метаданных плагина (
Requires_modules=page). - Права на запись в файловую систему: стандартные для установки расширений Cotonti (копирование папки плагина).
- База данных: MySQL 5.7+ или MariaDB 10.2+ с поддержкой InnoDB и внешних ключей.
- Шаблоны: Рекомендую тему “Index36: Modern Theme for Cotonti CMF”.
4. Установка и активация
Процесс установки полностью автоматизирован и использует штатный установщик расширений Cotonti:
- Скопируйте каталог
xtradbrowpageв папку/plugins/вашего сайта. - Авторизуйтесь в панели администратора и перейдите в раздел «Расширения».
- На вкладке «Плагины» найдите строку «Custom Extrafields for Pages» и нажмите кнопку «Установить».
- Система выполнит следующие операции:
- Запустит SQL-скрипт из
setup/xtradbrowpage.install.sql, создающий базовую таблицуcot_xtradbrowpageс первичным ключом и внешней ссылкой наcot_pages. - Зарегистрирует плагин в таблице
cot_core(хранящей сведения обо всех расширениях). - Внесёт в таблицу
cot_pluginsзаписи для каждого используемого хука (всего их семь, о которых будет рассказано далее). - Установит права доступа в соответствии с указанными в блоке
[BEGIN_COT_EXT]значениями: гостям — чтение, зарегистрированным пользователям — чтение и запись.
- Запустит SQL-скрипт из
- После успешной установки плагин сразу готов к работе; дополнительных действий в файлах конфигурации не требуется.
Обновление плагина предусматривает применение патчей из каталога setup, если таковые появятся в будущих версиях. Процедура обновления инициируется через тот же административный интерфейс.
4.1 Удаление плагина “xtradbrowpage” и зачистка БД.
Для корректного удаления всех данных плагина при деинсталляции недостаточно одного uninstall.sql, так как он:
- содержит статическое имя таблицы cot_xtradbrowpage, которое не будет работать при изменённом префиксе ($db_x);
- не очищает записи в системной таблице $db_extra_fields, управляющей всеми экстраполями.
Поэтому создаем PHP-обработчик xtradbrowpage.uninstall.php, который Cotonti запускает после SQL-файла.
В нём будем использовать переменные с актуальными названиями таблиц, что бы безопасно удалить и саму таблицу плагина, и связанные строки в таблице `cot_extra_fields`.
Готовый файл plugins/xtradbrowpage/setup/xtradbrowpage.uninstall.php
<?php
/**
* xtradbrowpage.uninstall.php – Полное удаление данных плагина при деинсталляции
*
* Удаляет:
* - Все записи в таблице cot_extra_fields, относящиеся к таблице $db_xtradbrowpage
* - Саму таблицу $db_xtradbrowpage (DROP TABLE IF EXISTS)
*
* @package xtradbrowpage
* @version 2.7.8
* @author webitproff
* @copyright Copyright (c) webitproff 2026 | https://github.com/webitproff/xtradbrowpage-cotonti
* @license BSD
*/
defined('COT_CODE') or die('Wrong URL');
// Подключаем файл плагина для регистрации глобальных переменных ($db_xtradbrowpage)
require_once cot_incfile('xtradbrowpage', 'plug');
global $db, $db_extra_fields, $db_xtradbrowpage;
// 1. Удаляем все определения экстраполей для нашей таблицы
$db->delete($db_extra_fields, "field_location = ?", [$db_xtradbrowpage]);
// 2. Удаляем саму таблицу (на случай, если SQL-файл не сработал или префикс отличается)
$db->query("DROP TABLE IF EXISTS `{$db_xtradbrowpage}`");
Что происходит при деинсталляции
- Cotonti вызывает ваш uninstall.sql – с текущим жёстким именем cot_xtradbrowpage он может упасть на сайтах с нестандартным $db_x.
- Затем Cotonti исполняет uninstall.php, который:
- из cot_incfile('xtradbrowpage', 'plug') регистрирует глобальную переменную $db_xtradbrowpage (она равна, например, x974_xtradbrowpage);
- через $db_extra_fields (это $db_x . 'extra_fields', всегда актуально) удаляет все строки с field_location = '$db_xtradbrowpage';
- безопасно дропает таблицу плагина с правильным именем (IF EXISTS).
Таким образом, плагин удаляется полностью, не оставляя мусора в cot_extra_fields.
Примечания
Можно удалить старый `xtradbrowpage.uninstall.sql` или оставить его как «запасной» вариант – PHP-обработчик всё равно выполнится и перекроет возможные ошибки префикса.
Файл xtradbrowpage.functions.php обязательно должен содержать вызов Cot::$db->registerTable('xtradbrowpage'); – именно он создаёт глобальную $db_xtradbrowpage.
Если вдруг, в
cot_extra_fieldsостались старые строки сfield_location='cot_xtradbrowpage', их можно почистить напрямую через phpMyAdmin через запрос во вкладке SQL:
(внимание на преффиксcot_он у вас может быть другой)
DELETE FROM `cot_extra_fields` WHERE `field_location` = 'cot_xtradbrowpage';
Дополнительная зачистка (если что-то пошло не по плану) выполнить через phpMyAdmin
-- Удаляем все записи о полях нашего плагина
DELETE FROM cot_extra_fields WHERE field_location = 'cot_xtradbrowpage';
-- Удаляем саму таблицу плагина (если она была создана)
DROP TABLE IF EXISTS cot_xtradbrowpage;
5. Работа с административным интерфейсом экстраполей
После активации плагина в списке локаций для экстраполей появляется новый пункт, соответствующий таблице cot_xtradbrowpage. Интерфейс позволяет создавать, редактировать и удалять дополнительные поля точно так же, как и для любой другой подсистемы Cotonti.
При добавлении поля необходимо указать:
- Название поля (латиницей, без пробелов, например
event_capacity). - Тип поля — поддерживаются все стандартные типы Cotonti: строка ввода, текстовая область, выпадающий список, дата/время, число с плавающей точкой и другие.
- HTML-шаблон поля — определяет внешний вид элемента формы; при желании можно использовать стандартную разметку Bootstrap, как это сделано в примерах из поставки.
- Варианты значений (для списков), параметры (например, диапазон дат), значение по умолчанию.
- Описание — отображается в качестве подсказки рядом с полем.
- Обязательность заполнения и активность поля.
После сохранения поле физически добавляется в таблицу cot_xtradbrowpage (структура изменяется автоматически), а его метаданные прописываются в системной таблице cot_extra_fields. С этого момента поле готово к использованию во всех поддерживаемых контекстах.
6. Типы полей и их особенности
Плагин полностью наследует механизм работы системы экстраполей Cotonti, поэтому доступны следующие типы (на основе анализа предоставленного дампа БД):
- input — однострочное текстовое поле (например, название события).
- textarea — многострочная текстовая область (описание программы).
- select — выпадающий список с предустановленными вариантами (сезон: зима, лето, осень, весна).
- datetime — выбор даты и времени (начало события). Для этого типа можно задать параметры: допустимый диапазон годов, формат вывода.
- double — число с плавающей точкой (цена билета).
Особое внимание стоит обратить на тип datetime. В предоставленном примере его параметры установлены как 2024,2030,d.m.Y H:i. Это означает, что в форме будут показаны выпадающие списки для дня, месяца, года, часа и минуты; допустимый период — с 2024 по 2030 год; формат при выводе на страницу — «день.месяц.год часы:минуты». Все преобразования выполняются стандартными функциями Cotonti, не требуя ручного вмешательства.
7. Система тегов в шаблонах
Одно из главных преимуществ плагина — автоматическое создание тегов для шаблонов. Теги генерируются динамически на основе зарегистрированных полей, что избавляет разработчика от необходимости вручную описывать каждую переменную. Поддерживаются следующие группы тегов:
| Контекст | Префикс/шаблон тега | Пример для поля event_start |
| Форма редактирования | {PAGEEDIT_FORM_XTRA_ИМЯПОЛЯ}{PAGEEDIT_FORM_XTRA_ИМЯПОЛЯ_TITLE} | {PAGEEDIT_FORM_XTRA_EVENT_START}{PAGEEDIT_FORM_XTRA_EVENT_START_TITLE} |
| Страница просмотра | {XTRA_ИМЯПОЛЯ}{XTRA_ИМЯПОЛЯ_TITLE}{XTRA_ИМЯПОЛЯ_VALUE} | {XTRA_EVENT_START}, {XTRA_EVENT_START_TITLE}, {XTRA_EVENT_START_VALUE} |
| Списки страниц (новости, категории и др.) | {LIST_ROW_XTRA_ИМЯПОЛЯ}{LIST_ROW_XTRA_ИМЯПОЛЯ_TITLE}{LIST_ROW_XTRA_ИМЯПОЛЯ_VALUE} | {LIST_ROW_XTRA_EVENT_START} и т.д. |
Секция <head> | {XTRA_HEADER_ИМЯПОЛЯ}{XTRA_HEADER_ИМЯПОЛЯ_TITLE} | Используется для мета-тегов, например <meta name="event-start" content="{XTRA_HEADER_EVENT_START}"> |
Кроме индивидуальных тегов, плагин предоставляет блок повторения <!-- BEGIN: XTRA_EXTRAFLD --> для вывода всех полей скопом. Это крайне удобно, когда дизайн не требует уникальной вёрстки для каждого поля.
8. Использование в формах редактирования страниц
При редактировании страницы плагин автоматически добавляет на форму все активные экстраполя. Для корректной работы необходимо внести изменения в шаблон page.edit.tpl. Рекомендуется вставить следующий блок в любом удобном месте формы (например, после основных полей):
<!-- IF {PHP|cot_plugin_active('xtradbrowpage')} -->
<div class="card mb-4">
<div class="card-header d-flex align-items-center bg-none fw-bold">
Все экстраполя плагина "xtradbrowpage" выводим динамически
</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EXTRAFLD}
</div>
</hr>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>
<!-- ENDIF -->Благодаря этому все поля будут выведены в едином стиле. Если же требуется индивидуальное оформление, можно использовать персональные теги, например:
<!-- IF {PHP|cot_plugin_active('xtradbrowpage')} -->
<div class="card mb-4">
<div class="card-header d-flex align-items-center bg-none fw-bold">
Индивидуальный способ вывода экстраполей плагина "xtradbrowpage"
</div>
<div class="card-body">
<!-- IF {PAGEEDIT_FORM_XTRA_EVENT_NAME} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EVENT_NAME_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_NAME}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_EVENT_DESCRIPTION} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EVENT_DESCRIPTION_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_DESCRIPTION}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_EVENT_START} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EVENT_START_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_START}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_EVENT_TICKETPRICE} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EVENT_TICKETPRICE_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_TICKETPRICE}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_EVENT_SESON} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EVENT_SESON_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_SESON}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_INT} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_INT_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_INT}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_DOUBLE} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_DOUBLE_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_DOUBLE}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_SELECT} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_SELECT_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_SELECT}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_RADIO} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_RADIO_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_RADIO}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_DATETIME} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_DATETIME_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_DATETIME}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_FILE} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_FILE_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_FILE}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_COUNTRY} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_COUNTRY_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_COUNTRY}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_RANGE} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_RANGE_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_RANGE}
</div>
<!-- ENDIF -->
<!-- IF {PAGEEDIT_FORM_XTRA_DEMO_CHECKLISTBOX} -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_DEMO_CHECKLISTBOX_TITLE}</label>
{PAGEEDIT_FORM_XTRA_DEMO_CHECKLISTBOX}
</div>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->Поля формы автоматически подставляют текущие значения, если запись в cot_xtradbrowpage уже существует. При первом создании страницы таблица дополняется сразу после её добавления (логика сохранения срабатывает по хуку обновления, поэтому при создании новой страницы запись появится при первом же редактировании).
9. Вывод данных на странице просмотра
шаблон полной статьи: page.tplили page.articles.tplиpage.news.tpl и тому подобные
9.1 динамический вывод экстраполей в шаблоне
На странице просмотра (шаблон page.tpl) плагин делает доступными все зарегистрированные поля. Простейший способ отобразить их — блок повторения(циклом - динамический вывод) то есть все поля которые заполнены мы их все скопом и выводим:
<!-- IF {PHP|cot_plugin_active('xtradbrowpage')} -->
<!-- BEGIN: XTRA_EXTRAFLD -->
<!-- IF {XTRA_EXTRAFIELD_VALUE} -->
<div class="extrafield-{XTRA_EXTRAFIELD_NAME}">
<strong>{XTRA_EXTRAFIELD_TITLE}:</strong>
<span>{XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- ENDIF -->
<!-- END: XTRA_EXTRAFLD -->
<!-- ENDIF -->где мы себе в класс выводим {XTRA_EXTRAFIELD_NAME} - имя поля как подсказу, что бы не запутаться
Этот блок автоматически перебирает все доступные поля и выводит их названия вместе со значениями, отформатированными в соответствии с типом поля (дата, число, текст и т.п.).
9.2 Индивидуальный вывод экстраполей в шаблоне
Для избирательного отображения применяются показанные выше индивидуальные теги {XTRA_…}.
Например, чтобы показать только цену билета и начало события:
<!-- IF {PHP|cot_plugin_active('xtradbrowpage')} -->
<div class="card mb-4">
<div class="card-header d-flex align-items-center bg-none fw-bold">
Индивидуальный вывод (CoTemplate, только реальные теги)
</div>
<div class="card-body">
<!-- event_name (input) -->
<!-- IF {XTRA_EVENT_NAME} -->
<div class="mb-3">
<i class="fa-regular fa-calendar-check me-2 text-primary"></i>
<strong>{XTRA_EVENT_NAME_TITLE}:</strong>
<span class="fw-semibold">{XTRA_EVENT_NAME}</span>
</div>
<!-- ENDIF -->
<!-- event_description (textarea) с очисткой тегов и обрезкой -->
<!-- IF {XTRA_EVENT_DESCRIPTION} -->
<div class="mb-3 p-3 bg-light rounded">
<h6 class="fw-bold"><i class="fa-solid fa-align-left me-1"></i> {XTRA_EVENT_DESCRIPTION_TITLE}</h6>
<p class="mb-0">
{XTRA_EVENT_DESCRIPTION_VALUE|strip_tags($this)|mb_substr($this, 0, 150, 'UTF-8')}...
</p>
</div>
<!-- ENDIF -->
<!-- event_start (datetime) – форматирование через cot_date -->
<!-- IF {XTRA_EVENT_START} -->
<div class="mb-3">
<i class="fa-regular fa-clock me-2 text-warning"></i>
<strong>{XTRA_EVENT_START_TITLE}:</strong>
<span class="badge bg-warning text-dark">
{XTRA_EVENT_START_VALUE|cot_date('d.m.Y H:i', $this)}
</span>
</div>
<!-- ENDIF -->
<!-- event_ticketprice (double) -->
<!-- IF {XTRA_EVENT_TICKETPRICE} -->
<div class="mb-3">
<i class="fa-solid fa-dollar-sign me-2 text-success"></i>
<strong>{XTRA_EVENT_TICKETPRICE_TITLE}:</strong>
<!-- IF {XTRA_EVENT_TICKETPRICE_VALUE} == '0' -->
<span class="badge bg-success">Бесплатно</span>
<!-- ELSE -->
<span class="fs-3 fw-bold">
{XTRA_EVENT_TICKETPRICE_VALUE} $
</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- event_seson (select) – вложенные IF вместо ELSEIF -->
<!-- IF {XTRA_EVENT_SESON} -->
<div class="mb-3">
<i class="fa-solid fa-cloud-sun me-2 text-success"></i>
<strong>{XTRA_EVENT_SESON_TITLE}:</strong>
<!-- IF {XTRA_EVENT_SESON_VALUE} == 'winter' -->
<span>❄️ Зима</span>
<!-- ELSE -->
<!-- IF {XTRA_EVENT_SESON_VALUE} == 'spring' -->
<span>🌱 Весна</span>
<!-- ELSE -->
<!-- IF {XTRA_EVENT_SESON_VALUE} == 'summer' -->
<span>☀️ Лето</span>
<!-- ELSE -->
<!-- IF {XTRA_EVENT_SESON_VALUE} == 'autumn' -->
<span>🍂 Осень</span>
<!-- ELSE -->
<span class="text-capitalize">{XTRA_EVENT_SESON}</span>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- ENDIF -->
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- demo_int (inputint) -->
<!-- IF {XTRA_DEMO_INT} -->
<div class="mb-3">
<span class="fa-stack fa-sm me-2">
<i class="fa-solid fa-circle fa-stack-2x text-secondary"></i>
<i class="fa-solid fa-hashtag fa-stack-1x fa-inverse"></i>
</span>
<strong>{XTRA_DEMO_INT_TITLE}:</strong>
<span class="badge bg-secondary">{XTRA_DEMO_INT}</span>
</div>
<!-- ENDIF -->
<!-- demo_double (double) -->
<!-- IF {XTRA_DEMO_DOUBLE} -->
<div class="mb-3">
<i class="fa-solid fa-dollar-sign me-2 text-success"></i>
<strong>{XTRA_DEMO_DOUBLE_TITLE}:</strong>
<!-- IF {XTRA_DEMO_DOUBLE_VALUE} == '0.00' -->
<span class="text-muted">не указано</span>
<!-- ELSE -->
{XTRA_DEMO_DOUBLE_VALUE}
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- demo_select (select) -->
<!-- IF {XTRA_DEMO_SELECT} -->
<div class="mb-3">
<i class="fa-solid fa-list me-2 text-info"></i>
<strong>{XTRA_DEMO_SELECT_TITLE}:</strong>
<span class="badge bg-info text-dark">{XTRA_DEMO_SELECT}</span>
</div>
<!-- ENDIF -->
<!-- demo_radio (radio) – проверка значения внутри IF -->
<!-- IF {XTRA_DEMO_RADIO} -->
<div class="mb-3">
<i class="fa-solid fa-circle-dot me-2 text-secondary"></i>
<strong>{XTRA_DEMO_RADIO_TITLE}:</strong>
<!-- IF {XTRA_DEMO_RADIO_VALUE} == 'Yes' -->
<span class="text-success fw-bold">Да</span>
<!-- ELSE -->
<span class="text-danger fw-bold">Нет</span>
<!-- ENDIF -->
</div>
<!-- ENDIF -->
<!-- demo_datetime (datetime) -->
<!-- IF {XTRA_DEMO_DATETIME} -->
<div class="mb-3">
<i class="fa-regular fa-calendar me-2 text-danger"></i>
<strong>{XTRA_DEMO_DATETIME_TITLE}:</strong>
<span class="text-muted">
{XTRA_DEMO_DATETIME_VALUE|cot_date('d.m.Y H:i', $this)}
</span>
</div>
<!-- ENDIF -->
<!-- demo_file (file) НУЖНО УБРАТЬ ЗАЩИТУ ОТ ПРЯМОГО ДОУСТУПА ЕСЛИ ЕСТЬ -->
<!-- IF {XTRA_DEMO_FILE} -->
<div class="mb-3">
<i class="fa-solid fa-paperclip me-2"></i>
<strong>{XTRA_DEMO_FILE_TITLE}:</strong>
<a href="{PHP.cfg.mainurl}/datas/exflds/xtradbrowpage/{XTRA_DEMO_FILE}" target="_blank">
{XTRA_DEMO_FILE}
</a>
</div>
<!-- ENDIF -->
<!-- demo_country (country) -->
<!-- IF {XTRA_DEMO_COUNTRY} -->
<div class="mb-3">
<img src="images/flags/{XTRA_DEMO_COUNTRY_VALUE}.png"
style="width:24px;height:auto;" class="me-2" alt="">
<strong>{XTRA_DEMO_COUNTRY_TITLE}:</strong>
<span>{XTRA_DEMO_COUNTRY}</span>
</div>
<!-- ENDIF -->
<!-- demo_range (range) – прогресс-бар с реальным значением -->
<!-- IF {XTRA_DEMO_RANGE} -->
<div class="mb-3">
<i class="fa-solid fa-sliders me-2" style="color:#6f42c1;"></i>
<strong>{XTRA_DEMO_RANGE_TITLE}:</strong>
<div class="progress mt-1" style="height:20px;">
<div class="progress-bar bg-info" role="progressbar"
style="width:{XTRA_DEMO_RANGE_VALUE}%;"
aria-valuenow="{XTRA_DEMO_RANGE_VALUE}" aria-valuemin="0" aria-valuemax="100">
{XTRA_DEMO_RANGE_VALUE}%
</div>
</div>
</div>
<!-- ENDIF -->
<!-- demo_checklistbox (checklistbox) -->
<!-- IF {XTRA_DEMO_CHECKLISTBOX} -->
<div class="mb-3">
<i class="fa-solid fa-check-double me-2 text-primary"></i>
<strong>{XTRA_DEMO_CHECKLISTBOX_TITLE}:</strong>
<span class="text-muted">{XTRA_DEMO_CHECKLISTBOX}</span>
</div>
<!-- ENDIF -->
</div>
</div>
<!-- ENDIF -->разумеется здесь мы получаем больше пространства для кастомизации КАЖДОГО поля по своему вкусу.
10. Теги для списков страниц и лент новостей
Плагин расширяет функцию cot_generate_pagetags(), добавив соответствующие теги для каждой записи в списке. Это означает, что в любом шаблоне, использующем вывод страниц через pagetags (например, page.list.tpl, index.tpl, news.tpl), можно применять теги с префиксом {LIST_ROW_XTRA_…}.
Пример использования в списке новостей:
<!-- BEGIN: LIST_ROWS -->
<div class="news-item">
<h3>{LIST_ROW_TITLE}</h3>
<div class="meta">
{LIST_ROW_DATE}
<!-- IF {LIST_ROW_XTRA_EVENT_START} -->
| Начало: {LIST_ROW_XTRA_EVENT_START}
<!-- ENDIF -->
</div>
</div>
<!-- END: LIST_ROWS -->При отсутствии данных для конкретной страницы теги автоматически очищаются, поэтому условные конструкции <!-- IF --> работают корректно и не допускают показа пустых блоков.
11. SEO-теги и интеграция в секцию <head>
Одна из полезных возможностей плагина — вывод значений экстраполей в HTML-заголовке сайта. Это достигается благодаря хуку header.tags. В шаблоне header.tpl (или в том файле, который формирует секцию <head>) можно использовать теги вида {XTRA_HEADER_ИМЯПОЛЯ}. Например:
<meta name="description" content="{PAGE_META_DESCRIPTION}">
<!-- IF {XTRA_HEADER_EVENT_NAME} -->
<meta name="event" content="{XTRA_HEADER_EVENT_NAME}" />
<!-- ENDIF -->
<!-- IF {XTRA_HEADER_EVENT_START} -->
<meta name="event-start" content="{XTRA_HEADER_EVENT_START_VALUE}" />
<!-- ENDIF -->Эта техника позволяет, например, формировать микроразметку или передавать данные в сторонние сервисы, не затрагивая основные шаблоны контента.
12. Жизненный цикл данных: создание, обновление, удаление
Плагин прозрачно управляет данными на всех этапах работы со страницей:
- Создание страницы. При первом сохранении (обновлении) страницы плагин проверяет, существует ли запись в
cot_xtradbrowpageдля данногоpage_id. Если записи нет, она создаётся со значениями, полученными из формы (переменные с префиксомrxtra_). - Редактирование. Все изменения, внесённые в форму редактирования, подхватываются хуком
page.edit.update.done. Значения полей корректно обрабатываются: для дат применяется преобразование из пользовательского формата в системный, для чисел — фильтрация, для текстовых полей — защита от XSS. - Удаление страницы. Благодаря внешнему ключу с опцией
ON DELETE CASCADEна таблицеcot_xtradbrowpage, при удалении страницы изcot_pagesсоответствующая запись плагина удаляется автоматически. Дополнительный хукpage.edit.delete.doneвыполняет явное удаление, чтобы гарантировать чистоту даже в нештатных ситуациях.
13. Структура базы данных и внешние ключи
Базовая таблица cot_xtradbrowpage создаётся со следующей SQL-конструкцией (упрощённо):
CREATE TABLE IF NOT EXISTS `cot_xtradbrowpage` (
`itempagid` int UNSIGNED NOT NULL,
PRIMARY KEY (`itempagid`),
CONSTRAINT `fk_xtradbrowpage_pages`
FOREIGN KEY (`itempagid`) REFERENCES `cot_pages` (`page_id`)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;После добавления экстраполей таблица расширяется новыми столбцами. В рассмотренном демонстрационном наборе полей структура становится такой: event_name VARCHAR(255), event_description TEXT, event_start INT (хранение UNIX-таймстемпа), event_ticketprice DOUBLE, event_seson VARCHAR(255).
Важно отметить, что все изменения структуры выполняются автоматически через API экстраполей Cotonti. Разработчику не нужно вручную писать миграции.
14. Безопасность и права доступа
Плагин наследует систему прав Cotonti. В метаданных указаны уровни доступа:
- Гости — только чтение (R).
- Зарегистрированные пользователи — чтение и запись (RW).
- Блокировка гостей — установлена маска
12345A, что ограничивает определённые действия согласно внутренней битовой карте прав.
Все входящие данные фильтруются через cot_import_extrafields(), что предотвращает внедрение вредоносного кода. Вывод экранируется функциями htmlspecialchars() и cot_build_extrafields_data(), гарантируя безопасность от XSS-атак.
15. Расширенные сценарии использования
Благодаря наличию API плагина можно задействовать его возможности в сторонних расширениях или в собственных скриптах. Например, чтобы получить все дополнительные поля для страницы с ID = 5, достаточно вызвать:
$data = xtradbrowpage_load(5);Массив $data будет содержать значения всех экстраполей, ключами которых являются имена полей. Аналогично, для программного сохранения можно использовать функцию xtradbrowpage_save($page_id, $data), передав ассоциативный массив с новыми значениями.
Другой интересный сценарий — вывод полей в произвольном месте сайта, не привязанном к странице. Например, в боковой панели можно показать дату ближайшего события, динамически загружая данные через API.
16. Решение типичных проблем
При эксплуатации плагина могут возникнуть следующие ситуации:
- Поля не отображаются в форме редактирования. Проверьте, что в шаблоне
page.edit.tplприсутствует блокXTRA_EXTRAFLDили индивидуальные теги. Убедитесь, что экстраполя активны и не являются необязательными без значений по умолчанию (если это не требуется). - Данные не сохраняются. Возможно, файл
xtradbrowpage.page.edit.update.done.phpне загружается из-за ошибки в пути или повреждённых прав. Включите режим отладки Cotonti, чтобы увидеть предупреждения. - На странице просмотра значения пустые. Очистите системный кэш и проверьте, что запись для данной страницы действительно существует в
cot_xtradbrowpage. При необходимости можно вызвать сохранение вручную через API. - Дата отображается в неверном формате. Параметры поля
datetimeдолжны содержать правильный формат вывода (например,d.m.Y H:i). Измените их в настройках экстраполя и пересохраните страницу.
17. Заключительные рекомендации
Плагин xtradbrowpage — это продуманное и мощное дополнение для Cotonti, решающее задачу хранения расширенных свойств страниц без раздувания основной таблицы. Его интеграция с административным интерфейсом, шаблонизатором и базой данных выполнена в полном соответствии со стандартами CMS, что обеспечивает лёгкость освоения и высокую надёжность.
Для продуктивного использования достаточно выполнить три шага: установить плагин, добавить нужные экстраполя и разместить соответствующие теги в шаблонах. Вся дальнейшая работа — редактирование, отображение, удаление — происходит автоматически. Наличие API позволяет при необходимости расширять функциональность без правки ядра.
Рекомендуется сразу после инсталляции создать хотя бы одно демонстрационное поле и проверить его появление в форме и на странице, чтобы убедиться в корректности настроек хостинга и прав доступа. В дальнейшем плагин не требует внимания и работает как органичная часть вашего сайта на Cotonti.
Руководство составлено на основе официальных материалов плагина xtradbrowpage версии 2.7.8 (2026).
Отзывы к товарам 1
Тут описание плагина почитать, попутно понимаешь работу экстраполей. Еще не разобрался. желательно бы видео-урок какой-то сделать, потому, что сразу после установки плагина вообще не понятно куда тыкать и для чего. но за плагин спасибо
24.04.2026 17:26
Ответы на отзыв
1Тут перед тем, как начать работу с плагином, и что бы увидеть всю картину, как он, как инструмент, решает сотни задач, сначала нужно:
1 . хоть немного освоить работу с экстраполями;
2. После установки плагина, зашли по ссылке https://cotonti.local/admin/extrafields?n=cot_xtradbrowpage и "забили" (создали) нужны поля (примеры в дампе в репозитории).
3. прописали всё в шаблонах модуля страниц или шапки сайта - песня!
Как бонус - поля можно делать мультиязычными!!
Видео будет или нет, я не знаю, времени нет вообще. лучше пишите на форуме вопросы - там отвечу, если нужна помощь
Товар без файла для загрузки
- Доступность
- Бесплатно
Рекомендуемые статьи к товару
Локализация экстраполей в Cotonti Пошаговая инструкция на примере поля "статус товара"
Автор контента
Оффлайн
webitproff
Последняя авторизация: 18.07.2026 14:46
Чем могу помочь?
Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.
Разработки на GitHub бесплатно
Telegram
- 01.06.2026 21:40
- 01.06.2026 21:40
- Язык:
Рекомендуемые товары и услуги
Плагин "UsrAdminTools" - Инструменты администрирования пользователей
Index36 - Современная Тема сайта для Cotonti CMF
CleanCot - шаблон сайта для новичков CMF Cotonti v.0.9.26
Рекомендуемые темы форума для этого товара
Плагин “Custom Extrafields” - знакомство и поддержка плагина
Введение в экстраполя Cotonti (Кратко для понимания обсуждения)
Экстраполя в Cotonti: полное руководство по типу «Список с множественным выбором» (checklistbox)
Витрина Market PRO
CMS, Скрипт и Движок - веб сайта онлайн-витрины, интернет магазина инфопродуктов и цифровых товаров. Разные цены в разных валютах на товар. Онлайн-оплата в криптовалюте за товары и услуги.
English