Добавление своих полей в форму заказа miniShop2

Короткий ответ: если стандартных полей в оформлении заказа miniShop2 не хватает, можно добавить свои поля в форму, сохранить их в properties адреса заказа и вывести в админке через плагин. Нормальный путь именно такой: без правки исходников, чтобы очередное обновление не превращало ваш checkout в тыкву.

Ниже рабочая схема: добавляем поля в форму, создаем плагин, включаем вывод properties в заказах и добавляем подписи в словари.

Что будем делать

  1. Добавим свои поля в форму оформления заказа.
  2. Сохраним их в properties у адреса заказа.
  3. Выведем эти данные в админке miniShop2.
  4. Добавим человекочитаемые подписи через словари.

Шаг 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 надо показывать.

  1. Заходим в системные настройки.
  2. Открываем пространство miniShop2.
  3. Переходим в блок заказов.
  4. Добавляем 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)



Разрешённые теги: <b><i><br>Добавить новый комментарий: