Как сделать скидки от количества товара?
Всем привет. Возникла необходимость сделать у каждого товара индивидуальные скидки от количества товара и когда покупатель кладет товар в корзинку, то в анонсе корзины он должен видеть уже пересчитанную стоимость товара.

Так же, у него должна быть возможность изменить количество товара в корзинке, когда он уже будет оформлять покупку.

Первое что пришло в голову, это установить MIGX и по средством TV параметра, скажем discount выгружать количество товара и скидок от которых они зависят, вот что получилось:
На странице мы видим вот такой список:
5 шт. — 0%
10 шт. — 5%
30 шт. — 10%
100 шт. — 20%
500 шт. — 30%
Нашёл в сообществе решение и решил на его базе сделать то, что мне нужно. Написать плагин с названием cartProcessing и системными событиями msOnAddToCart, msOnChangeInCart и msOnRemoveFromCart:
Так же, у него должна быть возможность изменить количество товара в корзинке, когда он уже будет оформлять покупку.
Первое что пришло в голову, это установить MIGX и по средством TV параметра, скажем discount выгружать количество товара и скидок от которых они зависят, вот что получилось:
<?php
$dis = $modx->resource->getTVValue('discount');
$a = json_decode($dis, true);
foreach ($a as $discount => $value) {
$count = $value["count"];
$price = $value["price"];
echo '<p>'.$count.' шт. - '.$price.'%</p>';
}На странице мы видим вот такой список:
5 шт. — 0%
10 шт. — 5%
30 шт. — 10%
100 шт. — 20%
500 шт. — 30%
Нашёл в сообществе решение и решил на его базе сделать то, что мне нужно. Написать плагин с названием cartProcessing и системными событиями msOnAddToCart, msOnChangeInCart и msOnRemoveFromCart:
<?php
switch ($modx->event->name) {
case 'msOnChangeInCart': case 'msOnAddToCart': case 'msOnRemoveFromCart':
$miniShop2 = $modx->getService('minishop2','miniShop2',
MODX_CORE_PATH . 'components/minishop2/model/minishop2/', $scriptProperties);
if (!($miniShop2 instanceof miniShop2)) return '';
// Инициализируем класс в текущий контекст
$miniShop2->initialize($modx->context->key, $scriptProperties);
$total_count = $miniShop2->cart->status()['total_count'];
$tmp = $miniShop2->cart->get();
$dis = $modx->resource->getTVValue('discount');
$a = json_decode($dis, true);
foreach ($a as $discount => $value) {
$count = $value["count"];
$price = $value["price"];
echo '<p>'.$count.' - '.$price.'</p>';
if ($total_count > $count) { // если 5 и более товаров
foreach ($tmp as $key1 => $value) {
if ($product = $modx->getObject('msProduct', $value['id'])) {
$realPrice = $product->get('price');
$tmp[$key1]['price'] = $price;
}
}
}
else {
foreach ($tmp as $key1 => $value) {
if ($product = $modx->getObject('msProduct', $value['id'])) {
$realPrice = $product->get('price');
$tmp[$key1]['price'] = $realPrice;
}
}
}
}
$miniShop2->cart->set($tmp);
break;
}Помогите пожалуйста, не умею я писать плагины из-за того, что не до конца понимаю принцип их работы. Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
У вас есть как минимум 2 способа реализовать данную задачу — через систему плагинов или через расширение класса корзины.
В обоих случаях принцип работы примерно такой:
— при требуемых событиях (добавление товара, изменение количества, удаление товара и тд) для каждого конкретного товара или циклом во всей корзине получаем параметры товаров
— из полученных данных выбираем id и запрашиваем для каждого товара кастомное тв-поле со списком скидок
— если тв-поле присутствует, то в отсортированным по необходимому для скидки количеству массиве, через цикл сверяем значение с количеством товара в корзине. Так получаем соответствующую скидку по количеству для каждого товара.
— умножаем скидку на исходную цену товара
— возвращаем значение
Осталось теперь придумать как это всё менять на лету, на странице с товаром и в корзине при оформлении заказа, может кто-нибудь в курсе как дописать этот скрипт, чтобы считалось всё на лету?
Есть еще такой вариант modx.pro/solutions/3942-dynamic-update-of-the-basic-basket/
но он у меня не пошел, все время что-то отваливается и работает не так.
У меня плагин ругается при попытке инициализации класса:
В файле minishop2.class.php на этих строчках регистрация клиентского скрипта:
И понятное дело плагин не срабатывает как задумывалось. В чём может быть проблема? Или minishop2 с тех пор настолько изменился что конфликтует?
Если в коротко, то при достижении например 400 грамм суммарно для всех товаров в корзине должна применяться для всех них скидка в 20% например.
Этот плагин идеально подходил бы к моей задаче, если бы не плевался в логи…
modx.pro/work/3953-the-price-of-the-goods-depending-on-the-number/
modx.pro/help/987/
modx.pro/help/3200/
Думаю, можно найти еще.