Для реализации заказа в один клик необходимо создать обработчик формы, через которую будут одновременно передаваться параметры товара (id, count и др.) и параметры заказа (например, name и phone).
Для обработки параметров товара потребуется отдельная корзина, в которой изменено хранилище товаров. По умолчанию используется хранилище session для хранения товаров в сессии, мы же будем использовать хранилище instant - в нем товары по сути не хранятся и будут утеряны после завершения работы скрипта. Однако поведение корзины от этого не изменится - будут вызваны соответствующие события, выполнены проверки и т.п.
После добавления товара в корзину будет вызван стандартный сниппет Order для обработки параметров заказа. С помощью параметра cartName указывается, из какой корзины брать товары для заказа.
Примерная реализация сниппета QuickOrder (предполагается, что форма отправляется с помощью ajax):
<?php
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')){
$modx->sendErrorPage();
}
// создание корзины
$cart = new \Commerce\Carts\ProductsCart($modx, 'quickorder', 'instant');
ci()->carts->addCart('quickorder', $cart);
$cart->setCurrency(ci()->commerce->currency->getCurrencyCode());
$cart->setTitleField(ci()->commerce->getSetting('title_field', 'pagetitle'));
$cart->setPriceField(ci()->commerce->getSetting('price_field', 'price'));
// добавление товара
$cart->add($_POST);
// обработка заказа
$params['cartName'] = 'quickorder';
return $modx->runSnippet('Order', $params);
Вызов:
[!QuickOrder?
&formid=`quickOrder`
&ignoreMailerResult=`1`
&api=`2`
&rules=`{
"name":{
"required":"Введите имя"
},
"phone":{
"required":"Введите номер телефона",
"phone":"Введите номер телефона правильно"
}
}`
&filters=`{
"name":["trim","stripTags","removeExtraSpaces"],
"phone":["trim","phone"],
"id":["castInt"],
"count":["castFloat"]
}`
&formTpl=`quickOrderFormTpl`
&successTpl=`@CODE:<p>Спасибо за заказ! С вами свяжется менеджер</p>`
&skipTpl=`@CODE:<p>Не удалось сохранить заказ.</p>`
&to=``
!]
Чанк quickOrderFormTpl:
[+form.messages+]
<input type="hidden" name="formid" value="quickOrder">
<input type="hidden" name="id" value="[+id+]">
<input type="hidden" name="count" value="[+count+]">
<h5 class="step-title h3 mb-3">Заполните поля для быстрой покупки</h5>
<div class="form-group row [+name.classname+]">
<label class="col-md-4 col-sm-12 form-control-label required">Ваше имя *</label>
<div class="col-md-8 col-sm-12">
<input
class="form-control"
name="name"
type="text"
value="[+name.value+]"
placeholder="Введите Ваше имя"
prequired>
[+name.error+]
</div>
</div>
<div class="form-group row [+phone.classname+]">
<label class="col-md-4 col-sm-12 form-control-label required">Телефон *</label>
<div class="col-md-8 col-sm-12">
<input
class="form-control"
name="phone"
type="text"
value="[+phone.value+]"
placeholder="Введите номер телефона"
prequired>
[+phone.error+]
</div>
</div>