Что это вообще такое
Плагин добавляет к каждой странице модуля page свой собственный набор экстраполей, которые хранятся в отдельной таблице, а не в общей таблице страниц. Это позволяет не засорять стандартные поля и добавлять любые типы данных (числа, файлы, даты, чекбоксы и т.п.) именно к тем страницам, где они нужны.
Сразу после установки вы получаете 15 демонстрационных полей всех поддерживаемых типов – готовую шпаргалку для настройки под свои задачи.
Реальный функционал плагина (что он умеет из коробки)
- Создаёт отдельную таблицу
cot_xtradbrowpageдля хранения значений экстраполей, связанную со страницами внешним ключом. - Автоматически регистрирует все созданные экстраполя в системе, и они сразу становятся доступны для редактирования через админку (раздел «Экстраполя»).
- Добавляет демо-набор из 15 полей при первой установке — по одному на каждый поддерживаемый тип: input, textarea, select, checkbox, radio, datetime, country, range, checklistbox, file, double, inputint и т.д.
- Выводит поля на странице редактирования (
page.edit.tpl) простым циклом, используя блок<!-- BEGIN: XTRA_EXTRAFLD -->. - Сохраняет все значения при обновлении страницы, включая правильную обработку дат, чекбоксов, чисел, файлов и строк.
- Корректно обрабатывает загрузку файлов:
- Создаёт защищённую папку
datas/exflds/xtradbrowpageпри установке. - Файлы физически перемещаются в эту папку, старые автоматически удаляются при замене.
- Предусмотрена возможность удалить загруженный файл отдельной галочкой.
- Создаёт защищённую папку
- Отображает значения на странице просмотра (
page.tpl) двумя способами:- Динамический вывод всех заполненных полей через
<!-- BEGIN: XTRA_EXTRAFLD -->. - Индивидуальные теги вида
{XTRA_ИМЯ_ПОЛЯ},{XTRA_ИМЯ_ПОЛЯ_TITLE}и{XTRA_ИМЯ_ПОЛЯ_VALUE}.
- Динамический вывод всех заполненных полей через
- Добавляет тег
{XTRA_EXTRAFIELD_NAME}внутрь динамического блока, позволяя задавать уникальные CSS-классы под каждое поле (например,class="extrafield-demo_date"). - Выводит экстраполя в списках страниц (категории, поиск, теги) через штатную функцию
cot_generate_pagetags()— используются теги с префиксомPAGE_XTRA_.... - Поддерживает вывод в
<head>для SEO – через хукheader.tagsформируются теги{XTRA_HEADER_ИМЯ_ПОЛЯ}(например, для вставки мета-тегов или OpenGraph). - Автоматически удаляет свои данные при удалении страницы (через внешний ключ
ON DELETE CASCADE) и очищает записи хукаpage.edit.delete.done. - Полностью удаляет за собой всё при деинсталляции:
- Удаляет саму таблицу
cot_xtradbrowpage. - Вычищает все соответствующие записи из системной таблицы
cot_extra_fields.
- Удаляет саму таблицу
- Безопасен для префиксов таблиц: использует переменные
$db_xtradbrowpage, поэтому не падает на сайтах с нестандартным префиксом БД. - Устойчив к ошибкам установки: если при первой установке что-то пошло не так, достаточно очистить записи в
cot_extra_fieldsдля locationcot_xtradbrowpageи переустановить плагин – он создаст все поля заново.
По сути, вы получаете полностью независимый слой для любых дополнительных данных у страниц, с удобным администрированием и готовыми примерами.
Что плагин даёт «из коробки»
После активации плагина в разделе админки «Экстраполя → cot_xtradbrowpage» вы видите 15 готовых полей. Их можно сразу наполнять при редактировании любой страницы, не дописывая ни строчки кода.
Каждое поле – это не просто пример, а реальный инструмент для определённого типа данных. Ниже – зачем нужно каждое.
Список полей и их практическое применение
- Название события (input)
Обычное текстовое поле. Можно использовать для любого короткого заголовка, имени, дополнительного названия – что угодно, что должно быть выведено строкой. - Описание программы события (textarea)
Многострочный текст. Годится для развёрнутого описания, технического задания, примечаний, любой длинной информации, прикреплённой к странице. - Начало события (datetime)
Выбор даты и времени. Идеально для любых событийных страниц: дата начала акции, вебинара, публикации, крайний срок. Сохраняется в БД как timestamp, легко сортировать и выводить в нужном формате. - Стоимость билета (double)
Число с плавающей точкой. Можно вводить цену, вес, рейтинг, любой дробный показатель. В БД хранится корректно, никаких проблем с запятыми/точками. - Сезон (select)
Выпадающий список с предопределёнными значениями. Защищает от опечаток и разнобоя. Пригодится для тегов, фильтров, рубрикации. - Пример целого числа (inputint)
Целое число. Удобно для счётчиков, количества, ID, приоритетов – всего, что не должно иметь дробной части. - Пример числа с плавающей точкой (double) – ещё один демо‑пример. Показывает, как можно задать два разных поля одного типа, если нужно несколько чисел.
- Пример выпадающего списка (select)
Показывает, как сделать простое поле выбора без привязки к конкретной логике. Можно заменить варианты на свои и использовать для статусов, типов, любых перечислений. - Пример флажка (checkbox)
Простой «да/нет». Удобен для флагов: «показывать на главной», «премиум», «завершено» и т.п. Хранится как 1/0, легко проверять в шаблонах. - Пример радиокнопок (radio)
Выбор одного из двух‑трёх вариантов. Полезно, когда вариантов немного и важно исключить случайный выбор нескольких. - Пример выбора даты и времени (datetime) – второй экземпляр. Можно использовать как «дату окончания» или «дату публикации», если у страницы несколько дат.
- Пример загрузки файла (file)
Позволяет прикрепить к странице файл: PDF, ZIP, картинку. Файл сохраняется в защищённой папке, старый автоматически удаляется при замене. Идеально для документации, сертификатов, дополнительных материалов. - Пример выбора страны (country)
Выпадающий список всех стран мира. Значение хранится как двухбуквенный код. Удобно при создании страниц, привязанных к географии, для фильтрации, экспорта. - Пример ползунка (range)
Выбор числа из диапазона. Хотя в форме это выпадающий список, семантически это ползунок: быстро задать уровень, сложность, процент выполнения. - Пример списка с флажками (checklistbox)
Множественный выбор из нескольких опций. Очень удобно для тегов, категорий, отметок – можно выбрать сразу несколько значений, сохраняются строкой через запятую.
Как это меняет жизнь
- Раньше: чтобы добавить к странице дату события или файл, приходилось либо использовать общие экстраполя в таблице
pages, которые выводились у всех страниц, либо городить отдельные поля в БД, править PHP и шаблоны. - Теперь: вы просто выбираете нужный тип поля в админке, настраиваете пару параметров – и оно появляется в форме редактирования и на странице без программирования.
Все 15 полей служат одновременно и шпаргалкой, и фундаментом – их можно сразу применять и подгонять под конкретную задачу, просто меняя названия и варианты.
Плагин снимает ограничения стандартных экстраполей и даёт плацдарм для любых дополнительных данных, которые должны принадлежать конкретной странице, не засоряя общие таблицы и не требуя вмешательства в код.
Что делает плагин
- Добавляет отдельную таблицу
cot_xtradbrowpageдля хранения экстраполей страниц. Каждая запись привязана к странице черезitempagid = page_idс каскадным удалением. - Регистрирует локацию
cot_xtradbrowpageв админке «Расширения → Экстраполя». - При редактировании страницы автоматически выводит все активные экстраполя этой локации (форма с префиксом
rxtra_, теги{PAGEEDIT_FORM_XTRA_ИМЯПОЛЯ}). Сохраняет их при обновлении страницы. - На странице просмотра предоставляет теги
{XTRA_ИМЯПОЛЯ},{XTRA_ИМЯПОЛЯ_TITLE},{XTRA_ИМЯПОЛЯ_VALUE}, а также блок<!-- BEGIN: XTRA_EXTRAFLD -->для перебора всех полей. - В списках страниц (через
cot_generate_pagetags()) доступны теги с префиксом{LIST_ROW_XTRA_...}. - В
<head>(хукheader.tags) можно использовать{XTRA_HEADER_ИМЯПОЛЯ}. - При удалении страницы запись из
cot_xtradbrowpageудаляется каскадно или явно (хукpage.edit.delete.done). - Предоставляет три API-функции для ручной работы.
Требования
- Cotonti 0.9.26+
- PHP 8.4+
- Модуль page должен быть установлен
Установка
- Скопировать папку плагина в
/plugins/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;Добавление экстраполей
- В админке: «Расширения → Экстраполя».
- Выбрать локейшен
cot_xtradbrowpage(появится после установки плагина). - Создать поля нужных типов. Допустимые типы:
input,textarea,select,datetime,doubleи любые другие, поддерживаемые ядром Cotonti.
Пример набора полей (из дампа БД)
| Имя поля | Тип | HTML-шаблон | Варианты / Параметры | Описание |
| event_name | input | <input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255"> | Название события | |
| event_description | textarea | <textarea class="form-control" name="{$name}" rows="{$rows}" cols="{$cols}" maxlength="255">{$value}</textarea> | Описание программы события | |
| event_start | datetime | <div class="row g-2"> ... </div> (см. дамп) | 2024,2030,d.m.Y H:i | Начало события |
| event_ticketprice | double | <input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255"> | Стоимость билета | |
| event_seson | select | <select class="form-select" name="{$name}">{$options}</select> | unknown,winter,summer,autumn,spring | Сезон |
Шаблоны и теги
1. Форма редактирования (page.edit.tpl)
Блок для автоматического вывода всех полей:
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="form-group">
<label>{PAGEEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->Индивидуальные поля (пример для event_name):
<div class="mb-3">
<label>{PAGEEDIT_FORM_XTRA_EVENT_NAME_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EVENT_NAME}
</div>2. Страница просмотра (page.tpl)
Блок для всех полей:
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="extrafield">
<strong>{XTRA_EXTRAFIELD_TITLE}:</strong>
<span>{XTRA_EXTRAFIELD_VALUE}</span>
</div>
<!-- END: XTRA_EXTRAFLD -->Индивидуальное поле:
<!-- IF {XTRA_EVENT_START} -->
<p>{XTRA_EVENT_START_TITLE}: {XTRA_EVENT_START}</p>
<!-- ENDIF -->Значения форматируются согласно типу поля (datetime будет отформатирован в d.m.Y H:i).
3. Списки страниц (page.list.tpl, news.tpl и т.д.)
Используются теги {LIST_ROW_XTRA_ИМЯПОЛЯ}, например:
<!-- IF {LIST_ROW_XTRA_EVENT_NAME} -->
<small>{LIST_ROW_XTRA_EVENT_NAME_TITLE}: {LIST_ROW_XTRA_EVENT_NAME}</small>
<!-- ENDIF -->Эти теги добавляются через хук pagetags.main внутри функции cot_generate_pagetags().
4. Секция <head> (header.tpl)
<!-- IF {XTRA_HEADER_EVENT_NAME} -->
<meta name="event" content="{XTRA_HEADER_EVENT_NAME}">
<!-- ENDIF -->API для разработчиков
Функции находятся в /plugins/xtradbrowpage/inc/xtradbrowpage.functions.php.
Получение всех зарегистрированных полей
$fields = xtradbrowpage_getExtrafields(); // массив из Cot::$extrafields['cot_xtradbrowpage']Загрузка записи для страницы
$data = xtradbrowpage_load($page_id); // возвращает ассоциативный массив с ключами field_nameСохранение (INSERT или UPDATE)
$values = [
'event_name' => 'Новое событие',
'event_start' => 1715011200, // UNIX timestamp
'event_ticketprice' => 100.50
];
xtradbrowpage_save($page_id, $values);Хуки плагина и их назначение
| Хук | Файл | Действие |
| admin.extrafields.first | xtradbrowpage.admin.extrafields.first.php | Добавляет локацию в белый список экстраполей |
| header.tags | xtradbrowpage.header.tags.php | Назначает теги XTRA_HEADER_* для текущей страницы |
| page.edit.tags | xtradbrowpage.page.edit.tags.php | Выводит поля в форме редактирования и парсит блок XTRA_EXTRAFLD |
| page.edit.update.done | xtradbrowpage.page.edit.update.done.php | Сохраняет переданные значения в cot_xtradbrowpage |
| page.edit.delete.done | xtradbrowpage.page.edit.delete.done.php | Явно удаляет запись для страницы |
| page.tags | xtradbrowpage.page.tags.php | Назначает теги для страницы просмотра, парсит блок XTRA_EXTRAFLD |
| pagetags.main | xtradbrowpage.pagetags.php | Добавляет в $temp_array теги LIST_ROW_XTRA_* |
Практический пример: создание событий
1. Добавление полей
Создайте через админку поля: event_name, event_description, event_start, event_ticketprice, event_seson с параметрами, как в таблице выше.
2. Шаблон редактирования
<!-- В page.edit.tpl -->
<div class="card mt-3">
<div class="card-header">Параметры события</div>
<div class="card-body">
<!-- BEGIN: XTRA_EXTRAFLD -->
<div class="mb-3">
<label class="form-label">{PAGEEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
{PAGEEDIT_FORM_XTRA_EXTRAFLD}
</div>
<!-- END: XTRA_EXTRAFLD -->
</div>
</div>3. Шаблон просмотра
<!-- В page.tpl -->
<!-- IF {XTRA_EVENT_NAME} -->
<div class="event-details">
<h2>{XTRA_EVENT_NAME}</h2>
<!-- BEGIN: XTRA_EXTRAFLD -->
<p><strong>{XTRA_EXTRAFIELD_TITLE}:</strong> {XTRA_EXTRAFIELD_VALUE}</p>
<!-- END: XTRA_EXTRAFLD -->
</div>
<!-- ENDIF -->4. Вывод в списке
<!-- В page.list.tpl внутри блока LIST_ROWS -->
<div class="list-item">
<a href="{LIST_ROW_URL}">{LIST_ROW_TITLE}</a>
<!-- IF {LIST_ROW_XTRA_EVENT_START} -->
<span class="date">{LIST_ROW_XTRA_EVENT_START}</span>
<!-- ENDIF -->
</div>Особенности работы с типами полей
- datetime: хранится как int (UNIX timestamp). В форме редактирования предоставляются выпадающие списки. На вывод форматируется согласно параметру
field_params(например,d.m.Y H:i). - select: в
field_variantsзначения через запятую; выбранное сохраняется как строка. - double: сохраняется как число с плавающей точкой.
- Все поля экранируются при выводе через
cot_build_extrafields_data()иhtmlspecialchars().
Примечания
- Плагин не добавляет колонки в таблицу
cot_pages. - Если страница создаётся без немедленного сохранения экстраполей, запись в
cot_xtradbrowpageпоявится при первом обновлении страницы через форму редактирования. - Для массовой вставки данных используйте API-функцию
xtradbrowpage_save(). - Кеш Cotonti очищать не требуется, но при проблемах с отображением очистите кеш в админке.
