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

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

  1. Через плагин с событием OnSHKcalcTotalPrice, но отправить туда POST запрос с ценой доставки никак;
  2. В самом 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
);

Также добавил в Shopkeeper.js еще одну функцию для ajax-запросов:

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

Использую эту функцию при клике на кнопку "Расчитать". По факту, массив с ключом newDeliveryPrice попадает в коннектор и он приплюсовывается к общей цене. Проблема в том, что при любом ajax-запросе из корзины будь то дефолтное увеличение количества товара, посылается 2 ajax запроса в коннектор, и возвращается 2 ответа, дак вот в первом ответе я вижу измененную цену с приплюсованным newDeliveryPrice, а во втором ответе изначальная цена без сложения. По факту, в корзине ничего не меняется.Обратил внимание, что при первом ответе присутствует html с data-shopcart-1, а во втором ответе data-shopcart-2. Может это как-то влияет, я до конца не разобрался. Помогите плз сформировать общую цену, заранее спасибо!

Проблема в том, что при любом ajax-запросе из корзины будь то дефолтное увеличение количества товара, посылается 2 ajax запроса в коннектор, и возвращается 2 ответа

Значит у вас две корзины (два вызова сниппета Shopkeeper) в шаблоне.

Проблема с сохранением цены в заказе?

@andchir аа ну все верно, да, 2 корзины, 1 корзина - это просто значок корзины в шапке, типа перейти в корзину, вторая корзина - это непосредственно при оформлении заказа.
Да. проблема с сохранением цены в заказе! Хотелось бы сделать, чтобы при нажатии кнопки "рассчитать", общая цена формировалась подобно изменениям способа доставки или количества товара! Спасибо!

@andchir Не подскажете как и где конкретно формируется общая цена $price_total? Просто в connector_fe.php я вообще убрал элемент массива 'price_total' => Shopkeeper::$price_total , но цена, все равно, нормально формируется в корзине.

Сам калькулятор я сделал, но считается он в корзине.

Сделали на JavaScript? Не боитесь. что кто-то понимающий придет и поставит себе нулевую доставку там где её быть не должно? Такие вещи нужно делать на стороне сервера или дублировать на стороне сервера. Поэтому нужно через плагин, а не плагину отправлять готовую цену.

Действительно! Именно поэтому паршивое чувство не отпускало, что что-то не так! Но, в таком случае, как поместить данные, введенные пользователем в плагин?

Эта запись удалена!

@andchir В общем, я пробовал по-разному добиться попадания параметров для расчета в плагин, но все как то не очень... через сессии - не вариант) Если Вы мне подскажете хотя бы как у Вас реализована функция обновления общей цены, допустим, при изменении количества товара? Просто не хотелось бы тратить много времени на изучение всей архитектуры приложения, если Вам не сложно, конечно!

я пробовал по-разному добиться попадания параметров для расчета в плагин

Что за параметр? Если это параметр товара, то надо брать из базы данных.

@andchir параметры доставки, которые укажет посетитель сайта для расчета! Ну, например, сайт по доставке сейфов. Если вес более 50кг то 10р за 1 кг будет стоимость доставки + 200р (если на лифте) либо + 100р за каждый этаж если нет лифта.
То есть, приблизительные параметры, которые надо передать в плагин:

  1. Общий вес всех товаров в корзине;
  2. Количество этажей;

Для обновления доставки есть JS-функция

SHK.selectDelivery('Название доставки')

Вот код:
https://github.com/andchir/shopkeeper3/blob/master/assets/components/shopkeeper3/web/js/shopkeeper.js#L846

Вы можете написать свою функцию, которая будет делать POST-запрос на URL:

SHK.options.site_base_url + 'assets/components/shopkeeper3/connector_fe.php'

с параметром shk_action: 'update_delivery' Потом в плагине ловить все данные из $_POST и устанавливать цену доставки.

Событие плагина - OnSHKgetDeliveryPrice. Он должен вернуть цену доставки.

Отлично! Это помогло! Спасибо!

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.