Динамическое обновление основной корзины
У MS2 есть хорошая вещь как возможность расширения класса msCartHandler. Все обновленные данные берутся $miniShop2->cart->status() и отсюда следует что нужно в этот массив данных дописать нужные нам данные, а именно список товаров которые попадут в [[+goods]]
И так начнем «колдовать»!Для начала создаем в папке core/components/minishop2/custom/cart файл msсartзroductрandler.class.php с следующим содержимым:
В файле assets/components/minishop2/js/web/default.js после строки
Осталось только обернуть вызов сниппета [[!msCart]] в блок с классом «ms2_total_products».
И так начнем «колдовать»!Для начала создаем в папке core/components/minishop2/custom/cart файл msсartзroductрandler.class.php с следующим содержимым:
<?php
class msCartProductHandler extends msCartHandler {
// сюда будут добавляться модифицированные функции
}Далее я залез в файл mscarthandler.class.php чтобы скопировать код функции status и модифицировать его как мне нужно, получилось следующее:<?php
class msCartProductHandler extends msCartHandler {
public function status($data = array()) {
$status = array(
'total_count' => 0
,'total_cost' => 0
,'total_weight' => 0
,'cart' => $this->getProducts() // добавил елемент в массив "status" куда будет генерироваться "большая" корзина.
);
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);
}
}Как можно заметить я добавил вывод функции getProducts, добавляем ее в наш модификатор и в итоге получаем такое его содержимое:<?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;}
$pdoFetch = new pdoFetch($this->modx, $scriptProperties);
$tplOuter = 'msCartOuter';
$tplRow = 'msCartRow';
$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['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']);
}
}Сохраняем файл. Переходим в систему управления, в настройки системы/minishop2/корзина и меняем класс обработчик корзины на msCartProductHandler.В файле assets/components/minishop2/js/web/default.js после строки
miniShop2.Cart.totalCost = '.ms2_total_cost'; дописываем miniShop2.Cart.totalProducts = '.ms2_total_products';и после $(miniShop2.Cart.totalCost).text(miniShop2.Utils.formatPrice(status['total_cost']));пишем $(miniShop2.Cart.totalProducts).html(status['cart']);Осталось только обернуть вызов сниппета [[!msCart]] в блок с классом «ms2_total_products».
Комментарии: 29
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Ну и редактировать default.js плохо — он перезапишется при обновлении.
Для потомков оставлю, если хотите выводить ещё и картинку от товара, то в классе корзины нужно добавить:
Не могу понять, почему выводит массив с данными, а не заменяет строки?
Вот код, который выводится:
Как превратить этот массив в обычные строки?
Но в логах все равно записывается ошибка.
логи чисты…
В настройках сниппета msCart вижу что указан чанк tpl.msCart.Outer'
Неужели надо самому создать чанк msCartOuter, в настройках снипета заменить tpl.msCart.Outer на tpl.msCartOuter?
Если страница грузится достаточно быстро, то можно избежать волокиты с дефолтными js.
modx.pro/help/3898#comment-113583