Заказ в 1 клик

    Заказ в один клик

    Для реализации заказа в один клик необходимо создать обработчик формы, через которую будут одновременно передаваться параметры товара (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>