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
5
2 747
0

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

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
Такой способ не работает «до конца». Когда страница обновлена, то все хорошо. Когда добавляешь еще один товар, то миникорзина показывает вновь общую сумму — после обновления страницы все опять верно.
Тоже дошел до такого «способа», но для странички заказа… Там такая же ерунда, при просчете итераций.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
29