Экстраполя в шаблонах в модуле "Page" Cotonti

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

Теги:
Опубликовано в: Главная Articles

В коде 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');
    }
}

 

Этот код:

  1. Проверяет, есть ли дополнительные поля для таблицы страниц (Cot::$extrafields[Cot::$db->pages]).
  2. Для каждого дополнительного поля:
    • Формирует имя поля в верхнем регистре ($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).

Основные теги, доступные в шаблоне:

  1. PAGEADD_FORM_{FIELD_NAME} — HTML-код поля ввода для конкретного дополнительного поля (где {FIELD_NAME} — имя поля в верхнем регистре).
  2. PAGEADD_FORM_{FIELD_NAME}_TITLE — Заголовок (название) дополнительного поля.
  3. PAGEADD_FORM_EXTRAFLD — HTML-код текущего поля ввода (для использования в цикле).
  4. 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} -->

Важные замечания

  1. Имена полей в верхнем регистре: В шаблоне имена дополнительных полей используются в верхнем регистре (например, PAGEADD_FORM_COLOR для поля color).
  2. Гибкость шаблона: Использование блока MAIN.EXTRAFLD позволяет автоматически обрабатывать любое количество дополнительных полей без необходимости изменять шаблон при добавлении новых полей.
  3. Типы полей: Функция cot_build_extrafields автоматически генерирует правильный HTML-код в зависимости от типа дополнительного поля (текстовое поле, выпадающий список, чекбокс и т.д.).
  4. Локализация заголовков: Заголовки полей (PAGEADD_FORM_{FIELD_NAME}_TITLE) берутся из настроек дополнительных полей, где можно указать локализованные названия.

Как проверить дополнительные поля

Чтобы узнать, какие дополнительные поля доступны:

  1. Проверьте настройки Cotonti в админ-панели (раздел "Structure" → "Pages" → "Extra fields").
  2. Каждое поле будет иметь имя (например, color, priority), которое в шаблоне преобразуется в PAGEADD_FORM_COLOR, PAGEADD_FORM_PRIORITY и т.д.

Итог

Код обработки дополнительных полей в Cotonti позволяет гибко отображать их в шаблонах через:

  • Циклический вывод всех полей с использованием блока MAIN.EXTRAFLD.
  • Индивидуальный вывод конкретных полей с использованием тегов PAGEADD_FORM_{FIELD_NAME} и PAGEADD_FORM_{FIELD_NAME}_TITLE.
  • Комбинированный подход для большей гибкости.

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

 

 

 

 

 

Administrator

Оффлайн

Administrator

Последняя авторизация: 13.06.2025 10:55

  • 07.06.2025 07:02
  • 12.06.2025 21:28