Короткий ответ: если стандартных полей в оформлении заказа miniShop2 не хватает, можно добавить свои поля в форму, сохранить их в properties адреса заказа и вывести в админке через плагин. Нормальный путь именно такой: без правки исходников, чтобы очередное обновление не превращало ваш checkout в тыкву.
Ниже рабочая схема: добавляем поля в форму, создаем плагин, включаем вывод properties в заказах и добавляем подписи в словари.
Что будем делать
- Добавим свои поля в форму оформления заказа.
- Сохраним их в
propertiesу адреса заказа. - Выведем эти данные в админке miniShop2.
- Добавим человекочитаемые подписи через словари.
Шаг 1. Добавляем поля в форму заказа
Для примера добавим тип плательщика, название организации и ИНН. Код можно использовать как есть:
<label><input type="radio" name="extfld_type" value="Юридическое лицо">Юридическое лицо</label>
<label><input type="radio" name="extfld_type" value="Физическое лицо">Физическое лицо</label>
<label><input type="text" name="extfld_org">Название организации</label>
<label><input type="text" name="extfld_inn">ИНН</label>
Все поля с префиксом extfld_ дальше будем перехватывать и сохранять в заказ. Префикс не обязателен по воле вселенной, но очень помогает не устроить винегрет в POST-данных.
Шаг 2. Создаем плагин
Создаем плагин, например msExtraAddressFields, и вешаем его на события msOnBeforeCreateOrder и msOnManagerCustomCssJs.
Код плагина оставляем таким:
<?php
switch ($modx->event->name) {
case 'msOnBeforeCreateOrder':
$address = $msOrder->getOne('Address');
$properties = array();
foreach ($_POST as $key => $value){
if (strpos($key,'extfld_') !== false){
$properties[$key] = htmlentities($value,ENT_COMPAT | ENT_HTML401,'UTF-8');
}
}
if (count($properties) > 0){
$address->set('properties', json_encode($properties));
}
break;
case 'msOnManagerCustomCssJs':
if ($page != 'orders') return;
$modx->controller->addHtml("
<script type='text/javascript'>
Ext.ComponentMgr.onAvailable('minishop2-window-order-update', function(){
if (miniShop2.config['order_address_fields'].in_array('properties')){
if (this.record.addr_properties){
var key;
for (key in this.record.addr_properties) {
this.fields.items[2].items.push(
{
xtype: 'displayfield',
name: 'addr_properties_'+key,
fieldLabel: _('ms2_properties_'+key),
anchor: '100%',
style: 'border:1px solid #efefef;width:95%;padding:5px;',
html: this.record.addr_properties[key]
}
);
}
}
}
});
</script>");
break;
}
Что делает этот плагин
- На событии msOnBeforeCreateOrder он собирает все POST-поля с префиксом
extfld_и складывает их в JSON в полеpropertiesтаблицы адреса заказа. - На событии msOnManagerCustomCssJs он добавляет вывод этих значений в окно заказа в админке.
Шаг 3. Разрешаем вывод properties в заказе
Теперь нужно сказать miniShop2, что поле properties надо показывать.
- Заходим в системные настройки.
- Открываем пространство miniShop2.
- Переходим в блок заказов.
- Добавляем
propertiesв значение настройки Поля адреса доставки.
Шаг 4. Добавляем подписи к полям
Чтобы в админке не висели голые ключи вроде extfld_inn, добавляем записи словаря:
- пространство имен: minishop2;
- тема: manager;
- язык: ru.
Создаем записи такого вида:
ms2_properties_extfld_type
ms2_properties_extfld_org
ms2_properties_extfld_inn
Значения этих записей - это подписи, которые увидите в админке: например «Тип плательщика», «Название организации», «ИНН».
Что получится в итоге
После оформления заказа дополнительные поля будут:
- сохраняться вместе с адресом заказа;
- отображаться в админке miniShop2;
- не требовать правки исходников компонента.
Подводные камни
- Если поля не отображаются в админке, первым делом проверьте, что в настройке адресных полей есть
properties. - Если форма не отправляется, проверьте валидацию checkout и имена полей. Иногда проблема не в плагине, а в фронтенде.
- Поля в таком виде выводятся как данные для просмотра, а не как полноценно редактируемые поля.
- Не надо править исходники miniShop2. Как только обновите компонент, весь этот героизм обычно заканчивается слезами.
Когда этот подход подходит
Этот вариант хорош, когда нужно быстро и аккуратно добавить несколько дополнительных полей в checkout и видеть их в менеджере заказов. Если же вам нужны сложные бизнес-сценарии, фильтрация, отдельные колонки в таблицах и плотная интеграция с внешними системами, тогда уже стоит смотреть в сторону расширения модели и более серьезной кастомизации.
Связанные статьи
Актуально для: MODX Revolution 2.8+, miniShop2, проекты, где нужно добавить свои поля в форму заказа без правки исходников компонента.
Комментарии
Комментарии (0)