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
6
7 510
0

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

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

        В корзине 2 наименования товара, но каждого наименования по несколько штук (в моем случае метров). Так вот в миникорзине мне надо вывести цифру 2, вместо 83(на скрине)
          snyadanak
          05 сентября 2017, 09:37
          0
          Сниппет миникорзины правь
        Сергей
        Сергей
        05 сентября 2017, 09:03
        0
        Да, на демо сайте в админке гляньте, там выводит кол-во НАИМЕНОВАНИЙ — вроде как вам это надо.
        Ну и понимать еще одну вещь, что например как у меня — майка с разными размерами — лежит в корзине как разные наименования!
          Руслан Сафин
          05 сентября 2017, 09:13
          0
          Если не сложно, подскажите поконкретнее где посмотреть
      Михаил
      05 сентября 2017, 05:38
      0
      Посмотрите стандартный чанк мини корзины минишопа. Там как раз есть.
        Алексей Шумаев
        05 сентября 2017, 10:34
        0
        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
          0
          Изменение базового сервиса корзины документация
            Руслан Сафин
            05 сентября 2017, 14:45
            0
            Спасибо за наводку, успешно решил свой вопрос!
              Алексей Шумаев
              05 сентября 2017, 14:50
              0
              Не за что! На то оно и сообщество.
                Руслан Сафин
                05 сентября 2017, 14:52
                0
                На самом деле этот плейсхолдер сразу в коробку бы добавить, думаю частенько задача подобная появляется
            Сергей
            23 апреля 2018, 00:06
            0
            Здравствуйте! Подскажите, пожалуйста, куда колбеки вставить?
              Руслан Сафин
              23 апреля 2018, 08:32
              0
              У меня они просто отдельным js файлом подключены, после родного файла js от минишопа
                Сергей
                23 апреля 2018, 11:04
                0
                Это в каком файле? Где то в ядре прописывается?
                  Руслан Сафин
                  23 апреля 2018, 11:44
                  0
                  Ниже отписал
                    Сергей
                    25 апреля 2018, 11:29
                    0
                    Спасибо! Заработало. Правда пришлось не кастомный класс делать, а в существующий дописывать. (при создании кастомного класса — не работает) Понятное дело, что так не делается, но пока норм. Как будет время — переделаю)
              Владимир
              23 апреля 2018, 10:24
              0
              «1) Расширил класс корзины:» и «2) Что бы при добавлении в корзину у нас мини корзина сразу обновлялась дописал колбеки:» это в каких конкретно файлах писать, где сохранять и как вызывать?
                Руслан Сафин
                23 апреля 2018, 11:44
                0
                1) Регистрируем свое расширение класса пример. Естествеено не delivery, а cart.

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

                При этом ядро не страдает, мы его не меняем. Минишоп можно спокойно обновлять
                  Владимир
                  23 апреля 2018, 12:46
                  0
                  «подключаем после файла 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
                    0
                    Так не получится подключить.

                    Я в сниппет msMiniCart дописал на скорую руку
                    $modx->regClientScript('/assets/components/minishop2/js/web/callback.js');
                      Владимир
                      23 апреля 2018, 13:27
                      0
                      Что-то не заработало.
                      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
                        0
                        Не забыли?

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

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

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

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