Динамический вывод экстраполей в 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']задаёт теги для шаблонов (XXXXX—delivery_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».