Экстраполя в шаблонах в модуле "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.
- Комбинированный подход для большей гибкости.
Приведенные примеры шаблонов показывают, как интегрировать дополнительные поля в форму добавления страницы, сохраняя поддержку динамического добавления новых полей без изменения кода шаблона.
ПС. HTML-код поля, который помогает избавиться от автозаполнения в Chrome
<input type="text" class="form-control" name="{$name}" value="{$value}" maxlength="255" autocomplete="off" readonly onfocus="this.removeAttribute('readonly');" />
Комментарии (0)
Автор контента

Оффлайн
webitproff
Последняя авторизация: 17.07.2025 13:20
- Страница размещена: 21.05.2025 05:01
- Последнее обновление: 14.07.2025 14:40