Корзина на главной

Здравствуйте. Подскажите пожалуйста как организовать вывод итоговой цены, колличества товаров и собственно самих товаров, находящихся в корзине, на главной странице?
Суть вот в чем. Есть кнопка корзины на которой должно отображаться колличество товаров в ней и их суммарная стоимость. При наведении на нее выпадает окно в котором отображенны эти товары.
Ростислав
09 июня 2015, 13:49
modx.pro
1 811
0

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

Павел Ширяев
09 июня 2015, 17:41
+1
Все оформляется сниппетом msMiniCart. Просто окно с товарами скрывайте изначально, и показывайте его по клику или через hover, с помощью JS или CSS.

PS: Лучше по клику, а не по наведению, — у тач устройств вообще нет такого понятия, как «наведение».
    Ростислав
    09 июня 2015, 18:01
    0
    Спасибо. Попробую.
      Ростислав
      09 июня 2015, 18:03
      0
      А как через msMiniCart вывести товары из корзины с картинками ценами и количеством?
        Павел Ширяев
        09 июня 2015, 18:39
        +1
        Можно попробовать:

        1. Вызвать msCart со списком в чанке msMiniCart;
        2. Посмотреть, как реализован вызов списка товаров в сниппете msCart и дописать msMiniCart.
          Ростислав
          12 июня 2015, 00:20
          0
          Сделал по первому способу. Все работает. Но при добавлении товара в корзину необходимо перегружать страницу. Подскажите как сделать что бы товар отображался сразу а не после перезагрузки страницы.
            Максим Кузнецов
            12 июня 2015, 01:34
            +1
            https://modx.pro/solutions/3942-dynamic-update-of-the-basic-basket/ + вот так исправлять ошибки в логе для реализации по первой ссылке.
              Ростислав
              12 июня 2015, 12:24
              0
              При добавлении товара сначала отображается массив с данными. После обновления страницы он приобретает нормальный вид.
                Максим Кузнецов
                12 июня 2015, 12:24
                +1
                $tplOuter = 'msCartOuter';
                $tplRow = 'msCartRow';
                — необходимо указать существующие чанки.
                  Ростислав
                  12 июня 2015, 12:31
                  0
                  Я указал. Они срабатывают только после обновления страницы. А до обновления отображается массив.
                    Ростислав
                    12 июня 2015, 12:54
                    0
                    И как мне сделать другое оформление для страницы с корзиной?
                      Максим Кузнецов
                      12 июня 2015, 12:57
                      +1
                      Другое оформление — редактировать содержимое в выставленных чанках.

                      По поводу массива — кидайте логи ошибок модкса, если в них что-то попадает. Ну и + чанки необходимо указывать те, которые есть в родном классе msCartProductHandler
                        Ростислав
                        12 июня 2015, 13:04
                        0
                        Лог файл пуст. Я итак указываю чанки которые в родном классе. Дело в том что они срабатывают только после перезагрузки страницы. до перезагрузки отображается массив.
                          Максим Кузнецов
                          12 июня 2015, 13:09
                          +1
                          Раз появляется массив — значит js нормально отправляет ajax-запрос и получает результат.

                          => проблема в классе корзины, которая возвращает данные, не распихав массив по чанку и его плейсхолдерам. Кидайте код класса корзины (+ вы ведь указали ваш новый класс в системных настройках minishop'a?)
                          Ростислав
                          12 июня 2015, 13:13
                          0
                          <?php
                          class msCartProductHandler extends msCartHandler {
                          	
                          	public function status($data = array()) {
                          		$status = array(
                          			'total_count' => 0
                          			,'total_cost' => 0
                          			,'total_weight' => 0
                          			,'cart' => $this->getProducts("")
                          		);
                          		foreach ($this->cart as $item) {
                          			if (empty($item['ctx']) || $item['ctx'] == $this->modx->context->key){
                          				$status['total_count'] += $item['count'];
                          				$status['total_cost'] += $item['price'] * $item['count'];
                          				$status['total_weight'] += $item['weight'] * $item['count'];
                          			}
                          		}
                          		return array_merge($data, $status);
                          	}
                          
                          	
                          	public function getProducts($cart) {
                          		$products = '';
                          		$cart = $this->get();
                          		
                          		if (!$this->modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
                          		$scriptProperties = array();
                          		$pdoFetch = new pdoFetch($this->modx, $scriptProperties);
                          
                          		$tplOuter = 'msCartOuter';
                          		$tplRow = 'minicart';		
                          		
                          		$products = array('goods' => '', 'total_count' => 0, 'total_weight' => 0, 'total_cost' => 0);
                          		foreach ($cart as $k => $v) {			
                          			$product = $this->modx->getObject('msProduct', $v['id']);
                          			$row['id'] = $product->get(id);
                          			$row['key'] = $k;
                          			$row['count'] = $v['count'];
                          			$row['pagetitle'] = $product->get('pagetitle');
                          			$row['thumb'] = $product->get('thumb');
                          			$row['old_price'] = $this->ms2->formatPrice(
                          				$row['price'] != $v['price']
                          					? $row['price']
                          					: $row['old_price']
                          			);
                          			$row['price'] = $this->ms2->formatPrice($v['price']);
                          			$row['weight'] = $this->ms2->formatWeight($v['weight']);
                          			$row['cost'] = $this->ms2->formatPrice($v['count'] * $v['price']);
                          
                          			if (!empty($v['options']) && is_array($v['options'])) {
                          				foreach ($v['options'] as $key => $value) {
                          					$row['option.'.$key] = $value;
                          				}
                          			}
                          			unset($v['options']);
                          
                          			$row['idx'] = $pdoFetch->idx++;	
                          			$products['goods'] .= empty($tplRow)
                          				? $pdoFetch->getChunk('', $row)
                          				: $pdoFetch->getChunk($tplRow, $row, $pdoFetch->config['fastMode']);
                          			$products['total_count'] += $v['count'];
                          			$products['total_cost'] +=  $v['count'] * $v['price'];
                          			$products['total_weight'] += $v['count'] * $v['weight'];
                          			
                          		}		
                          		
                          		$products['total_cost'] = $this->ms2->formatPrice($products['total_cost']);
                          		$products['total_weight'] = $this->ms2->formatWeight($products['total_weight']);
                          
                          		return empty($tplOuter)
                          			? $pdoFetch->getChunk('', $products)
                          			: $pdoFetch->getChunk($tplOuter, $products, $pdoFetch->config['fastMode']);
                          	}	
                          	
                          }
                          Да указал новый класс.
                          Максим Кузнецов
                          12 июня 2015, 13:16
                          +1
                          Если не ошибаюсь, с определенной версии minishop'a требуемые чанки выглядят вот так:
                          $tplOuter = 'tpl.msCart.outer';
                          $tplRow = 'tpl.msCart.row';
                          Проверьте, так ли называются ваши чанки и попробуйте заменить эти строчки.
                          Ростислав
                          12 июня 2015, 13:20
                          +1
                          Спасибо огромное за помощь. Теперь работает. Как всегда ошибка была на самом видном месте.
                          Не могли бы Вы еще объяснить как сделать разное оформление в корзине на главной которая сейчас динамически обновляется. И в корзине которая находиться на отдельной странице?
                          Максим Кузнецов
                          12 июня 2015, 13:28
                          0
                          Не за что.)

                          Если с минимальными потерями (корзины похожи, но отличаются незначительно) — то легче всего при помощи ксс..))
                          <div class="ms2_total_product mini">[[!msCart]]</div>
                          <div class="ms2_total_product main">[[!msCart]]</div>
                          В противном случае — редактировать основной javascript-файл, передавая в него параметр, какую страницу подгружать при обновлении и перехватывать его в классе корзины, добавляя зависимые от него условия вывода чанков.

                          Ну и (за это уже не ручаюсь) — посмотреть, переварит ли сниппет msCart параметры &tplRow и &tplOuter и, если нет, то добавить ему такую возможность (но это плохое решение [костыль], говорю сразу).
                          Ростислав
                          12 июня 2015, 13:39
                          0
                          В том то и проблема что отличаются сильно. Параметры &tplRow и &tplOuter он то съедает но срабатывают они только после перезагрузки страницы. Для отдельной страницы это в принципе нормально. но тогда портиться оформление корзины на главной после обновления страницы. Нельзя ли сделать так как в оригинале было, что бы параметры чанков брались с &tplRow и &tplOuter а не с тех что в классе указаны?
                          Максим Кузнецов
                          12 июня 2015, 13:48
                          0
                          Ммм… Тогда единственное решение — добавить скрытое поле в чанки outer'ов, которое будет переключать методы обновления и подцеплять его значение в скрипт на требуемые события miniShop2.Cart (change, status, remove, clean и так далее).

                          А дальше, когда значение уже передастся в класс-обработчик — выставить простое if/else-условие там, где определяются чанки.
                          Ростислав
                          12 июня 2015, 13:50
                          0
                          И как это сделать?))
                          Klike
                          19 августа 2015, 13:33
                          0
                          Ростислав, удалось реализовать? Если да, подскажи, пожалуйста)
                          Ростислав
                          19 августа 2015, 14:39
                          0
                          К сожалению не удалось. Сделал через MiniCart. Без отображения самих товаров, только количество и общая стоимость.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      22