Категории форума

Плагин “Custom Extrafields for Pages” - знакомство и поддержка

Введение в плагин кратко. Исходные сведения для работы с плагином. Обсуждение, вопросы, помощь и поддержка плагина пользовательских экстраполей для статей со своей собственной таблицей БД

webitproff
webitproff • 24.04.2026 08:59 #510

Что это вообще такое

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

Сразу после установки вы получаете 15 демонстрационных полей всех поддерживаемых типов – готовую шпаргалку для настройки под свои задачи.

Реальный функционал плагина (что он умеет из коробки)

  1. Создаёт отдельную таблицу cot_xtradbrowpage для хранения значений экстраполей, связанную со страницами внешним ключом.
  2. Автоматически регистрирует все созданные экстраполя в системе, и они сразу становятся доступны для редактирования через админку (раздел «Экстраполя»).
  3. Добавляет демо-набор из 15 полей при первой установке — по одному на каждый поддерживаемый тип: input, textarea, select, checkbox, radio, datetime, country, range, checklistbox, file, double, inputint и т.д.
  4. Выводит поля на странице редактирования (page.edit.tpl) простым циклом, используя блок <!-- BEGIN: XTRA_EXTRAFLD -->.
  5. Сохраняет все значения при обновлении страницы, включая правильную обработку дат, чекбоксов, чисел, файлов и строк.
  6. Корректно обрабатывает загрузку файлов:
    • Создаёт защищённую папку datas/exflds/xtradbrowpage при установке.
    • Файлы физически перемещаются в эту папку, старые автоматически удаляются при замене.
    • Предусмотрена возможность удалить загруженный файл отдельной галочкой.
  7. Отображает значения на странице просмотра (page.tpl) двумя способами:
    • Динамический вывод всех заполненных полей через <!-- BEGIN: XTRA_EXTRAFLD -->.
    • Индивидуальные теги вида {XTRA_ИМЯ_ПОЛЯ}, {XTRA_ИМЯ_ПОЛЯ_TITLE} и {XTRA_ИМЯ_ПОЛЯ_VALUE}.
  8. Добавляет тег {XTRA_EXTRAFIELD_NAME} внутрь динамического блока, позволяя задавать уникальные CSS-классы под каждое поле (например, class="extrafield-demo_date").
  9. Выводит экстраполя в списках страниц (категории, поиск, теги) через штатную функцию cot_generate_pagetags() — используются теги с префиксом PAGE_XTRA_....
  10. Поддерживает вывод в <head> для SEO – через хук header.tags формируются теги {XTRA_HEADER_ИМЯ_ПОЛЯ} (например, для вставки мета-тегов или OpenGraph).
  11. Автоматически удаляет свои данные при удалении страницы (через внешний ключ ON DELETE CASCADE) и очищает записи хука page.edit.delete.done.
  12. Полностью удаляет за собой всё при деинсталляции:
    • Удаляет саму таблицу cot_xtradbrowpage.
    • Вычищает все соответствующие записи из системной таблицы cot_extra_fields.
  13. Безопасен для префиксов таблиц: использует переменные $db_xtradbrowpage, поэтому не падает на сайтах с нестандартным префиксом БД.
  14. Устойчив к ошибкам установки: если при первой установке что-то пошло не так, достаточно очистить записи в cot_extra_fields для location cot_xtradbrowpage и переустановить плагин – он создаст все поля заново.

По сути, вы получаете полностью независимый слой для любых дополнительных данных у страниц, с удобным администрированием и готовыми примерами.

Что плагин даёт «из коробки»

После активации плагина в разделе админки «Экстраполя → cot_xtradbrowpage» вы видите 15 готовых полей. Их можно сразу наполнять при редактировании любой страницы, не дописывая ни строчки кода.
Каждое поле – это не просто пример, а реальный инструмент для определённого типа данных. Ниже – зачем нужно каждое.


Список полей и их практическое применение

  1. Название события (input)
    Обычное текстовое поле. Можно использовать для любого короткого заголовка, имени, дополнительного названия – что угодно, что должно быть выведено строкой.
  2. Описание программы события (textarea)
    Многострочный текст. Годится для развёрнутого описания, технического задания, примечаний, любой длинной информации, прикреплённой к странице.
  3. Начало события (datetime)
    Выбор даты и времени. Идеально для любых событийных страниц: дата начала акции, вебинара, публикации, крайний срок. Сохраняется в БД как timestamp, легко сортировать и выводить в нужном формате.
  4. Стоимость билета (double)
    Число с плавающей точкой. Можно вводить цену, вес, рейтинг, любой дробный показатель. В БД хранится корректно, никаких проблем с запятыми/точками.
  5. Сезон (select)
    Выпадающий список с предопределёнными значениями. Защищает от опечаток и разнобоя. Пригодится для тегов, фильтров, рубрикации.
  6. Пример целого числа (inputint)
    Целое число. Удобно для счётчиков, количества, ID, приоритетов – всего, что не должно иметь дробной части.
  7. Пример числа с плавающей точкой (double) – ещё один демо‑пример. Показывает, как можно задать два разных поля одного типа, если нужно несколько чисел.
  8. Пример выпадающего списка (select)
    Показывает, как сделать простое поле выбора без привязки к конкретной логике. Можно заменить варианты на свои и использовать для статусов, типов, любых перечислений.
  9. Пример флажка (checkbox)
    Простой «да/нет». Удобен для флагов: «показывать на главной», «премиум», «завершено» и т.п. Хранится как 1/0, легко проверять в шаблонах.
  10. Пример радиокнопок (radio)
    Выбор одного из двух‑трёх вариантов. Полезно, когда вариантов немного и важно исключить случайный выбор нескольких.
  11. Пример выбора даты и времени (datetime) – второй экземпляр. Можно использовать как «дату окончания» или «дату публикации», если у страницы несколько дат.
  12. Пример загрузки файла (file)
    Позволяет прикрепить к странице файл: PDF, ZIP, картинку. Файл сохраняется в защищённой папке, старый автоматически удаляется при замене. Идеально для документации, сертификатов, дополнительных материалов.
  13. Пример выбора страны (country)
    Выпадающий список всех стран мира. Значение хранится как двухбуквенный код. Удобно при создании страниц, привязанных к географии, для фильтрации, экспорта.
  14. Пример ползунка (range)
    Выбор числа из диапазона. Хотя в форме это выпадающий список, семантически это ползунок: быстро задать уровень, сложность, процент выполнения.
  15. Пример списка с флажками (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 должен быть установлен 

Установка 

  1. Скопировать папку плагина в /plugins/xtradbrowpage.
  2. В админке «Расширения → Плагины» нажать «Установить». 

Установочный 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;

Добавление экстраполей 

  1. В админке: «Расширения → Экстраполя».
  2. Выбрать локейшен cot_xtradbrowpage (появится после установки плагина).
  3. Создать поля нужных типов. Допустимые типы: input, textarea, select, datetime, double и любые другие, поддерживаемые ядром Cotonti. 

Пример набора полей (из дампа БД) 

Имя поляТипHTML-шаблонВарианты / ПараметрыОписание
event_nameinput<input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255">Название события 
event_descriptiontextarea<textarea class="form-control" name="{$name}" rows="{$rows}" cols="{$cols}" maxlength="255">{$value}</textarea>Описание программы события 
event_startdatetime<div class="row g-2"> ... </div> (см. дамп)2024,2030,d.m.Y H:iНачало события
event_ticketpricedouble<input class="form-control" type="text" name="{$name}" value="{$value}" maxlength="255">Стоимость билета 
event_sesonselect<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.firstxtradbrowpage.admin.extrafields.first.phpДобавляет локацию в белый список экстраполей
header.tagsxtradbrowpage.header.tags.phpНазначает теги XTRA_HEADER_* для текущей страницы
page.edit.tagsxtradbrowpage.page.edit.tags.phpВыводит поля в форме редактирования и парсит блок XTRA_EXTRAFLD
page.edit.update.donextradbrowpage.page.edit.update.done.phpСохраняет переданные значения в cot_xtradbrowpage
page.edit.delete.donextradbrowpage.page.edit.delete.done.phpЯвно удаляет запись для страницы
page.tagsxtradbrowpage.page.tags.phpНазначает теги для страницы просмотра, парсит блок XTRA_EXTRAFLD
pagetags.mainxtradbrowpage.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 очищать не требуется, но при проблемах с отображением очистите кеш в админке.
Отредактировано: webitproff (19.07.2026 00:59, 3 часа назад)
1/1/0

🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.