У меня возникла такая необходимость - написать калькулятор для подсчета доставки. Там нестандартный алгоритм, по типу если вес заказа более 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&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
Вопрос, посоветуйте как быть, куда рыть чтобы, все таки, данные отправлялись куда надо и приплюсовывались к общей цене!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть переход с шаблона категории на шаблон полной новостиКак между ними вставить ещё промежуточный шаблон? DLE
Проблема: в htaccess есть правило перенаправления для всех запросов на indexphp, но запросы типа example
Как передать переменную из JavaScript в PHP без обновления страницы, внутри существующей функции JS? Те
Есть некий контролер который получает массив данныхЕго нужно обработать в очереди с задержкой между задачами