Общая сумма по каждому товару в корзине Minishop2

Может быть я просто не нашел более простого способа... Но для того чтобы получить общую сумму (цена*кол-во каждого товара) мне пришлось заморочнуться. Это связанно с тем, что в проекте была необходимость реализовать разные цены в зависимости от кол-ва товаров. А ведь кол-во можно изменить в корзине. Так что не получилось обойтись костылем на скрипте (простым умножение кол-ва на цену), а нужно чтобы вместе с общей суммой мне по аяксу приходили еще и калькуляция цены товара — с умножением на кол-во, ну и единичной тоже.

Для реализации этого функционала мне пришлось поправить несколько системных файлов minishop2.

Решение

Реализовано с версией минишопа 2.4.11

В файле core/components/minishop2/model/minishop2/mscarthandler.class.php находим объявление метода public function status($data = array()), и в нем перед самым return добавляем строку $status['cart'] = $this->cart;. Чтобы получилось так:

    public function status($data = array())
    {
        ...
        $status['cart'] = $this->cart;
        return array_merge($data, $status);
    }

Теперь нужно обработать скриптом эти данные. Находим в файле assets/components/minishop2/js/web/default.js объявление сетода status: function (status) {, и там внутри блока else прописываем цикл. Тут я приведу свой пример, который вам будет необходимо адаптировать под свою верстку.

status: function (status) {
    if (status['total_count'] < 1) {
        location.reload();
    }else{
        ...
        console.log(status);
        $.each(status.cart, function(key,value) {
            $("#"+key).find(".cart_row_price").find("span").text(miniShop2.Utils.formatPrice(value.price));
            $("#"+key).find(".cart_row_price_sum").find("span").text(miniShop2.Utils.formatPrice(value.price*value.count));
        });
        ...
    }
}

На случай если нихренашечки не получилось

Первичная настройка

Вывод данных в консоль
Вслепую работать никак нельзя, и важно понимать что за данные приходят по аяксу. Для этого отредактируем файлик assets/components/minishop2/js/web/default.js, (на 217 строке) там где идет определение функции xhr, и конкретно после строчки }).fail(function () { добавляем строчку console.log(xhr.responseText);. Это нам позволит отобразать "ошибки". Будем это использовать чтобы выводить результаты работы всяких print_r и var_dump.
Также выведем данные уже чистые. Там где объявяется change: function () {, внутри callbacks.change.response.success = function (response) { добавляем строчку console.log(response);.
Ок, "у нас появились глаза")

Методика исследования

Как вы заметили из консоли, скрипт обращается к файлу assets/components/minishop2/action.php, но там вы ничего интересного не найдете. На самом деле это — плагин miniShop2, именно там начинается "дивный путь поиска решения" — "безграничный и удивительный":).

Основной файл минишопа находится тут — core/components/minishop2/model/minishop2/minishop2.class.php. В нем мы находим метод handleRequest, и в частности смотрим на case 'cart/change':.
$this->cart->change говорит нам о том, что в этом файле искать бесполезно, ищем контроллер корзины, и находим его в файле core/components/minishop2/model/minishop2/mscarthandler.class.php. Тут находим метод public function change($key, $count), и, наткнувшись в нем на ...status(... переключаем внимание на этот метод. Он тоже расположен в этом файле. И это то, что нам нужно. дальнейшие действия описаны в первом разделе этой статейки.

Комментарии (3)

  1. Александр 16 февраля 2019, 19:17 # 0
    Спасибо за статью. Хотел уточнить, а после изменения количества товара в корзине динамически сумма поменяется без перезагрузки страницы? у меня только после перезагрузки.
    1. Юрий 31 августа 2019, 16:00 # 0
      А как сделать чтобы цена менялась при изменении количества товара. Сейчас меняется только после перезагрузки
      1. Евгений 05 октября 2019, 13:53 # 0
        Привет!
        Мне нужно было проще. Я сделал на жавике.
        В текстовое содержание элемента ('.item-total-price')
        записывается цена товара('.product-price') * количество ('.product-quantity .quantity')
        Вместо $('#cartTable tr') -соответственно Ваш элемент списка товаров или строка таблицы с товарами.
        Оформление какое угодно, но главное подключаемся ко всем аякс запросам со страницы, и если запрос на нужный адрес и ответ тру значит пересчитываем суммы по товарам

        В любом js файле добавить:

        $(document).ready(function() {
        function getListSums(){
        $('#cartTable tr').each(function(){
        $(this).find('.item-total-price').text(
        $(this).find('.product-price').data('val') * $(this).find('.product-quantity .quantity').val()
        );
        });
        }
        getListSums();//сразу вывод

        //подключаемся к аякс запросам ответственным за работу с корзиной
        $(document).ajaxSuccess(function(event, xhr, settings) {
        if(settings.url === '/assets/components/minishop2/action.php' && xhr.responseJSON.success === true ){ getListSums(); }
        });
        *Комментарий будет опубликован после проверки модератором

        Комментарии easyComm

        Станислав 23 августа 2018, 20:48

        Хорошая статья, почти все получилось, только почему то общая сумма появляется после прибавления и удаления товара, при обновлении страницы сумма исчезает, не подскажете с чем это может быть связано?

        Администратор

        На вывод товаров в корзину эти моменты не особо влияют.
        Сумма в корзину будет попадать вот так: {$product.cost}
        Также, возможно, будет полезна вот эта заметка - https://webstool.ru/izmenit-czenu-na-tovar-minishop2.html

        Николай 03 августа 2018, 09:29

        Благодарю, только у вас нашел эту информацию. Все работает.

        Похожие статьи

        Генератор настроек MIGX

        Документация на русском по MODX MIGX

        Подсказки по работе и заготовки для MiniShop2

        pdoPage и getImageList - Постраничная навигация MIGX

        Импорт и экспорт в MiniShop2. Реализация 1

        Как включить HTTPS (SSL) в MODX - Подробная инструкция

        Генерация YML для выгрузки в маркет

        Примеры работы с API MODX

        Примеры выборки where, optionFilters, innerJoin

        pThumb - ресайз изображений. Примеры использования.

        Расширение свойств товаров minishop2

        Примеры использования

        Сайт на обслуживании (выключить сайт)

        Добавить в письмо контактную информацию

        Вывести getImageList только если он не пустой

        Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

        Оформление и настройка easyComm. Комментарии и отзывы на сайте.

        Поиск на сайте с пакетом SimpleSearch

        Простая и симпатичная галерея fancybox

        Подсчет и вывод количества потомков ресурса в MODX

        Вывод tv-параметров в формате -

        Галерея. Вывести обложки альбомов и фотографии

        Отредактировать письмо о заказе - добавить ТВ поле, или что-то еще

        Quip для MODX. Более рабочий вариант

        pdoResources Заготовки для работы

        Сниппет для вывода размера и расширения файла

        Простой аудио-плеер HTML5

        Вывести список всех опций MiniShop2

        Слайдер Slick slider в контенте ресурса

        Изменить цену на товар в зависимости от количества при добавлении в корзину minishop2

        Как контролировать кэш CSS и скриптов

        Подключить MODX в стороннем PHP файле

        Простейшая авторизация

        Как создать ресурс процессором $modx->runProcessor('resource/create', $props)

        Красивое адаптивное меню под pdoMenu

        Массово обновить ТВ, или другое поле через базу

        Создать свою страницу в админке

        Изменить формат номера заказа

        Сообщение о том, что сайт использует Cookie

        Получить grandparent. Вывести родитель родителя

        Симпатичный список файлов, загружаемых к ресурсу через MIGX

        Установить шаблон по-умолчанию для новых, создаваемых ресурсов

        Создать источник файлов

        Вывести все доступные плейсхолдеры

        Отредактировать шаблон письма

        Добавить скрипт перед тегом body

        Общая сумма по каждому товару в корзине Minishop2

        Создать раздел с паролем на сайте MODX

        Что делать если ее приходит почта администратору

        Фильтрация по TV параметрам в msProducts

        Дата на русском

        FontAwesome - часто используемые иконки для шаблонов MODX

        Создать пакет с пользовательской таблицей

        Курсы валют с cbr.ru на PHP

        Заготовки для работы

        Загрузка сниппета после загрузки страницы через AjaxSnippet

        getResources заготовки

        Обязательный чекбокс при оформлении заказа

        Соответствие названия классов с названиями таблиц в MySQL

        Обработка остатков заказа в miniShop2

        Разбить вывод pdoResources на несколько колонок (блоков)

        Баннеры с использованием BannerY

        Обновить alias (псевдоним) у всех ресурсов

        CSS для постраничной навигации pdoPage

        Вывести время загрузки (формирования) страницы

        Расширить таблицу site_content (объект modResource) за 5 минут

        Вырезать кавычки — фильтр-сниппет MODX

        Счетчик посещений и скачиваний для сортировки ресурсов

        Динамическое поле emailSubject в FormIt

        Бесплатная доставка от 5000 рублей в MiniShop2

        Скрыть информацию о том, что сайт работает на MODX

        Отсортировать ресурсы по количеству комментариев Quip MODx

        Изменить цену на товар, если в корзине лежит товар из особой категории minishop2

        Создать редирект через autoRedirector API

        Вывести 404 ошибку по настройке TV MODX

        Ответ для сервиса moneta.ru

        Email сделать не обязательным полем

        Как разместить исходный код сниппета на сайте, в документации

        Cортировать по списку id в pdoResources и pdoTools

        Ускорить установку MODX revo до пары кликов

        Постраничная навигация — набор параметров и CSS PdoPage

        Не работает подгрузка товаров ajax mfilter2 на мобильном

        Сделать все элементы статичными для Git и IDE

        Сделать поле размер обязательным

        Настройка стилей для комментариев Tickets

        Подключить текстовой редактор к доп. полям ресурса

        Кастомный чанк для AdminPanel

        Динамическая замена шаблона ресурса - плагин

        Разместить корзину внутри блока с оформлением заказа

        Плагин для формирования замороженных URL с редиректом

        Приветственный экран / заглушка на сайт

        Вывести список всех родителей в ТВ поле ресурса

        xPDO Выборка из одной таблицы с зацепкой значения из другой

        Вложенные условия в xPDO MODX

        Вывести список всех емэйлов miniShop2

        Если getParentIds не работает в плагине

        Как получить данные пользователя сразу после авторизации через API

        Контролировать кэширование файлов CSS и JS MiniShop2

        Не приходят / не отправляются письма - в чем причина?

        Кэширование в MODX: использование $modx->cacheManager

        Наш сайт использует куки, нажмите «ОК» если вы не против
        OK