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

Экстраполя в Cotonti: полное руководство по типу «Список с множественным выбором» (checklistbox)

Данное руководство является продолжением серии статей о дополнительных полях (Extrafields) в Cotonti CMF. Оно подробно, шаг за шагом, описывает процесс создания, настройки и использования поля типа checklistbox – группы флажков


webitproff
webitproff • 24.04.2026 06:41 #1

Экстраполя в Cotonti: полное руководство по типу «Список с множественным выбором» (checklistbox)

Данное руководство является продолжением серии статей о дополнительных полях (Extrafields) в Cotonti CMF. Оно подробно, шаг за шагом, описывает процесс создания, настройки и использования поля типа checklistbox – группы флажков, позволяющей выбрать несколько значений одновременно. Материал рассчитан на начинающих администраторов и разработчиков, которые хотят расширить функционал своего сайта без глубокого знания PHP. Каждый шаг сопровождается реальными примерами и пояснениями, делающими инструкцию доступной даже для тех, кто впервые работает с Cotonti.

Содержание

  1. Что такое checklistbox и зачем он нужен
  2. Создание поля checklistbox в административной панели
  3. Вывод значений на сайте
  4. Как поле ведёт себя в форме редактирования
  5. Обработка ошибок и частые проблемы
  6. Заключение

1. Что такое checklistbox и зачем он нужен

Checklistbox – это тип дополнительного поля в Cotonti, который представляет собой группу флажков (чекбоксов). Пользователь может выбрать несколько вариантов одновременно. В отличие от select (одиночный выбор) или radio (одиночный выбор), checklistbox позволяет отметить любое количество пунктов. Выбранные значения сохраняются в базе данных в виде строки, где каждый выбранный ключ отделён запятой (например, новость,важно,срочно). При выводе эта строка разделяется по запятой и форматируется в соответствии с настройками или языковыми файлами.

Примеры использования checklistbox:

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

В этом руководстве мы создадим поле «Теги» для страниц (cot_pages) и пройдём полный цикл от настройки в админке до отображения на сайте.

2. Создание поля checklistbox в административной панели

Все дополнительные поля Cotonti управляются через интерфейс «Extrafields». Чтобы добавить поле для таблицы страниц, перейдите по адресу:

https://cotonti.local/ru/admin/extrafields?n=cot_pages

Подставьте вместо cotonti.local домен вашего сайта.

Вы увидите таблицу с уже существующими экстраполями (если они были добавлены ранее) и форму для создания нового поля. Начнём заполнять её для checklistbox.

2.1. Имя поля (Name)

В поле «Имя» (field_name) введите уникальный идентификатор, состоящий из латинских букв, цифр и знаков подчёркивания, без пробелов. Это имя будет использоваться в шаблонах и в программном коде. Оно должно быть понятным и отражать суть поля.

Пример: bookmarks – для поля «Теги».

Внимание: Не используйте дефисы, точки или кириллицу. Допустимы только символы [a-zA-Z0-9_].

2.2. Описание поля (Description)

В поле «Описание» (field_description) напишите текст, который будет отображаться как заголовок поля в форме редактирования страницы. Он также может использоваться в шаблонах через тег {ИМЯ_ПОЛЯ_TITLE}.

Пример: Теги.

2.3. Тип поля (Type)

Рядом с именем находится выпадающий список «Тип» (field_type). По умолчанию там выбрано input. Щёлкните по нему и выберите значение checklistbox. Как только вы это сделаете, некоторые поля формы изменят своё состояние: поле «Параметры» станет активным, а «Значения выбора» останется активным.

2.4. HTML-код поля (HTML)

Поле «HTML-код поля» (field_html) позволяет задать собственный внешний вид группы чекбоксов. Для начала оставьте его пустым – Cotonti сгенерирует стандартный HTML, который будет работать. Если вы захотите кастомизировать отображение, вы сможете вернуться к этому позже.

2.5. Значения для выбора (Variants)

Это самое важное поле для checklistbox. В поле «Значения для select, radio, checklistbox» (field_variants) вы должны перечислить все доступные варианты через запятую, без пробелов вокруг запятых. Каждый вариант – это короткий ключ (на латинице или кириллице, но латиница надёжнее), который будет сохраняться в базе данных при выборе пользователем. Порядок следования определяет порядок, в котором чекбоксы будут отображаться в форме.

Пример: важно,срочно,новость,архив

Если вы хотите, чтобы в ключах содержались пробелы, можно использовать подчёркивания: очень_важно,не_срочно. Но удобнее использовать однословные ключи.

Распространённая ошибка: добавление пробелов после запятых (важно, срочно, новость) приведёт к тому, что пробел станет частью ключа для второго и последующих вариантов. Это может вызвать путаницу при локализации или поиске. Лучше строго соблюдать формат ключ1,ключ2,ключ3.

2.6. Параметры (Params)

Для типа checklistbox поле «Параметры» (field_params) имеет особое значение. Сюда можно записать разделитель, который будет использоваться при отображении выбранных значений на сайте. По умолчанию, если оставить поле пустым, разделителем будет запятая с пробелом (, ).

Примеры разделителей:

  • , – запятая и пробел (значение по умолчанию, можно не указывать).
  • / – слэш с пробелами, если нужно перечислить через слэш.
  • ; – точка с запятой.
  • <br> – перенос строки (HTML-тег), если нужно вывести каждый элемент с новой строки.

В нашем примере оставим это поле пустым, чтобы использовался стандартный разделитель.

2.7. Значение по умолчанию (Default)

В поле «Значение по умолчанию» (field_default) можно указать ключи (из числа вариантов), которые будут выбраны автоматически при создании новой страницы. Если нужно выбрать несколько вариантов, перечислите их через запятую (без пробелов), например: новость,архив. Если поле оставить пустым, ни один чекбокс не будет отмечен по умолчанию.

Пример: новость – только «новость» будет выбрана по умолчанию.

2.8. Остальные настройки

  • Парсинг (field_parse) – для checklistbox обычно не критичен. Оставьте значение «По умолчанию» (HTML).
  • Обязательное (field_required) – если поставить галочку, пользователь должен будет выбрать хотя бы один флажок. Для нашего примера не обязательно.
  • Включено (field_enabled) – должно быть включено (галочка стоит). Иначе поле не будет отображаться.

После заполнения всех полей нажмите кнопку «Добавить». Если всё введено корректно, страница перезагрузится и новое поле появится в списке. Поздравляем – вы создали поле типа checklistbox!

3. Вывод значений на сайте

Теперь, когда поле создано и работает в форме редактирования, его нужно вывести в шаблонах, чтобы посетители видели выбранные теги. Cotonti предоставляет несколько способов вывода: индивидуальные теги (как у обычных полей) и динамический блок EXTRAFLD. Рассмотрим оба подхода.

3.1. Индивидуальный вывод через теги шаблона

Как и для других типов полей, Cotonti автоматически создаёт переменные для шаблонизатора на основе имени поля. Для модуля Pages используется префикс PAGE_. Таким образом, для поля с именем bookmarks становятся доступны теги:

  • {PAGE_BOOKMARKS} – форматированное значение (строка с выбранными ключами, разделёнными согласно параметрам или запятыми).
  • {PAGE_BOOKMARKS_TITLE} – описание поля (заголовок).
  • {PAGE_BOOKMARKS_VALUE} – сырое значение, как оно хранится в базе (например, важно,срочно).

Эти теги можно разместить в любом месте шаблона page.tpl (или page.articles.tpl, если вы используете отдельный шаблон для статей).

Пример добавления в page.tpl:

<div class="page-bookmarks">
    <strong>{PAGE_BOOKMARKS_TITLE}:</strong> {PAGE_BOOKMARKS}
</div>

На выходе, если для страницы были выбраны теги «важно» и «срочно», вы увидите:

Теги: важно, срочно

Если вы хотите отобразить каждый тег отдельно (например, в виде списка или с переносом строки), можно использовать сырое значение {PAGE_BOOKMARKS_VALUE} и манипулировать им в шаблоне с помощью дополнительных модификаторов. Например, для Cotonti доступен модификатор |explode(','), но его использование требует осторожности. В простейшем случае можно обойтись стандартным выводом.

3.2. Локализация (перевод) значений

По умолчанию в {PAGE_BOOKMARKS} будут показаны ключи (например, важно,срочно). Если вы хотите отобразить человекочитаемые названия (например, «Важное», «Срочное»), необходимо добавить соответствующие языковые строки. Cotonti ищет перевод для каждого значения по шаблону: имя_поля_ключ (без префикса page_).

Для нашего поля bookmarks и значения важно нужно создать строку:

$L['bookmarks_важно'] = 'Важное';

Обратите внимание: ключ языковой переменной не содержит префикса page_. Именно так функция cot_build_extrafields_data() ищет перевод для значений select, radio и checklistbox. Если вы ошибочно напишете $L['page_bookmarks_важно'], перевод не сработает.

Добавьте следующие строки в языковой файл вашей темы или плагина (например, themes/mytheme/lang/theme.ru.lang.php):

$L['bookmarks_важно'] = 'Важное';
$L['bookmarks_срочно'] = 'Срочное';
$L['bookmarks_новость'] = 'Новость';
$L['bookmarks_архив'] = 'Архивное';

После добавления этих строк и очистки кеша в шаблоне вместо важно, срочно вы увидите Важное, Срочное.

Примечание для продвинутых: вы можете использовать в ключах кириллицу, но это может вызвать сложности при использовании в URL или API. Рекомендуется использовать латиницу для ключей (например, important,urgent) и переводить их через языковые строки. Это обеспечит совместимость с разными языковыми версиями сайта.

3.3. Динамический вывод всех полей через блок EXTRAFLD

Индивидуальный вывод удобен, когда вы знаете все поля и их расположение. Но если экстраполей много или вы хотите вывести их единообразно, можно воспользоваться динамическим подходом. Для этого в Cotonti предусмотрен блок , который парсится в цикле для каждого активного экстраполя. Однако в стандартном модуле Pages такой цикл для страницы просмотра не реализован – он есть только для формы редактирования. Если вы хотите динамический вывод на странице просмотра, вам потребуется либо использовать плагин/кастомный хук, либо написать небольшой код.

Тем не менее, мы покажем, как это обычно делается в плагинах. Допустим, вы подключаетесь к хуку page.main и добавляете в объект шаблона $t вывод полей:

// Пример для page.main или аналогичного хука
if (!empty(Cot::$extrafields[Cot::$db->pages])) {
    foreach (Cot::$extrafields[Cot::$db->pages] as $exfld) {
        $tag = strtoupper($exfld['field_name']);
        $value = $pag['page_' . $exfld['field_name']] ?? null;
        $t->assign([
            'EXTRAFIELD_TITLE' => cot_extrafield_title($exfld, 'page_'),
            'EXTRAFIELD_VALUE' => cot_build_extrafields_data('page', $exfld, $value, $pag['page_parser'])
        ]);
        $t->parse('MAIN.EXTRAFLD');
    }
}

В шаблоне page.tpl необходимо разместить блок:

<!-- BEGIN: EXTRAFLD -->
<div class="extrafield">
    <strong>{EXTRAFIELD_TITLE}:</strong>
    <span>{EXTRAFIELD_VALUE}</span>
</div>
<!-- END: EXTRAFLD -->

Тогда все экстраполя, включая наш checklistbox, будут выведены автоматически друг за другом, каждое с заголовком и отформатированным значением.

3.4. Вывод в списке страниц

Когда страницы выводятся списком (например, при просмотре категории), Cotonti использует префикс LIST_ROW_. Таким образом, для поля bookmarks будут доступны теги:

  • {LIST_ROW_BOOKMARKS}
  • {LIST_ROW_BOOKMARKS_TITLE}
  • {LIST_ROW_BOOKMARKS_VALUE}

Их можно разместить внутри цикла <!-- BEGIN: LIST_ROW --> в шаблоне page.list.tpl:

<div class="bookmarks">
    <strong>{LIST_ROW_BOOKMARKS_TITLE}:</strong> {LIST_ROW_BOOKMARKS}
</div>

Результат будет аналогичен просмотру отдельной страницы.

4. Как поле ведёт себя в форме редактирования

После создания поля оно автоматически появляется в форме добавления/редактирования страницы. В файле modules/page/inc/page.edit.php (и аналогичных для других модулей) существует цикл, который для каждого активного экстраполя вызывает cot_build_extrafields() и присваивает результаты шаблонным переменным. Для checklistbox это будет выглядеть как группа флажков с подписями, соответствующими вариантам из «Значений выбора». Если вы указали переводы для ключей в языковом файле, они не будут автоматически применены к подписям в форме редактирования – там всегда отображаются сырые ключи. Чтобы локализовать подписи в форме, требуется дополнительная кастомизация через хуки, что выходит за рамки базового руководства.

Тем не менее, в форме редактирования вы можете выбирать несколько флажков, и при сохранении их значения будут объединены в строку через запятую и записаны в соответствующую колонку таблицы (page_bookmarks). Затем при чтении эта строка будет обработана функцией cot_build_extrafields_data(), которая разделит её по запятой и для каждого элемента найдёт перевод, если он есть.

5. Обработка ошибок и частые проблемы

  • Поле не появляется в форме редактирования: проверьте, что флажок «Включено» для поля установлен, и очистите кеш.
  • В шаблоне вместо перевода отображаются ключи: вы не добавили языковые строки или ошиблись в их имени. Убедитесь, что ключ имеет вид $L['имя_поля_ключ'] (например, $L['bookmarks_важно']), а не с префиксом таблицы.
  • Значения выводятся слитно, без разделителей: проверьте поле «Параметры» при настройке поля. Если оно пустое, используется запятая с пробелом. Если вы указали пустую строку, разделителя не будет.
  • При сохранении страницы возникает ошибка SQL: возможно, поле не было создано в базе данных (колонка не добавилась). Проверьте структуру таблицы cot_pages через phpMyAdmin – там должна быть колонка page_bookmarks (с префиксом page_). Если её нет, выполните вручную: ALTER TABLE cot_pages ADD page_bookmarks TEXT;. После этого обновите страницу Extrafields и пересохраните поле.
  • В админке поле не сохраняет выбранные значения: такое бывает при конфликте имён или из-за кеширования. Очистите кеш и попробуйте снова.

6. Заключение

Теперь вы умеете создавать, настраивать и выводить на сайте экстраполе типа «список с множественным выбором» (checklistbox). Вы узнали, как добавлять варианты, настраивать разделитель, локализовывать значения и использовать их в шаблонах как индивидуально, так и через динамический блок. Следуя этому руководству применительно к другим типам полей, вы сможете значительно расширить возможности вашего Cotonti-сайта, не прибегая к сложному программированию.

Успехов в развитии вашего проекта!

Отредактировано: Administrator (05.07.2026 18:19, 1 неделя назад)
1/1/0

🗿

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