Shopkeeper и FormLister

На некоем сайте возникла проблема с eForm после добавления в форму пары чекбоксов: форма просто перестала отправляться, ругаясь на добавленные поля. Проблема усугублялась использованием eForm не просто так, а в связке с Shopkeeper — к сожалению, такие сайты до сих пор создают и успешно впаривают заказчикам. Очевидное решение выкинуть eForm выглядит следующим образом.

Дорабатываем Shopkeeper: в файле assets/snippets/shopkeeper/shopkeeper.inc.php ищем строчки
require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php";
$shopCart = new Shopkeeper($modx, $shkconf);

и меняем их на:

require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php";
$shopCart = new Shopkeeper($modx, $shkconf);
if (!empty($saveObject)) {
    $modx->setPlaceholder($saveObject, $shopCart);
}


В вызов Shopkeeper на странице заказа теперь нужно добавить параметр:
&saveObject=`shk`


Далее следует создать сниппет ShkForm, через который будем вызывать FormLister:
<?php
$out = '';
$purchases = !empty($_SESSION['purchases']) ? unserialize($_SESSION['purchases']) : array();
if (!empty($shkObject) && ($shk = $modx->getPlaceholder($shkObject)) && ($shk instanceof Shopkeeper) && !empty($purchases)) {
	$params['ignoreMailerResult'] = 1;
	$params['protectSubmit'] = 0;
	$params['submitLimit'] = 0;
	$params['prepareProcess'] = [function ($modx, $data, $FormLister) use ($shk) {
		$shk->populateOrderData($data); 
		$shk->sendOrderToManager($data);
		
		return $data;
	}];

	$out = $modx->runSnippet('FormLister', $params);
}

return $out;


В вызове этого сниппета должен быть обязательно указан параметр shkObject со значением параметра saveObject из вызова Shopkeeper:
[!Shopkeeper?
&cartType=`full`
&priceTV=`price`
&changePrice=`1`
&counterField=`1`
&style=`0`
&noJavaScript=`0`
&noJQuery=`1`
&flyToCart=`nofly`
&orderFormPage=`5067`
&cartTpl=`shopCart`
&cartHelperTpl=`cart_action_helper_tpl`
&cartRowTpl=`shopCartRow`
&orderDataTpl=`shopOrderData`
&saveObject=`shk`
!]
<section class="checkout_info">
    [!ShkForm?
    &formid=`shopOrderForm`
    &shkObject=`shk`
    &formTpl=`shopOrderForm`
    &reportTpl=`shopOrderReport`
    &captcha=`modxCaptcha`
    &parseDocumentSource=`1`
    &rewriteUrls=`1`
    &filters=`{
        "name":["trim", "stripTags", "removeExtraSpaces"],
        "email":["trim", "email"],
        "phone":["trim", "phone", "removeExtraSpaces"],
        "address":["trim", "stripTags", "removeExtraSpaces"],
        "message":["trim", "stripTags", "compressText"]
    }`
    &rules=`{
        "name":{
            "required":"Введите имя"
        },
        "email":{
            "required":"Введите электронный ящик",
            "email":"Введите электронный ящик правильно"
        },
        "phone":{
            "required":"Введите номер телефона",
            "phone":"Введите номер телефона правильно"
        },
        "address": {
            "required":"Введите адрес"
        },
        "payment":{
            "required":"Выберите способ оплаты",
            "!equals": {
                "params":["0"],
                "message":"Выберите способ оплаты"
            }
        }
    }`
    &formControls=`payment,delivery,dop_service`
    &subject=`Новый заказ на сайте`
    &to=`[(cfg_email_to)]`
    &successTpl=`shopThankYou`
    !]
</section>


Шаблон shopOrderReport:
<p>В интернет-магазине сделан заказ.</p>
<p>Номер заказа: [+orderID+]</p>
<b>Состав заказа:</b>
[+orderData+]
<br /><br />
<b>Данные покупателя:</b><br />
<table cellpadding="3">
	<tr><td style="text-align:right"><b>Адрес: </b></td><td>[+address.value+]</td></tr>
	<tr><td style="text-align:right"><b>Способ доставки: </b></td><td>[+delivery.value+]</td></tr>
	<tr><td style="text-align:right"><b>Способ оплаты: </b></td><td>[+payment.value+] </td></tr>
	<tr><td style="text-align:right"><b>Ф.И.О.: </b></td><td>[+name.value+]</td></tr>
	<tr><td style="text-align:right"><b>E-mail: </b></td><td><a href="mailto:[+email.value+]">[+email.value+]</a></td></tr>
	<tr><td style="text-align:right"><b>Телефон: </b></td><td>[+phone.value+]</td></tr>
	<tr><td style="text-align:right"><b>Сообщение: </b></td><td>[+message:nl2br+]</td></tr>
</table>

3 комментария

avatar
+
А в чем изюминка с shkObject (для тех кто в танке)?
FL вроде и раньше не отказывался работать с Shopkeeper.
avatar
Это наиболее корректный способ связать эти сниппеты. Раньше предлагалось вызывать функции populateOrderData и sendOrderToManager в prepareProcess, но там какие-то проблемы могли возникнуть.
avatar
спасибо
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.