Пример вывода msProducts
[[!msProducts? &limit=`7` &parents=`19` &depth=`10` &includeThumbs=`360x270` &includeTVs=`1` &tpl=`tpl.msProducts.action.item.GO` &where=`{"Data.old_price:!=":"0"}` ]]
Добавить превьюшки
Медиа
- Управление медия
- MS2 Images
- thumbnails
(Чтобы не было обрезки надо указать zc : 0
)
[[+image]]
— плейсхолдер для большого изображения при выводе в msProducts
.
Если нужно сделать несколько вариантов изображения, то вот примерно такой код нужно разместить в thumbnails
:
{ "tiny":{"w":100,"h":100,"q":90,"zc":"1","bg":"ffffff"}, "210x210":{"w":210,"h":210,"q":90,"zc":"1","bg":"ffffff"}, "normal":{"w":550,"h":550,"q":90,"zc":"1","bg":"ffffff"} }
Показать товары в древе ресурсов
Системные настройки
- minishop2
- Показывать в дереве по умолчанию (ms2_product_show_in_tree_default
)
Файл, который отвечает за обработку событий по Ajax, отправляемых на /assets/components/minishop2/action.php
, в частности cart/add
cart/change
cart/remove
cart/clean
cart/get
order/add
order/submit
order/getcost
order/getrequired
order/clean
order/get
оказывается плагином, который называется miniShop2.
Пара фильтров для вывода msProducts
&where=`{"Data.old_price:!=":"0"}`
— Вывести товары с особой ценой&where=`{"Data.new":"1"}`
— Вывести товары с отметкой Новый&where=`{"Data.popular":"1"}`
— Вывести товары с отметкой Популярный&where=`{"Data.favorite":"1"}`
— Вывести товары с отметкой Особый
Добавить в корзину несколько товаров
В моем случае попытка запустить цикл скриптом увенчалась неудачей. Решил не писать костыли вроде СетТаймаут, и закрыть вопрос чуть более правильно.
Вносим изменения в палагин miniShop2: внутри case
OnLoadWebDocument добавляем что вроде:
case 'cart/add/multiple': $ids = explode(",", $_POST['ids']); foreach($ids as $id){ $response = $miniShop2->cart->add($id, 1, $_POST['options']); } break;
По-хорошему следовало бы внедриться в файл assets/components/minishop2/js/web/default.js
И там настроить правильную запаковку, отсылку и обработку данных, но заморачиваться с этим сейчас нет времени и желания, поэтому закроем костылем. Костыль не страшный. Просто мы сами сделаем все операции с данными:
// HTML код для данного скрипта решил не выкладывать, т.к. все равно верстка индивидаульна. Пробежитесь по скрипту, просто главное логику понять $(".order-trigger").click(function(){ // это типа кнопка "положить в корзину много товаров" pw = $('.product-wrapper').find('.ms2_product'); prodIds = []; //айдишники товаров (именнотоваров, а не ресурсов) pw.each(function(){ // находим каждый товар var t = $(this); var thisCheck = t.find('.checked-product').prop('checked'); if(thisCheck){ prodIds[prodIds.length] = parseInt(t.find('.product_id').val()); } }); var data =[ // такой массив ожидается на сервере {name: 'ids', value: prodIds}, {name: 'count', value: '1'}, {name: 'options', value: '[]'}, {name: 'ms2_action', value: 'cart/add/multiple'}, {name: 'ctx', value: 'web'}, ]; console.log(data); $.ajax({ type: "POST", data: data, url:'/assets/components/minishop2/action.php', dataType:'json', success: function(data){ if(success == true){ $.jGrowl("Товары комплекта добавлены в корзину",{ theme: 'ms2-message-success' }); // выводим сообщение об успешной операции } }, error: function (xhr, ajaxOptions, thrownError){ console.log(xhr.responseText); } }); });
Изменить цену товаров в корзине minishop2 при добавлении определенного товара
В частности в моем случае задача была такая:
О тот как добавить несколько товаров в корзину 1 кликом пожно почитать тут.
Открываем код сниппета msCart и начинаем ваять костыль!
// Находим в коде $cart = $miniShop2->cart->get(); // и сразу после вставляем: $ustanovka = false; foreach($cart as $k => $v){ if($v['id'] == 39){ // Это id товара, который являет собой услугу "Установка" цифра соотвествует id ресурса $ustanovka = true; } } /********/ // Далее по коду ищем что-то такое: foreach ($cart as $k => $v) И после него вставляем : if($ustanovka){ $v['price'] = $v['price']*1.15; }
Фильтрация mFilter
Пример вывода:
[[!mFilter2? &parents=`[[*id]]` &element=`msProducts` &limit=`21` &includeThumbs=`240x180` &includeTVs=`1` &filters=` ms|price:number ,ms|vendor:vendors` &toPlaceholders=`my.` &tpl=`tpl.msProducts.row.GO` &tplFilter.outer.default=`tpl.mFilter2.filter.outer.GO` // кастомный tpl &tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider` // стандартный tpl (обратить внимание на "ms|price" - это связь с фильтром из параметра "filters") &tplFilter.row.ms|price=`tpl.mFilter2.filter.number` // стандартный tpl ]]
Изменение цены при добавлении в корзину minishop2
Цена в minishop2 по курсу валюты
- Создаем TV
usd_price
:
Тип:чекбокс
;
возможные значения:Да==1||Нет==0
;
Значение по умолчанию:Нет==0
. - Создаем системную настройку:
ms2_usd_value
, значение — 80 (нынешний курс валюты) - Создаем плагин на событие
msOnBeforeAddToCart
Код плагина (не забыть установить системное событие):
if ($modx->event->name == 'msOnBeforeAddToCart') { $tv = $modx->getObject('modTemplateVar', array('name' => 'usd_price')); $modx->log(xPDO::LOG_LEVEL_ERROR, $tv->getValue($product->get('id'))); // для дебага $modx->log(xPDO::LOG_LEVEL_ERROR, $modx->getOption('ms2_usd_value')); // для дебага if($tv->getValue($product->get('id')) != 0){ $newPrice = (int)$modx->getOption('ms2_usd_value') * (int)$product->get('price'); $product->set('price', $newPrice); } }
Поместить параметр вывода в плейсхолдер
Речь идет о том, чтобы в санке бала возможность вывести какой-то параметр, который был передан при вызове сниппета. К примеру параметр tpl
будет доступен в [[+property.tpl]]
. И так со всеми параметрами.
Эта штука реализована в MIGX и иногда бывает крайне полезна. К примеру в проекте у меня есть шаблон вывода товаров, он одинаковый везде, но кое-где нужно использовать класс col-xs-3
, а где-то col-xs-4
. Делать под это условие с привязкой за шаблон, или тем более создавать отдельный чанк не хочется. Куда проще - передать класс при вызове сниппета.
Но такого функционала в msProducts не предусмотрено. Ок, добавим - нужно просто скопировать часть кода ниже в код сниппета msProducts:
// Этот код разместить перед блоком "Processing rows" (...if (!empty($rows) && is_array($rows)) {...): $properties = array(); foreach ($scriptProperties as $property => $value) { $properties['property.' . $property] = $value; } // Эту строчку добавить перед $tpl = $pdoFetch->defineChunk($row)... В общем перед выводом всех данных в чанк $row = array_merge($row, $properties);
Разная цена в зависимости от кол-ва товара в корзине
Код плагина:
Стоит отметить, что поля price500/price5/price4/price3/price2
были созданы предварительно.
switch ($modx->event->name) { case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart': $tmp = $cart->get(); //$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($tmp, true)); foreach ($tmp as $key1 => $value) { if ($product = $modx->getObject('msProduct', $value['id'])) { $quantity = $value['count']; if ($quantity > 499) { $tmp[$key1]['price'] = $product->get('price500'); } elseif ($quantity > 99) { $tmp[$key1]['price'] = $product->get('price5'); } elseif ($quantity > 49) { $tmp[$key1]['price'] = $product->get('price4'); } elseif ($quantity > 29) { $tmp[$key1]['price'] = $product->get('price3'); } elseif ($quantity > 9) { $tmp[$key1]['price'] = $product->get('price2'); } else { $realPrice = $product->get('price'); $tmp[$key1]['price'] = $realPrice; } } } //$modx->log(xPDO::LOG_LEVEL_ERROR, $realPrice); $cart->set($tmp); break; }
Расширение свойств классов MiniShop2
Переходим в папку core/components/minishop2/custom/
и выбираем подходящее место для файлика - в зависимости от того, что мы саобираемся расширять. Допустим это будет order
. Создаем файл с любым названием, которое оканчивается на .class.php
.
Внутри этого файлика пишем
class msOrderHandlerMy extends msOrderHandler{ // И тут уже можно переопределить существующий метод, либо создать свой. }
После этого переходим в системные настройки MiniShop2, и там указываем имя вашего класса (мой пример msOrderHandlerMy
) в настройке ms2_order_handler_class
, или ms2_cart_handler_class
для нового msCartHandler
Родные методы храняться в файлах:
core/components/minishop2/model/minishop2/msorderhandler.class.php
core/components/minishop2/model/minishop2/mscarthandler.class.php
core/components/minishop2/model/minishop2/msdeliveryhandler.class.php
core/components/minishop2/model/minishop2/mspaymenthandler.class.php
Динамически обновлять цены при изменении кол-ва в корзине
Эта задача наиболее актуальна при разных ценах на товары в зависимости от кол-ва. (см. пункт выше)
Нам надо будет подправить JS файлик assest/components/minishop2/js/web/default.js
, а также расширить класс msCartHandler (см. выше)
Создаем файлик по инструкции:
class msCartHandlerMy extends msCartHandler{ public function status($data = array()) { $status = array( 'total_count' => 0, 'total_cost' => 0, 'total_weight' => 0, ); $status['cart'] = $this->cart; // Добавляем только эту строчку к оригинальному методу 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 = array_merge($data, $status); $response = $this->ms2->invokeEvent('msOnGetStatusCart', array( 'status' => $status, 'cart' => $this, )); if ($response['success']) { $status = $response['data']['status']; } return $status; } }
Переходим теперь к файлику assets/components/minishop2/js/web/default.js
. Находим status: function (status) {
, и там через console.log(status);
для начала убеждаемся, что получаем данные о корзине, и о каждом товаре.
И теперь в этом методе уже куда угодно сортируем полученные данные. Например так:
$.each(status.cart, function(key, value) { $("#" + key).find(".price").text(miniShop2.Utils.formatPrice(value.price)); }); // Я разместил перед вот этой строчкой: // if ($(miniShop2.Order.orderCost, miniShop2.Order.order).length) {
а не подскажете как сделать добавление/удаление товара в(из) корзину(ы) по чекбоксу на странице оформления заказа? т.е. при установке галочки определённый товар добавлялся в корзину, а при снятии этой галочки чтобы удалялся из корзины. как добавить — понятно вроде, а вот как убрать?
Можете подсказать куда сейчас надо это вписать?
Это по поводу «Добавить в корзину несколько товаров»