Ранее показывал как добавлять скидки к заказу из админки. Сейчас покажу как это же можно сделать программно.
Пример добавления скидки в $10 для заказов с числом товаров больше 5:
/**
* Implements hook_commerce_order_presave().
*/
function MODULENAME_commerce_order_presave($order) {
$order_wrap = entity_metadata_wrapper('commerce_order', $order);
$line_items_quantity = commerce_line_items_quantity($order_wrap->commerce_line_items, commerce_product_line_item_types());
if ($line_items_quantity > 5) {
$discount = array(
'amount' => 1000, // cents
'currency_code' => 'USD',
);
$order_total = $order_wrap->commerce_order_total->value();
// Convert discount currency
if ($discount['currency_code'] != $order_total['currency_code']) {
$discount['amount'] = commerce_currency_convert($discount['amount'], $discount['currency_code'], $order_total['currency_code']);
$discount['currency_code'] = $order_total['currency_code'];
}
$order_wrap->commerce_order_total->amount = $order_total['amount'] - $discount['amount'];
$order_wrap->commerce_order_total->data = commerce_price_component_add($order_total, 'discount', $discount, TRUE);
}
}
Написанное актуально для
Commerce 1
Комментарии
как сделать что бы скидка срабатывала только определенных товаров?
xandeadx, может вы подскажите, как реализовать подобное вне хука commerce_order_presave()? Дело в том, что этот хук срабатывает ДО того как пользователь заполнит форму на странице checkout, а мне надо чтобы срабатывало ПОСЛЕ, по нажатию кнопки submit. Навешиваю на кнопку свой обработчик, пишу аналогичный код, но не работает.
просто выполните в нужный момент
commerce_cart_order_refresh($order)
, функция запустит hook_commerce_order_presave.xandeadx, добрый день, делаю функционал динамического увеличения стоимости заказа на определённую сумму, которую получаю от стороннего API. сумму передаю в _presave() доп.переменной.
кажется, я не совсем понял ваш последний комментарий о
commerce_cart_order_refresh($order)
делаю как-то так:
Боль : когда перехожу по адресу, например mysite.com/ajax/change-cart/11/250, итоговая стоимость заказа не меняется
Вопрос : когда запускать card_order_refresh и как через него передать переменную $summ в _presave?
Сапсибо
сделайте $summ глобальной переменной
Да, спасибо!
Остался только вопрос по commerce_cart_order_refresh — вызывает ли она _commerce_order_presave сама по себе или нужны дополнительные манипуляции?
В документации прямого вызова не нашёл.
как писал выше - вызывает сама
Привет!
надо изменить стоимость каждой позиции. делаю так
В $line все норм, но не считается сумма заказа http://i.imgur.com/qTLNxcN.png
Её нельзя автоматом подсчитывать?
http://xandeadx.ru/blog/drupal/786
Это не совсем скида или наценка. Цена зависит от разных мест (даже от значения элементов самой страницы), Т.е. нет какого-то одного правила.
Вообще я делаю форму заказа в один клик и в form_submit делаю вручную заказ. В нем делаю товар. В общем надо будет $order_wrapper->commerce_order_total установить самому?
Только почему так не помогает?
В общем изначально не правильно понимал суть компонентов ))
в итоге получилось так:
Стояла задача сделать динамический расчет стоимости доставки на странице
checkout в зависимости от того какая страна била вибрана пользователем в поле
сгенерированим модулем addressfield
Сделал так:
http://pastebin.com/CYxDNxfQ
Бил би рад если етот комертарий отнести в отдельний пост, может кому то пригодиться
Извиняюсь за такой русский, лень переключать
Интересно получается, добавляешь наценку на все товары через commerce_cart_line_item_refresh и commerce_product_calculate_sell_price_line_item_alter. Потом добавляешь скидку в commerce_order_presave. Все адеватно отображается и добавляется. А когда после payment , возвращается на сайт, сохраняет ордер со старыми ценами и без дисконта. Самое интересное что если убрать payment, то есть после review сразу complete , то сохраняет заказ адекватно. Не подскажете где искать проблему?Уже целый день ищу...
Добавить комментарий