Pages, Articles & News
Tools & Plugins
Example / Placeholder Title


Description as an example placeholder. Sample text content for further customization of the "Index36" template.

You are free to edit and customize the template however you like. If you don’t have time or enough knowledge — you can always order template adaptation by contacting me via GitHub or private messages on the digital goods marketplace.

2025-08-19 01:39

Динамический вывод экстраполей в MultiStore: Руководство для администраторов

Руководство описывает настройку шаблонов модуля MultiStore (Cotonti Siena 0.9.26, PHP 8.4) для динамического вывода всех экстраполей таблицы cot_mstore без ручного добавления тегов для новых полей. Используется пример экстраполя «Тип доставки» (delivery_type) с вариантами AstroFreight, QuantumExpress, GalaCourier. Основано на коде mstore.extrafields.php, mstore.add.php, mstore.list.php, mstore.main.php, mstore.functions.php, mstore.ru.lang.php.

1. Принцип динамического вывода

Экстраполя регистрируются в mstore.extrafields.php через $extra_whitelist[$db_mstore]['tags'], задающий теги для шаблонов: LIST_ROW_XXXXX, MSTORE_XXXXX, MSTOREADD_FORM_XXXXX, MSTOREEDIT_FORM_XXXXX, MSTORE_ROW_XXXXX. В PHP-коде цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld) генерирует теги (например, MSTOREADD_FORM_DELIVERY_TYPE) и парсит блоки MAIN.EXTRAFLD, LIST_ROW.EXTRAFLD, MSTORE_ROW.EXTRAFLD через $t->parse, обеспечивая автоматический вывод всех экстраполей.

2. Настройка шаблонов

Шаблоны используют блоки MAIN.EXTRAFLD, LIST_ROW.EXTRAFLD, MSTORE_ROW.EXTRAFLD для вывода экстраполей.

2.1. Список товаров (mstore.list.tpl)

Шаблон отображает список товаров. Экстраполя выводятся через LIST_ROW.EXTRAFLD.

  • Код шаблона:
<!-- BEGIN: MAIN -->
<table>
    <tr>
        <th>{LIST_TOP_TITLE}</th>
        <!-- BEGIN: LIST_TOP_EXTRAFLD -->
        <th>{LIST_TOP_EXTRAFLD_TITLE}</th>
        <!-- END: LIST_TOP_EXTRAFLD -->
    </tr>
    <!-- BEGIN: LIST_ROW -->
    <tr>
        <td><a href="{LIST_ROW_URL}">{LIST_ROW_TITLE}</a></td>
        <!-- BEGIN: EXTRAFLD -->
        <td>{LIST_ROW_EXTRAFLD}</td>
        <!-- END: EXTRAFLD -->
    </tr>
    <!-- END: LIST_ROW -->
</table>
<!-- END: MAIN -->

           

  • Как работает:
    • В mstore.list.php цикл foreach ($sqllist_rowset as $item) вызывает cot_generate_mstoretags($item, 'LIST_ROW_', $itemListTruncateText, Cot::$usr['isadmin'], false, '', $backUrl).
    • В mstore.functions.php функция cot_generate_mstoretags содержит цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld), который генерирует теги:
      • LIST_ROW_DELIVERY_TYPE: значение поля (например, «AstroFreight») через cot_build_extrafields_data('mstore', $exfld, $item_data['msitem_' . $exfld['field_name']], $item_data['msitem_parser']).
      • LIST_ROW_DELIVERY_TYPE_TITLE: заголовок («Тип доставки») через cot_extrafield_title($exfld, 'mstore_').
      • LIST_ROW_DELIVERY_TYPE_VALUE: сырое значение (например, astro).
    • Теги LIST_ROW_EXTRAFLD и LIST_TOP_EXTRAFLD_TITLE формируются в цикле и парсятся через $t->parse('MAIN.LIST_ROW.EXTRAFLD').
    • Блок LIST_TOP_EXTRAFLD выводит заголовки (например, «Тип доставки»).
    • Блок LIST_ROW.EXTRAFLD выводит значения (например, «AstroFreight»).
  • Пример результата:
    • Таблица с колонками: «Название», «Тип доставки».
    • Строка: «Товар 1», «AstroFreight».

2.2. Карточка товара (mstore.tpl)

Шаблон отображает страницу товара. Экстраполя выводятся через MAIN.EXTRAFLD.

  • Код шаблона:

    <!-- BEGIN: MAIN -->
    <h1>{MSTORE_TITLE}</h1>
    <div>{MSTORE_TEXT}</div>
    <!-- BEGIN: EXTRAFLD -->
    <div class="form-group">
        <label>{MSTORE_EXTRAFLD_TITLE}:</label>
        <p>{MSTORE_EXTRAFLD}</p>
    </div>
    <!-- END: EXTRAFLD -->
    <!-- END: MAIN -->            
  • Как работает:
    • В mstore.main.php вызывается cot_generate_mstoretags($item, 'MSTORE_').
    • В mstore.functions.php функция cot_generate_mstoretags использует цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld), генерируя теги:
      • MSTORE_DELIVERY_TYPE: значение (например, «AstroFreight»).
      • MSTORE_DELIVERY_TYPE_TITLE: заголовок («Тип доставки»).
      • MSTORE_DELIVERY_TYPE_VALUE: сырое значение (astro).
    • Теги MSTORE_EXTRAFLD и MSTORE_EXTRAFLD_TITLE формируются в цикле и парсятся через $t->parse('MAIN.EXTRAFLD').
  • Пример результата:
    • Вывод: «Тип доставки: AstroFreight».

2.3. Форма добавления товара (mstore.add.tpl)

Шаблон формы добавления. Экстраполя выводятся через MAIN.EXTRAFLD.

  • Код шаблона:

    <!-- BEGIN: MAIN -->
    <form action="{MSTOREADD_FORM_SEND}" method="post">
        <div class="form-group">
            <label>{MSTOREADD_FORM_TITLE_TITLE}</label>
            {MSTOREADD_FORM_TITLE}
        </div>
        <!-- BEGIN: EXTRAFLD -->
        <div class="form-group">
            <label>{MSTOREADD_FORM_EXTRAFLD_TITLE}</label>
            {MSTOREADD_FORM_EXTRAFLD}
        </div>
        <!-- END: EXTRAFLD -->
        <button type="submit">Добавить</button>
    </form>
    <!-- END: MAIN -->
                
  • Как работает:
    • В mstore.add.php цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld) генерирует теги:
      • MSTOREADD_FORM_DELIVERY_TYPE: HTML-элемент (<select> с вариантами AstroFreight, QuantumExpress, GalaCourier) через cot_build_extrafields('rmsitemdelivery_type', $exfld, $ritem['msitem_delivery_type']).
      • MSTOREADD_FORM_DELIVERY_TYPE_TITLE: заголовок («Тип доставки») через cot_extrafield_title($exfld, 'mstore_').
      • MSTOREADD_FORM_EXTRAFLD, MSTOREADD_FORM_EXTRAFLD_TITLE: универсальные теги.
    • Метод $t->parse('MAIN.EXTRAFLD') рендерит блок.
  • Пример результата:
    • Форма с полем «Тип доставки» и выпадающим списком (astro=AstroFreight, quantum=QuantumExpress, gala=GalaCourier).

2.4. Форма редактирования товара (mstore.edit.tpl)

Шаблон формы редактирования. Экстраполя выводятся через MAIN.EXTRAFLD.

  • Код шаблона:

    <!-- BEGIN: MAIN -->
    <form action="{MSTOREEDIT_FORM_SEND}" method="post">
        <div class="form-group">
            <label>{MSTOREEDIT_FORM_TITLE_TITLE}</label>
            {MSTOREEDIT_FORM_TITLE}
        </div>
        <!-- BEGIN: EXTRAFLD -->
        <div class="form-group">
            <label>{MSTOREEDIT_FORM_EXTRAFLD_TITLE}</label>
            {MSTOREEDIT_FORM_EXTRAFLD}
        </div>
        <!-- END: EXTRAFLD -->
        <button type="submit">Сохранить</button>
    </form>
    <!-- END: MAIN -->
                
  • Как работает:
    • В mstore.extrafields.php определены теги MSTOREEDIT_FORM_XXXXX, MSTOREEDIT_FORM_XXXXX_TITLE.
    • Аналогично mstore.add.php, предполагается цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld) в mstore.edit.php, генерирующий MSTOREEDIT_FORM_DELIVERY_TYPE (HTML-элемент с текущим значением, например, astro) и MSTOREEDIT_FORM_DELIVERY_TYPE_TITLE.
    • Теги MSTOREEDIT_FORM_EXTRAFLD, MSTOREEDIT_FORM_EXTRAFLD_TITLE парсятся через $t->parse('MAIN.EXTRAFLD').
  • Пример результата:
    • Форма с полем «Тип доставки» и выбранным значением («AstroFreight»).

2.5. Другие шаблоны (news.tpl, recentitems.mstore.tpl)

Шаблоны используют MSTORE_ROW.EXTRAFLD для списков товаров.

  • Код шаблона (recentitems.mstore.tpl):

    <!-- BEGIN: MAIN -->
    <ul>
        <!-- BEGIN: MSTORE_ROW -->
        <li>
            <a href="{MSTORE_ROW_URL}">{MSTORE_ROW_TITLE}</a>
            <!-- BEGIN: EXTRAFLD -->
            <p>{MSTORE_ROW_EXTRAFLD_TITLE}: {MSTORE_ROW_EXTRAFLD}</p>
            <!-- END: EXTRAFLD -->
        </li>
        <!-- END: MSTORE_ROW -->
    </ul>
    <!-- END: MAIN -->
                
  • Как работает:
    • В mstore.extrafields.php определены теги MSTORE_ROW_XXXXX.
    • Функция cot_generate_mstoretags с префиксом MSTORE_ROW_ генерирует MSTORE_ROW_DELIVERY_TYPE, MSTORE_ROW_DELIVERY_TYPE_TITLE, MSTORE_ROW_DELIVERY_TYPE_VALUE.
    • Теги MSTORE_ROW_EXTRAFLD, MSTORE_ROW_EXTRAFLD_TITLE парсятся через $t->parse('MAIN.MSTORE_ROW.EXTRAFLD').
  • Пример результата:
    • Список: «Товар 1», «Тип доставки: AstroFreight».

3. Реализация в коде

  • Регистрация: В mstore.extrafields.php массив $extra_whitelist[$db_mstore]['tags'] задаёт теги для шаблонов (XXXXXdelivery_type).
  • Генерация тегов: В mstore.functions.php функция cot_generate_mstoretags использует цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld) для создания тегов (LIST_ROW_DELIVERY_TYPE, MSTORE_DELIVERY_TYPE).
  • Список товаров: В mstore.list.php цикл foreach ($sqllist_rowset as $item) вызывает cot_generate_mstoretags, присваивая теги и парся MAIN.LIST_ROW.EXTRAFLD.
  • Формы: В mstore.add.php цикл foreach (Cot::$extrafields[Cot::$db->mstore] as $exfld) генерирует MSTOREADD_FORM_DELIVERY_TYPE, MSTOREADD_FORM_EXTRAFLD и парсит MAIN.EXTRAFLD.
  • XTemplate: Блоки MAIN.EXTRAFLD, LIST_ROW.EXTRAFLD, MSTORE_ROW.EXTRAFLD рендерят экстраполя через $t->parse.

4. Добавление нового экстраполя

При добавлении поля (например, color) в админ-панели (admin?m=extrafields&n=cot_mstore):

  • Поле добавляется в Cot::$extrafields[Cot::$db->mstore] и cot_mstore (msitem_color).
  • Теги MSTORE_COLOR, LIST_ROW_COLOR, MSTOREADD_FORM_COLOR генерируются через cot_generate_mstoretags.
  • Блоки MAIN.EXTRAFLD, LIST_ROW.EXTRAFLD, MSTORE_ROW.EXTRAFLD подхватывают поле.
  • Локализация добавляется в mstore.ru.lang.php ($L['mstore_color'] = 'Цвет').

5. Визуализация процесса

    ____________________________
    | 1. Регистрация экстраполей|
    |   (mstore.extrafields)   |
    |__________________________|
               |
               V
    ____________________________
    | 2. Генерация тегов       |
    |   (cot_generate_mstoretags)|
    |__________________________|
               |
               V
    ____________________________
    | 3. Цикл в PHP-коде       |
    |   (foreach extrafields)  |
    |__________________________|
               |
               V
    ____________________________
    | 4. Парсинг блока         |
    |   (MAIN.EXTRAFLD)        |
    |__________________________|
               |
               V
    ____________________________
    | 5. Вывод в интерфейсе    |
    |   (mstore.add/list/edit) |
    |__________________________|
    

6. Пример результата для «Тип доставки»

  • Список товаров: Колонка «Тип доставки» с «AstroFreight».
  • Карточка: «Тип доставки: AstroFreight».
  • Форма добавления: Выпадающий список с AstroFreight, QuantumExpress, GalaCourier.
  • Форма редактирования: Выпадающий список с «AstroFreight».
This post was edited by webitproff (2025-08-19 13:41, 10 months ago)
Account