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, 17:06    ruslan   
2    162 0

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

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

          В корзине 2 наименования товара, но каждого наименования по несколько штук (в моем случае метров). Так вот в миникорзине мне надо вывести цифру 2, вместо 83(на скрине)
          1. Alex 05 сентября 2017, 09:37 # 0
            Сниппет миникорзины правь
        2. Сергей 05 сентября 2017, 09:03 # 0
          Да, на демо сайте в админке гляньте, там выводит кол-во НАИМЕНОВАНИЙ — вроде как вам это надо.
          Ну и понимать еще одну вещь, что например как у меня — майка с разными размерами — лежит в корзине как разные наименования!
          1. ruslan 05 сентября 2017, 09:13 # 0
            Если не сложно, подскажите поконкретнее где посмотреть
      2. Михаил 05 сентября 2017, 05:38 # 0
        Посмотрите стандартный чанк мини корзины минишопа. Там как раз есть.
        1. Алексей 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']) :-).
          В общем вариантов несколько…
          1. Алексей 05 сентября 2017, 11:10 # 0
            Изменение базового сервиса корзины документация
            1. ruslan 05 сентября 2017, 14:45 # 0
              Спасибо за наводку, успешно решил свой вопрос!
              1. Алексей 05 сентября 2017, 14:50 # 0
                Не за что! На то оно и сообщество.
                1. ruslan 05 сентября 2017, 14:52 # 0
                  На самом деле этот плейсхолдер сразу в коробку бы добавить, думаю частенько задача подобная появляется
            Вы должны авторизоваться, чтобы оставлять комментарии.