Корзина на главной
Здравствуйте. Подскажите пожалуйста как организовать вывод итоговой цены, колличества товаров и собственно самих товаров, находящихся в корзине, на главной странице?
Суть вот в чем. Есть кнопка корзины на которой должно отображаться колличество товаров в ней и их суммарная стоимость. При наведении на нее выпадает окно в котором отображенны эти товары.
Суть вот в чем. Есть кнопка корзины на которой должно отображаться колличество товаров в ней и их суммарная стоимость. При наведении на нее выпадает окно в котором отображенны эти товары.
Комментарии: 22
Все оформляется сниппетом msMiniCart. Просто окно с товарами скрывайте изначально, и показывайте его по клику или через hover, с помощью JS или CSS.
PS: Лучше по клику, а не по наведению, — у тач устройств вообще нет такого понятия, как «наведение».
PS: Лучше по клику, а не по наведению, — у тач устройств вообще нет такого понятия, как «наведение».
Спасибо. Попробую.
А как через msMiniCart вывести товары из корзины с картинками ценами и количеством?
Можно попробовать:
1. Вызвать msCart со списком в чанке msMiniCart;
2. Посмотреть, как реализован вызов списка товаров в сниппете msCart и дописать msMiniCart.
1. Вызвать msCart со списком в чанке msMiniCart;
2. Посмотреть, как реализован вызов списка товаров в сниппете msCart и дописать msMiniCart.
Сделал по первому способу. Все работает. Но при добавлении товара в корзину необходимо перегружать страницу. Подскажите как сделать что бы товар отображался сразу а не после перезагрузки страницы.
https://modx.pro/solutions/3942-dynamic-update-of-the-basic-basket/ + вот так исправлять ошибки в логе для реализации по первой ссылке.
При добавлении товара сначала отображается массив с данными. После обновления страницы он приобретает нормальный вид.
$tplOuter = 'msCartOuter';
$tplRow = 'msCartRow';
— необходимо указать существующие чанки.
Я указал. Они срабатывают только после обновления страницы. А до обновления отображается массив.
И как мне сделать другое оформление для страницы с корзиной?
Другое оформление — редактировать содержимое в выставленных чанках.
По поводу массива — кидайте логи ошибок модкса, если в них что-то попадает. Ну и + чанки необходимо указывать те, которые есть в родном классе msCartProductHandler
По поводу массива — кидайте логи ошибок модкса, если в них что-то попадает. Ну и + чанки необходимо указывать те, которые есть в родном классе msCartProductHandler
Лог файл пуст. Я итак указываю чанки которые в родном классе. Дело в том что они срабатывают только после перезагрузки страницы. до перезагрузки отображается массив.
Раз появляется массив — значит js нормально отправляет ajax-запрос и получает результат.
=> проблема в классе корзины, которая возвращает данные, не распихав массив по чанку и его плейсхолдерам. Кидайте код класса корзины (+ вы ведь указали ваш новый класс в системных настройках minishop'a?)
=> проблема в классе корзины, которая возвращает данные, не распихав массив по чанку и его плейсхолдерам. Кидайте код класса корзины (+ вы ведь указали ваш новый класс в системных настройках minishop'a?)
<?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']);
}
}
Да указал новый класс.
Если не ошибаюсь, с определенной версии minishop'a требуемые чанки выглядят вот так:
$tplOuter = 'tpl.msCart.outer';
$tplRow = 'tpl.msCart.row';
Проверьте, так ли называются ваши чанки и попробуйте заменить эти строчки.
Спасибо огромное за помощь. Теперь работает. Как всегда ошибка была на самом видном месте.
Не могли бы Вы еще объяснить как сделать разное оформление в корзине на главной которая сейчас динамически обновляется. И в корзине которая находиться на отдельной странице?
Не могли бы Вы еще объяснить как сделать разное оформление в корзине на главной которая сейчас динамически обновляется. И в корзине которая находиться на отдельной странице?
Не за что.)
Если с минимальными потерями (корзины похожи, но отличаются незначительно) — то легче всего при помощи ксс..))
Ну и (за это уже не ручаюсь) — посмотреть, переварит ли сниппет msCart параметры &tplRow и &tplOuter и, если нет, то добавить ему такую возможность (но это плохое решение [костыль], говорю сразу).
Если с минимальными потерями (корзины похожи, но отличаются незначительно) — то легче всего при помощи ксс..))
<div class="ms2_total_product mini">[[!msCart]]</div>
<div class="ms2_total_product main">[[!msCart]]</div>
В противном случае — редактировать основной javascript-файл, передавая в него параметр, какую страницу подгружать при обновлении и перехватывать его в классе корзины, добавляя зависимые от него условия вывода чанков.Ну и (за это уже не ручаюсь) — посмотреть, переварит ли сниппет msCart параметры &tplRow и &tplOuter и, если нет, то добавить ему такую возможность (но это плохое решение [костыль], говорю сразу).
В том то и проблема что отличаются сильно. Параметры &tplRow и &tplOuter он то съедает но срабатывают они только после перезагрузки страницы. Для отдельной страницы это в принципе нормально. но тогда портиться оформление корзины на главной после обновления страницы. Нельзя ли сделать так как в оригинале было, что бы параметры чанков брались с &tplRow и &tplOuter а не с тех что в классе указаны?
Ммм… Тогда единственное решение — добавить скрытое поле в чанки outer'ов, которое будет переключать методы обновления и подцеплять его значение в скрипт на требуемые события miniShop2.Cart (change, status, remove, clean и так далее).
А дальше, когда значение уже передастся в класс-обработчик — выставить простое if/else-условие там, где определяются чанки.
А дальше, когда значение уже передастся в класс-обработчик — выставить простое if/else-условие там, где определяются чанки.
И как это сделать?))
Ростислав, удалось реализовать? Если да, подскажи, пожалуйста)
К сожалению не удалось. Сделал через MiniCart. Без отображения самих товаров, только количество и общая стоимость.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.