К содержанию

Minishop2 количество товаров в корзине

Доброго времени дня!
Необходимо вывести в мини корзине количество товаров (кол-во строк в корзине).
Как вывести на странице разобрался:
count(($miniShop2->cart->get()));
А как сделать что бы при добавлении нового товара автоматически обновлялось не знаю.

Плейсхолдер {$total_count} видел, не подходит. Он выводит общее количество товара. В моем случае товар продается метрами.
Например: кладем в корзину 5 метров одного товара и 3 метра другого. Плейсхолдер
{$total_count} выведет 8, а надо 2 (т.к. в корзине 2 товара)

Решение:
1) Расширил класс корзины:
<?php
if(!class_exists('msCartHandler')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/mscarthandler.class.php';
}
class myCartHandler extends msCartHandler implements msCartInterface{

    public function status($data = array())
    {
        $status = array(
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_num' => 0,
        );
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_num']++;
            }
        }

        return array_merge($data, $status);
    }
}
— теперь у нас появился новый плейсхолдер — total_num

2) Что бы при добавлении в корзину у нас мини корзина сразу обновлялась дописал колбеки:
/* Добавление твоаров в корзине */
miniShop2.Callbacks.Cart.add.response.success = function(response) {
    //console.log(response.data['total_num']);
    miniShop2.Cart.totalNum = '.ms2_total_num';
    $(miniShop2.Cart.totalNum).text(response.data['total_num']);
};
/* Изменение твоаров в корзине */
miniShop2.Callbacks.Cart.change.response.success = function(response) {
    miniShop2.Cart.totalNum = '.ms2_total_num';
    $(miniShop2.Cart.totalNum).text(response.data['total_num']);
};
3) Добавляем в чанк с мини корзиной плейсхолдер и класс.
<span class="ms2_total_num">{$total_num}</span>
П.с. за наводку спасибо пользователю — Алексей
Руслан Сафин
Руслан Сафин
04 сентября 2017, 14:06
modx.pro
9 030
Реклама

Комментарии: 31

snyadanak
snyadanak Старожил
04 сентября 2017, 20:41
<span class="ms2_total_count">{$total_count}</span>
    Руслан Сафин
    Руслан Сафин Проверенный
    05 сентября 2017, 08:45
    Видел этот плейсхолдер, не подходит. Он выводит общее количество товара. В моем случае товар продается метрами.
    Например: кладем в корзину 5 метров одного товара и 3 метра другого. Плейсхолдер
    {$total_count}
    выведет 8, а надо 2 (т.к. в корзине 2 товара)
      snyadanak
      snyadanak Старожил
      05 сентября 2017, 09:03
      Не понял. У тебя один метр — это одна строка?
        Руслан Сафин
        Руслан Сафин Проверенный
        05 сентября 2017, 09:12
        По скриншоту думаю будет понятнее

        В корзине 2 наименования товара, но каждого наименования по несколько штук (в моем случае метров). Так вот в миникорзине мне надо вывести цифру 2, вместо 83(на скрине)
          snyadanak
          snyadanak Старожил
          05 сентября 2017, 09:37
          Сниппет миникорзины правь
        Сергей
        Сергей Старожил
        05 сентября 2017, 09:03
        Да, на демо сайте в админке гляньте, там выводит кол-во НАИМЕНОВАНИЙ — вроде как вам это надо.
        Ну и понимать еще одну вещь, что например как у меня — майка с разными размерами — лежит в корзине как разные наименования!
          Руслан Сафин
          Руслан Сафин Проверенный
          05 сентября 2017, 09:13
          Если не сложно, подскажите поконкретнее где посмотреть
      Михаил
      Михаил Эксперт
      05 сентября 2017, 05:38
      Посмотрите стандартный чанк мини корзины минишопа. Там как раз есть.
        Алексей Шумаев
        Алексей Шумаев Проверенный
        05 сентября 2017, 10:34
        http://prntscr.com/gh8rr0. Стандартно идёт ответ с общим количеством.

        Можно так: расширить класс mscarthandler.class.php, добавив методу status ещё один элемент, например total_num, где указывать то, что нужно. Он будет в response и его можно использовать в сниппете миникорзины или в js-callback miniShop2.Callbacks.Cart.change.response.success.
        Это универсально, т.к. можно добавлять любую информацию и, например, выводить красивое окошко с информацией о добавленном товаре, составе корзины, скидки и т.д.

        Можно как-то иначе, через плагин например, или сделать свой сниппет миникорзины, куда добавить нужный параметр, просто count($_SESSION['minishop2']['cart']) :-).
        В общем вариантов несколько…
          Алексей Шумаев
          Алексей Шумаев Проверенный
          05 сентября 2017, 11:10
          Изменение базового сервиса корзины документация
            Руслан Сафин
            Руслан Сафин Проверенный
            05 сентября 2017, 14:45
            Спасибо за наводку, успешно решил свой вопрос!
              Алексей Шумаев
              Алексей Шумаев Проверенный
              05 сентября 2017, 14:50
              Не за что! На то оно и сообщество.
                Руслан Сафин
                Руслан Сафин Проверенный
                05 сентября 2017, 14:52
                На самом деле этот плейсхолдер сразу в коробку бы добавить, думаю частенько задача подобная появляется
            Сергей
            Сергей Старожил
            23 апреля 2018, 00:06
            Здравствуйте! Подскажите, пожалуйста, куда колбеки вставить?
              Руслан Сафин
              Руслан Сафин Проверенный
              23 апреля 2018, 08:32
              У меня они просто отдельным js файлом подключены, после родного файла js от минишопа
                Сергей
                Сергей Старожил
                23 апреля 2018, 11:04
                Это в каком файле? Где то в ядре прописывается?
                  Руслан Сафин
                  Руслан Сафин Проверенный
                  23 апреля 2018, 11:44
                  Ниже отписал
                    Сергей
                    Сергей Старожил
                    25 апреля 2018, 11:29
                    Спасибо! Заработало. Правда пришлось не кастомный класс делать, а в существующий дописывать. (при создании кастомного класса — не работает) Понятное дело, что так не делается, но пока норм. Как будет время — переделаю)
              Владимир
              Владимир Старожил
              23 апреля 2018, 10:24
              «1) Расширил класс корзины:» и «2) Что бы при добавлении в корзину у нас мини корзина сразу обновлялась дописал колбеки:» это в каких конкретно файлах писать, где сохранять и как вызывать?
                Руслан Сафин
                Руслан Сафин Проверенный
                23 апреля 2018, 11:44
                1) Регистрируем свое расширение класса пример. Естествеено не delivery, а cart.

                2) Создаем пустой js файл, пишем туда колбеки и подключаем после файла default.js (стандартный файл минишопа) любый удобным для вас способом

                При этом ядро не страдает, мы его не меняем. Минишоп можно спокойно обновлять
                  Владимир
                  Владимир Старожил
                  23 апреля 2018, 12:46
                  «подключаем после файла default.js (стандартный файл минишопа) любый удобным для вас способом»

                  подключил свой js в настройках minishop2, где параметр «скрипты фронтенда». Получилась такая строка:
                  [[+jsUrl]]web/default.js, /assets/templates/vogelundnoot/js/customCart.js

                  в консоли браузера выводится сообщение: «Загрузка script по адресу «http://vogel-noot/assets/components/minishop2/js/web/default.js,%20/assets/templates/vogelundnoot/js/customCart.js?v=5784beb5e7» не удалась.»

                  В браузере нажимаешь на «купить» страница перезагружается, и в корзине общее количество товара (например, 3 штуки), а не количество позиций.
                    Руслан Сафин
                    Руслан Сафин Проверенный
                    23 апреля 2018, 13:02
                    Так не получится подключить.

                    Я в сниппет msMiniCart дописал на скорую руку
                    $modx->regClientScript('/assets/components/minishop2/js/web/callback.js');
                      Владимир
                      Владимир Старожил
                      23 апреля 2018, 13:27
                      Что-то не заработало.
                      1. Создал класс myCartHandler.php в /core/components/minishop2/custom/cart/myCartHandler.php
                      2. Написал регистрацию в консоли:
                      if ($miniShop2 = $modx->getService('miniShop2')) {
                          $miniShop2->addService('cart', 'myCartHandler',
                              '{core_path}components/minishop2/custom/cart/myCartHandler.php'
                          );
                      }
                      3. Написал callback в /assets/templates/vogelundnoot/js/customCart.js
                      4. Прописал его в /core/components/minishop2/elements/snippets/snippet.ms_minicart.php:
                      $modx->regClientScript('/assets/templates/vogelundnoot/js/customCart.js');
                      (я в середине файла прописал).

                      Кэш сайта сбрасывал. Но что-то не заработало. В миникорзине не отображается количество позиций в корзине.
                        Руслан Сафин
                        Руслан Сафин Проверенный
                        23 апреля 2018, 13:29
                        Не забыли?

                        3) Добавляем в чанк с мини корзиной плейсхолдер и класс.
                        {$total_num}

                          Владимир
                          Владимир Старожил
                          23 апреля 2018, 14:23
                          {$total_num} — это тоже сделал
                            Владимир
                            Владимир Старожил
                            23 апреля 2018, 14:35
                            <a id="msMiniCart" class="ms2_total_num" href="/korzina"><span>{$total_num}</span> товар(-ов)</a>
                            — вот так у меня.
                            Но не работает.
                              Владимир
                              Владимир Старожил
                              25 апреля 2018, 15:09
                              Я так и не разобрался, в чём дело.
                  Валерий
                  Валерий Старожил
                  12 февраля 2019, 18:38
                  Такой способ не работает «до конца». Когда страница обновлена, то все хорошо. Когда добавляешь еще один товар, то миникорзина показывает вновь общую сумму — после обновления страницы все опять верно.
                  Тоже дошел до такого «способа», но для странички заказа… Там такая же ерунда, при просчете итераций.
                    Slava
                    Slava Старожил
                    25 августа 2020, 15:04
                    А как расширять то? где создавать тот файл в самом верху, как его назвать?
                      Slava
                      Slava Старожил
                      26 августа 2020, 07:47
                      Зарегистрировал службу, но но мой пункт не создался, в колбеках пусто, тоже не показывает.

                      Сам код как вверху готовый.
                      службу назвал так

                      if ($miniShop2 = $modx->getService('miniShop2')) {
                          $miniShop2->addService('cart', 'CustomGoodsQuantity',
                              '{core_path}components/minishop2/custom/cart/mscarthandlerquantity.class.php'
                          );
                      }
                      Выполнил ее через консоль.
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      31