Давайте рассуждать. Чтобы было легче идём сюда. Событие msOnBeforeSaveOrder как-то связано с сохранением заказа, учитывая задачу, пользователя надо бы оповестить о том, что выбрав доставку он теряет скидки и хорошо бы показать сколько он в итоге должен заплатить. На этапе сохранения заказа это сделать невозможно. Однако, если присмотреться к списку событий внимательно, то можно заметить, что порядок событий в нём точно такой же в каком они происходят при совершении покупки. И тогда становится очевидным, что перед сохранением заказа происходит ещё много событий. Какое же из них выбрать? Я думаю то, которое как-то связано со стоимостью заказа, ведь в конечном итоге меняется именно она. Я бы начал с msOnBeforeGetOrderCost, в него передается экземпляр класса корзина и экземпляр класса заказ. Из второго объекта получаем способ доставки, если это не самовывоз делаем так
if($order->get('delivery') != 1){
$tmp = $cart->get();
foreach($tmp as $k => $v){
$product = $modx->getObject('modResource', array('class_key' => 'msProduct', 'id' => $v['id']));
$tmp[$k][$v]['price'] = $product->get('price');
}
} else{
// скидки надо возвращать, если выбран самовывоз
}
$cart->set($tmp);
Код выше это, конечно, не окончательное решение, а просто для направления мысли.
В чанке [[+caption]] и [[+value]]:
Кстати, верный ID категории можно узнать в Элементы » Категории.
Код выше это, конечно, не окончательное решение, а просто для направления мысли.
И тут уже можно играть как хочешь. Например обьяснить что ты программист и отвечаешь только за сооружение каркаса палатки, или ты ещё дизайнер, или строитель дорог. И естественно каждый этап работ стоит денег, и что за 5-7 тыс он получит просто палатку в поле. После таких аналогий как правило клиент проникает к вам с доверием и реально понимает за что он платит.
Работает в 99%, пользуйтесь или придумайте свою аналогию))
https://github.com/OwlCarousel2/OwlCarousel2/issues/1861 — вот тут пример есть:
Предварительно создаем настройки
sms_ru_api_id — api ключ, который дадут при регистрации на сайте
manager_phone — номер телефона получателя
шаг 1. создаю каталог с товарами, товары в нем — это упаковки, задаю им цены.
шаг 2. создаю дополнительные поля товара, как это делается — тут неоднократно писалось на сайте. поля такие: ID коробки и Кол-во данного товара на единицу упаковки, т.е. вместимость. У всех товаров, у которых предполагается упаковка, заполняю эти поля.
шаг 3. создается плагин на события
'msOnAddToCart': // получает $key и $cart
'msOnChangeInCart': // получает $key, $count и $cart
'msOnRemoveFromCart': // получает $key и $cart
в плагине получаю массив коробок из известного мне каталога.
Потом из переменной $cart методом get() получаю содержимое корзины $tmp = $cart->get();, пробегаю по товарам в цикле и там смотрю, каков id коробки и параметр вместимости товара и сколько этого товара в заказе, таким образом высчитываю сколько и каких коробок надо для такого количества товара.
Тут есть нюанс: если до этого момента коробок в заказе не было (например при событии msOnAddToCart) то нужно напрямую добавлять в заказ коробки методом $cart->add($box_id); а если коробка уже была в заказе, например при изменении количества товара в корзине (msOnChangeInCart и msOnRemoveFromCart) то тут уже работаем с $tmp, меняя только count для коробок, и по итогу перезаписываем корзину его содержимым: $cart->set($tmp);
После (у меня это 29 строка)
добавить
Сейчас уже не вспомню зачем я записываю в $data такой массив.
Но minishop подхватывает это уведомление и выводит ошибку, при этом форма не отправляется.