Свои поля в форме оформления заказа Minishop2
Иногда требуется добавить несколько специфичных полей в форму заказа, которых нет в таблице Address.
В данном случае, например, реквизиты юр. лица — ИНН, БИК, расчетный счет и тд.
Bezumkin предлагает простое решение для добавления любых полей в любом количестве с помощью одного снипета и плагина.
Для этого в чанке формы заказа нужно их указать:
<div class="control-group input-parent"> <label class="control-label" for="inn"><span class="required-star">*</span> ИНН</label> <div class="controls"> <input type="text" name="inn" value="[[+inn]]" class="[[+errors.inn]]"> </div> </div>
А в нужном месте получить в виде плейсхолдеров через вызов снипета:
[[!msGetOrderProperties?id=`[[+id]]`]] [[+address.properties.inn]]
Те если в форме задать имя [[+inn]] то потом данные будут доступны с префиксом address.properties. например в чанке отправки письма.
Код снипета msGetOrderProperties:
<?php
if (empty($id)) {return $modx->lexicon('ms2_err_order_nf');}
$miniShop2 = $modx->getService('minishop2');
$miniShop2->initialize($modx->context->key);
if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
$pdoFetch = new pdoFetch($modx, $scriptProperties);
if (!$order = $modx->getObject('msOrder', $id)) {return $modx->lexicon('ms2_err_order_nf');}
if ((empty($_SESSION['minishop2']['orders']) || !in_array($id, $_SESSION['minishop2']['orders'])) && $order->get('user_id') != $modx->user->id && $modx->context->key != 'mgr') {
return !empty($tplEmpty) ? $pdoFetch->getChunk($tplEmpty) : '';
}
if(!$outer = $order->getOne('Address')->toArray('address.')) return;
$props = $outer['address.properties'];
if (!empty($props) && is_array($props)) {
foreach ($props as $key => $value) {
$outer['address.properties.'.$key] = $value;
}
}
if (empty($tplOuter)) {
$modx->setPlaceholders($outer);
}
else {
return $pdoFetch->getChunk($tplOuter, $outer);
}
Код плагина OrderProperties:
<?php
switch($modx->event->name) {
case 'msOnCreateOrder':
$id = $msOrder->get('id');
$address = $modx->getObject('msOrderAddress', $id);
$json = json_encode($_POST);
$address->set('properties', $json);
$address->save();
break;
}
Не забываем поставить галочку в настройках msOnCreateOrder
Комментарии ()