Расчет общей цены в корзине modx Shopkeeper3

247
23 сентября 2018, 13:50

У меня возникла такая необходимость - написать калькулятор для подсчета доставки. Там нестандартный алгоритм, по типу если вес заказа более 50кг - один коэффициент, если меньше то другой + этажи, до подъезда, до двери и т.д. Сам калькулятор я сделал, но считается он в корзине. Картина состоит в следующем: посетитель выбрал способ доставки, внес данные, нажал кнопку "рассчитать" и вывелась цена доставки, далее необходимо эту цену приплюсовать к общей цене $price_total или [[+price_total]] (как удобнее). Естественно, мы отправляем POST-запрос через ajax.

... И... У меня возникло два варианта: 1. Через плагин с событием OnSHKcalcTotalPrice. Код такой:

$e = &$modx->Event;
$output = "";
if(isset($_POST['newDeliveryPrice'])) {
    $newDeliveryPrice = $_POST['newDeliveryPrice'];
}else{
    $newDeliveryPrice = 0;
}
if ($e->name == 'OnSHKcalcTotalPrice') {
    if(isset($price_total)) {
        $output = $price_total + $newDeliveryPrice;
    }
    $e->output($output);
}

В Shopkeeper.js добавил функцию, которая срабатывает при клике на "Рассчитать":

newDelivery: function( value ){
    var params = { newDeliveryPrice: value };
    SHK.options.is_first = true;
    this.ajaxRequest( params );      
}

При запуске этой функции срабатывает событие OnSHKcalcTotalPrice и здесь все работает, но вот POST запросы плагин не умеет получать и, следовательно, переменная $newDeliveryPrice равна 0, но если, допустим, я присвою ей $newDeliveryPrice = 400 то при нажатии на "Рассчитать" 400 приплюсовывается, все норм. Второй вариант, в самом ajax-коннекторе connector_fe.php прописать следующую конструкцию:

if(isset($_POST['newDeliveryPrice'])) {
    $newDeliveryPrice = $_POST['newDeliveryPrice'];
}else{
    $newDeliveryPrice = 0;
}

$output = array(
    'price_total' => Shopkeeper::$price_total + $newDeliveryPrice,//здесь плюсуем посланный расчет из корзины
    'items_total' => Shopkeeper::$items_total,
    'items_unique_total' => Shopkeeper::$items_unique_total,
    'delivery_price' => ( !empty( $shopCart->delivery['price'] ) ? $shopCart->delivery['price'] + $newDeliveryPrice : 0 ),
    'delivery_name' => ( !empty( $shopCart->delivery['label'] ) ? $shopCart->delivery['label'] : '' ),
    'ids' => $shopCart->getProdIds(),
    'html' => $cart_html
);
echo json_encode( $output );

Эта конструкция работает, но не до конца, она работает только для data-shopcart-1, а для data-shop-cart-2 не работает и потому цена не обновляется. Просто при любых изменениях в корзине будь то дефолтное изменение количества товара, посылается почему-то 2-AJAX запроса в connector_fe.php. Это я уже понял посмотрев консоль браузера и проверив какие данные возвращаются, в первом ajax-запросе я получаю приплюсованную сумму доставки, во втором уже нет, как я говорил ранее, первый ajax-запрос идет относительно data-shopcart-1, второй data-shopcart-2.

Вот первый запрос (где цена изменилась):

{price_total: 24600, items_total: 1, items_unique_total: 1, delivery_price: 0,…}
delivery_name: "По городу (до двери)"
delivery_price: 0
html: "↵↵<div id="shopCart" class="shop-cart" data-shopcart="1">↵    <a name="shopCart"></a>↵    <form action="/#shopCart" method="post">↵        <a href="oformlenie-zakaza/" title="Перейти в корзину" class="shop-link btn">↵            <i class="fa fa-shopping-cart"></i><span class="count">(1)</span>↵        </a>↵    </form>↵    ↵    23 000↵</div>↵"
ids: [1218]
items_total: 1
items_unique_total: 1
price_total: 24600

Вот второй запрос:

{price_total: 23000, items_total: 1, items_unique_total: 1, delivery_price: 0,…}
delivery_name: "По городу (до двери)"
delivery_price: 0
html: "↵<div class="shop-cart" data-shopcart="2">↵    <div class="shop-cart-head"><a name="shopCart"></a><b>Корзина</b></div>↵    <div class="full">↵        <form action="/#shopCart" method="post">↵        <fieldset>↵            <div  style="text-align:right;">↵                <a href="/?shk_action=empty" id="shk_butEmptyCart">Очистить корзину</a>↵            </div>↵            <table width="100%">↵                <colgroup>↵                    <col width="10%" />↵                    <col width="50%" />↵                    <col width="15%" />↵                    <col width="20%" />↵                    <col width="5%" />↵                </colgroup>↵                <tbody>↵                    <tr class="cart-order">↵    <td><a href="http://sib-vest.ru/catalog/testovyij-tovar.html"><img src="/userfiles/"></a></td>↵    <td align="left"><b><a href="http://sib-vest.ru/catalog/testovyij-tovar.html">тестовый товар</a></b></td>↵    <td><b><span class="shk_weight">90</span> кг.</b></td>↵    <td><span class="shk_price">23000</span> руб.</td>↵    <td align="center">↵        <input class="shk-count" type="text" size="2" name="count[]" maxlength="3" title="изменить количество" value="1" />↵    </td>↵    <td align="center">↵        <a href="?shk_action=remove&amp;n=0" title="Удалить" class="shk-del"><i class="fa fa-trash"></i></a>↵    </td>↵</tr>↵                </tbody>↵            </table>↵            <div  style="text-align:right;">↵                Доставка: По городу (до двери) (0 руб.)↵            </div>↵            <div  style="text-align:right;">↵                Общая сумма: <b>23 000</b> руб.↵            </div>↵            <noscript>↵                <div><input type="submit" name="shk_recount" value="Пересчитать" /></div>↵            </noscript>↵            <div class="cart-order">↵                <a href="http://sib-vest.ru/" id="shk_butOrder">Оформить заказ</a>↵            </div>↵        </fieldset>↵        </form>↵    </div>↵</div>"
ids: [1218]
items_total: 1
items_unique_total: 1
price_total: 23000

Смотрю это во вкладке Network браузера Chrome, выбираю конкретный файл, к которому был XHR запрос. Они, обычно рядом находятся: connector_fe.php connector_fe.php

Вопрос, посоветуйте как быть, куда рыть чтобы, все таки, данные отправлялись куда надо и приплюсовывались к общей цене!

READ ALSO
Как при переходе в полную новость вставить до нее шаблон DLE?

Как при переходе в полную новость вставить до нее шаблон DLE?

Есть переход с шаблона категории на шаблон полной новостиКак между ними вставить ещё промежуточный шаблон? DLE

157
Перенаправление всех запросов на index.php

Перенаправление всех запросов на index.php

Проблема: в htaccess есть правило перенаправления для всех запросов на indexphp, но запросы типа example

175
Передача переменной из JS в PHP без обновления страницы

Передача переменной из JS в PHP без обновления страницы

Как передать переменную из JavaScript в PHP без обновления страницы, внутри существующей функции JS? Те

222
Laravel отложенная очередь не работает

Laravel отложенная очередь не работает

Есть некий контролер который получает массив данныхЕго нужно обработать в очереди с задержкой между задачами

161