Количество позиций в корзине minishop2

Если в корзину добавить Товар1 в количестве 2, и Товар2 в количестве 2, то общее количество товара показывает 4. Можно ли сделать, чтоб показывались именно позиции, в данном случае 2?
Максим
14 июня 2017, 10:39
modx.pro
2
2 366
0

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

Андрей
15 июня 2017, 17:32
2
0
Надо плагин сделать для минишопа как описано тут.

Работает это с версии минишоп 2.4 как я понимаю.

1. В папке /core/components/minishop2/custom/cart/ создаете файл mascarthandlerstatus.class.php который будет расширять класс корзины

2. В этом файле пишете
<?php

if(!class_exists('msCartInterface')) {
    require_once dirname(dirname(dirname(__FILE__))) . '/model/minishop2/mscarthandler.class.php';
}

class msCartHandlerStatus extends msCartHandler implements msCartInterface{

    public function status($data = array())
    {
        $status = array(
            'total_count' => 0,
            'total_count_position' => 0,
            'total_cost' => 0,
            'total_weight' => 0
        );

        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count_position'] += 1;
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
            }
        }

        return array_merge($data, $status);
    }
}

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

4. Далее идем в Системные настройки -> mimishop2 -> Класс обработчик корзины и указываем там msCartHandlerStatus

5. Теперь в плейсхолдере total_count_position будет отображаться количество позиций в корзине

6. Что бы все это и по аяксу обновлялось, в js в ваших скриптах или просто в конце страницы (главное что бы он был после подключения скрипта от минишопа) добавляем такой код
miniShop2.Cart.status = function (status) {
  if (status['total_count'] < 1) {
      location.reload();
  }
  else {
      var $miniCart = $(miniShop2.Cart.miniCart);
      if (status['total_count'] > 0 && !$miniCart.hasClass(miniShop2.Cart.miniCartNotEmptyClass)) {
          $miniCart.addClass(miniShop2.Cart.miniCartNotEmptyClass);
      }
      $(miniShop2.Cart.totalWeight).text(miniShop2.Utils.formatWeight(status['total_weight']));
      $(miniShop2.Cart.totalCount).text(status['total_count']);
      $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost']));
      $('.ms2_total_count_position').text(status['total_count_position']);
      if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) {
          miniShop2.Order.getcost();
      }
  }
};

7. Теперь в миникорзине или корзине можно писать так
<span class="ms2_total_count_position">{$total_count_position}</span>
    Максим
    20 июня 2017, 18:28
    0
    выполнение кода в Console даёт ошибку
    Fatal error: Call to undefined method miniShop2::addService()
      Воеводский Михаил
      20 июня 2017, 18:51
      0
      Посмотрите версию minishop2 — скорее всего, ниже 2.4. Указанный метод появился только в 2.4. Если так, выполнять код не требуется — достаточно сохранить файл по указанному адресу.
        Максим
        20 июня 2017, 19:02
        0
        minishop2 версии 2.2
        как в таком случае быть, можно ли получить кол-во позиций?
          Андрей
          20 июня 2017, 19:14
          0
          Просто, пропустите этот шаг

          Плейсхолдер у вас тогда будет выглядеть так
          <span class="ms2_total_count_position">[[+total_count_position]]</span>
            Максим
            20 июня 2017, 19:57
            0
            если я правильно понимаю, что происходит в 3ем пункте, то его пропустить не получится… на практике так и получается, не работает
              Андрей
              20 июня 2017, 20:11
              0
              Посмотрите, есть ли ошибки в логах модх и сервера.
                Максим
                20 июня 2017, 20:18
                0
                Recoverable error: Argument 1 passed to pdoFetch::replaceTVCondition() must be of the type array, null given
                вроде бы не связана с данной задачей
      Максим
      20 июня 2017, 19:23
      0
      если 6ой пункт не обязателен, а 3ий исключаем, тогда всё сделал, теперь пишет, что корзина пуста, даже после добавления товаров… это произошло после 4го пункта
        Сергей Кепкин
        15 ноября 2017, 13:49
        0
        Показать кол-во позиции и все, скриптом посчитать кол-во строк в заказе не судьба что ли?
          Максим
          15 ноября 2017, 14:15
          0
          дельный совет, «спасибо»… как я до этого сразу не додумался
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11