все просто

Свои поля в форме оформления заказа 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

Комментарии ()