Тема: Скидка на товар от количества

Подскажите, пожалуйста, возможно ли при добавлении в корзину определенного количества некоторого товара делать на данный товар (только на данный) скидку?
Вариант 1. Пробовал цепляться на события корзины, но там только количество.
Вариант 2. Менять getCost из Orm/Product.inc.php. У меня эта функция уже с доработками (проверяется максимальная скидка на товар и корректируется его цена )

Re: Скидка на товар от количества

Подскажите, пожалуйста, возможно ли при добавлении в корзину определенного количества некоторого товара делать на данный товар (только на данный) скидку?

А Вы не рассматриваете модуль правила для корзины?
http://marketplace.readyscript.ru/addons/cartrules/

Re: Скидка на товар от количества

Рассматривал, при ручном вводе правил модуль великолепен. Куплю его на другие магазины.
Но тут 10 000 товаров, у большинства разная скидка в зависимости от определенного количества. Еще есть и предельная скидка для товара, предельная для пользователя.
В итоге, чтобы модуль сработал, надо автоматом раз в день 2000-3000 правил добавлять.

Re: Скидка на товар от количества

Намного все хуже оказалось. Версия системы достаточно старая и модель корзины не поддерживает скидки на товар, индивидуальную цену.
Пришлось менять модель продукта(

5

Re: Скидка на товар от количества

По идее в модели товара должно быть событие afterLoad, где можно будет менять параметры товара в зависимости от ситуации.
Опасное событие на самом деле особенно в списках товаров. Надо как-то продумать.
Тогда откроется путь к изменению цен и прочих параметров товара.

Повысить оценку Понизить оценку

6

Re: Скидка на товар от количества

В корзину можно добавлять произвольную скидку к товару. Делается с помощью обработки события cart.update.after.

Примерный код:

<?php
class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this
            ->bind('cart.addproduct.after', null, 'applyCartRules')
            ->bind('cart.update.after', null, 'applyCartRules');
    }

    /**
    * Обработчик будет вызываться, при добавлении или изменении товара в корзине
    * 
    * @param \Shop\Model\Cart $cart
    */
    public static function applyCartRules($params) 
    {
        $cart = $params['cart'];
        if (!isset($cart->is_cartrules_action)) { //Защита от рекурсии
            
            $cart->is_cartrules_action = true; //Защита от рекурсии
            
            $cart_product_items = $cart->getProductItems();
            foreach($cart_product_items as $uniq => $data) {
                
                //Добавляем товару Uniq скидку
                $cart->update(array(
                    $uniq => array(
                        'discount' => '50%' //Можно также в рублях, если процент в конце не ставить.
                    )
                ));
            }
        }
    }
}

Повысить оценку +1 Понизить оценку

Re: Скидка на товар от количества

Спасибо большое!
Я обновил модуль shop до версии с моделью корзины, которая позволяет делать апдейт скидок (2.0.0.96 кажется)
и использовал Ваш код. Все получилось!

Re: Скидка на товар от количества

Возникла проблема с заказами со скидкой.
1. Заказ создается со товарами со скидкой
http://joxi.ru/xAe14BbFYz5QoA
2. если в заказе обновляешь, например "статус", то товары пересчитываются формуле "цена товара"x"количество", скидка пропадает и стоимость увеличивается.
Товар до обновления: http://joxi.ru/eAO7wWBC41DMEA
Товар после: http://joxi.ru/KAg8wBeFgz7Qxr

Re: Скидка на товар от количества

Проверил на самой последней версии движка с чистой базой. При сохранении заказа слетают все скидки.
В районе 379 строки в orderctrl.inc.php до  $order->getCart()->saveOrderData()  есть данные о скидках, потом уже записи заказа удаляются, а новые уже не имеют скидки.

10

Re: Скидка на товар от количества

Напишите, пожалуйста, в поддержку тикет со ссылкой на текущую ветку форума.

Повысить оценку Понизить оценку

11

Re: Скидка на товар от количества

Проверили, у себя не смогли воспроизвести ошибку, скидка все время сохраняется.
Предполагаем, что у вас не самая свежая версия модуля shop. Текущая версия модуля Shop - 2.0.0.171

Повысить оценку Понизить оценку

12 Отредактировано Ярослав (01.11.2016 23:29:50)

Re: Скидка на товар от количества

Отписался в техподдержке. Проверял и на старой и на новой. Тестовый сайт обновил до самой свежей версии.
В cart.inc.php удаляются старые элементы заказа из таблицы, а новые уже без discount добавляются.

function saveOrderData()
    {
        \RS\Orm\Request::make()->delete()
            ->from(new Orm\OrderItem())
            ->where(array('order_id' => $this->order['id']))
            ->exec();
        
        foreach($this->order_items as $uniq => $order_item) {
            $order_item['order_id'] = $this->order['id'];
            $order_item->insert();
        }
        
        return true;
    }

Re: Скидка на товар от количества

Ждите ответа в поддержке.

14

Re: Скидка на товар от количества

Резюмирую, для данного функционала нужна наиболее свежая версия системы или хотя бы модуля shop.

15

Re: Скидка на товар от количества

А как это работает?Модуль создал, изменяю количество товара в корзине, но изменений ноль.

<?php
namespace Custom\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this
            ->bind('cart.addproduct.after', null, 'applyCartRules')
            ->bind('cart.update.after', null, 'applyCartRules');
    }

    /**
    * Обработчик будет вызываться, при добавлении или изменении товара в корзине
    * 
    * @param \Shop\Model\Cart $cart
    */
    public static function applyCartRules($params) 
    {
        $cart = $params['cart'];
        if (!isset($cart->is_cartrules_action)) { //Защита от рекурсии
            
            $cart->is_cartrules_action = true; //Защита от рекурсии
            
            $cart_product_items = $cart->getProductItems();
            foreach($cart_product_items as $uniq => $data) {
                
                //Добавляем товару Uniq скидку
                $cart->update(array(
                    $uniq => array(
                        'discount' => '50%' //Можно также в рублях, если процент в конце не ставить.
                    )
                ));
            }
        }
    }
}

Повысить оценку Понизить оценку

Re: Скидка на товар от количества

Обратитесь в поддержку.

17

Re: Скидка на товар от количества

Рабочий вариант, спасибо тех.поддержке

<?php
namespace Custom\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this
            ->bind('cart.addproduct.after', null, 'applyCartRules')
            ->bind('cart.update.after', null, 'applyCartRules');
    }

    /**
    * Обработчик будет вызываться, при добавлении или изменении товара в корзине
    * 
    * @param \Shop\Model\Cart $cart
    */
    public static function applyCartRules($params) 
    {
        $cart = $params['cart'];
        if (!isset($cart->is_cartrules_action)) { //Защита от рекурсии
            
            $cart->is_cartrules_action = true; //Защита от рекурсии
            
            $cart_product_items = $cart->getProductItems();
            foreach($cart_product_items as $uniq => $data) {
                
                $cart->update(array(
                    $uniq => array(
                        'discount' => '50%'
                    )), null, false);             
            }
        }
    }
}

Повысить оценку +1 Понизить оценку