Экстраполя в шаблонах в модуле "Page" Cotonti
Приведенные примеры шаблонов показывают, как интегрировать дополнительные поля в форму добавления страницы, сохраняя поддержку динамического добавления новых полей
В коде Cotonti в модуле "Page" для добавления страницы есть участок, который обрабатывает дополнительные поля (extrafields) для страниц. Этот код отвечает за генерацию HTML-разметки для дополнительных полей в форме добавления страницы и их отображение в шаблоне. Давайте разберем, как этот код используется в шаблонах, и приведем примеры.
Разбор кода для дополнительных полей
if (!empty(Cot::$extrafields[Cot::$db->pages])) { foreach (Cot::$extrafields[Cot::$db->pages] as $exfld) { $uname = strtoupper($exfld['field_name']); $data = isset($rpage['page_' . $exfld['field_name']]) ? $rpage['page_' . $exfld['field_name']] : null; $exfld_val = cot_build_extrafields('rpage' . $exfld['field_name'], $exfld, $data); $exfld_title = cot_extrafield_title($exfld, 'page_'); $t->assign([ 'PAGEADD_FORM_' . $uname => $exfld_val, 'PAGEADD_FORM_' . $uname . '_TITLE' => $exfld_title, 'PAGEADD_FORM_EXTRAFLD' => $exfld_val, 'PAGEADD_FORM_EXTRAFLD_TITLE' => $exfld_title, ]); $t->parse('MAIN.EXTRAFLD'); } }
Этот код:
- Проверяет, есть ли дополнительные поля для таблицы страниц
(Cot::$extrafields[Cot::$db->pages])
. - Для каждого дополнительного поля:
- Формирует имя поля в верхнем регистре ($uname).
- Получает значение поля из массива
$rpage
(если оно существует). - Использует функцию cot_build_extrafields для создания HTML-кода поля ввода (например, текстовое поле, выпадающий список и т.д.).
- Формирует заголовок поля с помощью cot_extrafield_title.
- Назначает теги для шаблона с префиксами
PAGEADD_FORM_
для конкретного поля и общие тегиPAGEADD_FORM_EXTRAFLD
,PAGEADD_FORM_EXTRAFLD_TITLE
. - Вызывает
$t->parse('MAIN.EXTRAFLD')
для обработки блокаMAIN.EXTRAFLD
в шаблоне.
Использование в шаблонах
В Cotonti шаблоны используют XTemplate, где теги, назначенные в коде через $t->assign, доступны для отображения. Для дополнительных полей в форме добавления страницы обычно используется файл шаблона, например, page.add.tpl (или кастомный шаблон, указанный в $mskin).
Основные теги, доступные в шаблоне:
- PAGEADD_FORM_{FIELD_NAME} — HTML-код поля ввода для конкретного дополнительного поля (где {FIELD_NAME} — имя поля в верхнем регистре).
- PAGEADD_FORM_{FIELD_NAME}_TITLE — Заголовок (название) дополнительного поля.
- PAGEADD_FORM_EXTRAFLD — HTML-код текущего поля ввода (для использования в цикле).
- PAGEADD_FORM_EXTRAFLD_TITLE — Заголовок текущего поля (для использования в цикле).
Блок MAIN.EXTRAFLD используется для циклического вывода всех дополнительных полей.
Пример шаблона (page.add.tpl)
Пример 1: Вывод всех дополнительных полей в цикле
Предположим, у вас есть два дополнительных поля: color (цвет) и priority (приоритет). В шаблоне можно организовать вывод всех дополнительных полей через блок MAIN.EXTRAFLD:
<!-- BEGIN: MAIN --> <form name="addpage" action="{PAGEADD_FORM_SEND}" method="post"> <h2>{PAGEADD_PAGETITLE}</h2> <div>{PAGEADD_BREADCRUMBS}</div> <div>{PAGEADD_SUBTITLE}</div> <!-- Основные поля формы --> <div> <label>{PHP.L.Category}</label> {PAGEADD_FORM_CAT} </div> <div> <label>{PHP.L.Title}</label> {PAGEADD_FORM_TITLE} </div> <div> <label>{PHP.L.Description}</label> {PAGEADD_FORM_DESCRIPTION} </div> <div> <label>{PHP.L.Text}</label> {PAGEADD_FORM_TEXT} </div> <!-- Дополнительные поля --> <!-- BEGIN: EXTRAFLD --> <div> <label>{PAGEADD_FORM_EXTRAFLD_TITLE}</label> {PAGEADD_FORM_EXTRAFLD} </div> <!-- END: EXTRAFLD --> <div> <button type="submit">{PHP.L.Submit}</button> </div> </form> <!-- END: MAIN -->
Результат:
- Для каждого дополнительного поля (например, color и priority) будет сгенерирован блок <div> с заголовком поля (PAGEADD_FORM_EXTRAFLD_TITLE) и его HTML-кодом (PAGEADD_FORM_EXTRAFLD).
- Если поля color и priority — это, например, текстовое поле и выпадающий список, они будут отображены соответствующим образом.
Пример 2: Вывод конкретного дополнительного поля
Если вы хотите вывести только одно конкретное поле, например color, можно использовать тег PAGEADD_FORM_COLOR:
<!-- BEGIN: MAIN --> <form name="addpage" action="{PAGEADD_FORM_SEND}" method="post"> <h2>{PAGEADD_PAGETITLE}</h2> <div>{PAGEADD_BREADCRUMBS}</div> <div>{PAGEADD_SUBTITLE}</div> <!-- Основные поля формы --> <div> <label>{PHP.L.Category}</label> {PAGEADD_FORM_CAT} </div> <div> <label>{PHP.L.Title}</label> {PAGEADD_FORM_TITLE} </div> <!-- Конкретное дополнительное поле --> <div> <label>{PAGEADD_FORM_COLOR_TITLE}</label> {PAGEADD_FORM_COLOR} </div> <div> <button type="submit">{PHP.L.Submit}</button> </div> </form> <!-- END: MAIN -->
Результат:
- В форме будет отображено только поле color с его заголовком (например, "Цвет") и соответствующим HTML-элементом (например, <input type="text" name="rpcolor" ...>).
Пример 3: Комбинированный подход
Если вы хотите вывести одно конкретное поле явно, а остальные в цикле, можно сделать так:
<!-- BEGIN: MAIN --> <form name="addpage" action="{PAGEADD_FORM_SEND}" method="post"> <h2>{PAGEADD_PAGETITLE}</h2> <div>{PAGEADD_BREADCRUMBS}</div> <div>{PAGEADD_SUBTITLE}</div> <!-- Основные поля формы --> <div> <label>{PHP.L.Category}</label> {PAGEADD_FORM_CAT} </div> <div> <label>{PHP.L.Title}</label> {PAGEADD_FORM_TITLE} </div> <!-- Конкретное дополнительное поле --> <div> <label>{PAGEADD_FORM_COLOR_TITLE}</label> {PAGEADD_FORM_COLOR} </div> <!-- Остальные дополнительные поля --> <!-- BEGIN: EXTRAFLD --> <!-- IF {PAGEADD_FORM_EXTRAFLD_TITLE} != {PAGEADD_FORM_COLOR_TITLE} --> <div> <label>{PAGEADD_FORM_EXTRAFLD_TITLE}</label> {PAGEADD_FORM_EXTRAFLD} </div> <!-- ENDIF --> <!-- END: EXTRAFLD --> <div> <button type="submit">{PHP.L.Submit}</button> </div> </form> <!-- END: MAIN -->
Результат:
- Поле color будет выведено отдельно с использованием тегов PAGEADD_FORM_COLOR и PAGEADD_FORM_COLOR_TITLE.
Все остальные дополнительные поля (например, priority) будут выведены в цикле через блок MAIN.EXTRAFLD, но поле color будет исключено из цикла благодаря условию
<!-- IF {PAGEADD_FORM_EXTRAFLD_TITLE} != {PAGEADD_FORM_COLOR_TITLE} -->
Важные замечания
- Имена полей в верхнем регистре: В шаблоне имена дополнительных полей используются в верхнем регистре (например, PAGEADD_FORM_COLOR для поля color).
- Гибкость шаблона: Использование блока MAIN.EXTRAFLD позволяет автоматически обрабатывать любое количество дополнительных полей без необходимости изменять шаблон при добавлении новых полей.
- Типы полей: Функция cot_build_extrafields автоматически генерирует правильный HTML-код в зависимости от типа дополнительного поля (текстовое поле, выпадающий список, чекбокс и т.д.).
- Локализация заголовков: Заголовки полей (PAGEADD_FORM_{FIELD_NAME}_TITLE) берутся из настроек дополнительных полей, где можно указать локализованные названия.
Как проверить дополнительные поля
Чтобы узнать, какие дополнительные поля доступны:
- Проверьте настройки Cotonti в админ-панели (раздел "Structure" → "Pages" → "Extra fields").
- Каждое поле будет иметь имя (например, color, priority), которое в шаблоне преобразуется в PAGEADD_FORM_COLOR, PAGEADD_FORM_PRIORITY и т.д.
Итог
Код обработки дополнительных полей в Cotonti позволяет гибко отображать их в шаблонах через:
- Циклический вывод всех полей с использованием блока MAIN.EXTRAFLD.
- Индивидуальный вывод конкретных полей с использованием тегов PAGEADD_FORM_{FIELD_NAME} и PAGEADD_FORM_{FIELD_NAME}_TITLE.
- Комбинированный подход для большей гибкости.
Приведенные примеры шаблонов показывают, как интегрировать дополнительные поля в форму добавления страницы, сохраняя поддержку динамического добавления новых полей без изменения кода шаблона.

Оффлайн
Administrator
Последняя авторизация: 13.06.2025 10:55
- 07.06.2025 07:02
- 12.06.2025 21:28