Последние темы


Расчет общей цены в корзине 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. Он должен вернуть цену доставки.

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

 

Последние комментарии

  • R

    @Andchir Спасибо. Получилось.

    Читать далее
  • Похоже, что в этой форме у вас используется FormIt. Но, как я уже писал выше, он там не нужен. Сначала нужно добавить товар в корзину, тогда и будет срабатывать плагин. Формы добавления товара в корзину я у вас не увидел. Далее можно сделать хитрость, добавить форму (можно на этой же странице), где будет кнопка "Подтвердить" и скрытые поля, которые будут заполнены данными из предыдущей формы.
    В общем пока я не увидел даже намека на то, что Вы понимаете что делаете, поэтому дальше я не помощник.

    Читать далее
  • K

    Уже разобрался, забыл указать тв в системных настройках tag_mgr2.numeric
    Спасибо спец. отделу. Канал открылся довольно быстро.

    Читать далее