Создание пользовательской опции и выигрыш только что добавленного товара в корзину с помощью обозревателя

15

Я хочу добавить пользовательскую опцию для цитирования с помощью обозревателя, который наблюдает событие checkoutCartProductAddAfter и срабатывает после добавления товара в корзину.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

Мой обозреватель работает, но я не могу добавить пользовательский параметр для добавленного продукта. Пожалуйста, предоставьте помощь, чтобы добавить пользовательскую опцию с помощью обозревателя только что добавленного продукта.

Кейур Патель
источник
Также предоставьте мне возможность изменить цену товара в обозревателе. Я хочу добавить пользовательскую цену к нулю. заранее спасибо
Кейр Патель

Ответы:

19

@Tim рассказал об этой проблеме в выходные дни: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

То, что вы хотите, это метод 2: Добавить следующее событие в Config.xml

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

В Observer.php добавить следующий метод

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

Вот еще об этой теме:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

и более:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266

Фабиан Блехшмидт
источник
1
Во-первых: пожалуйста, используйте комментарии, а не новые ответы. А затем вставьте чек для вашего продукта в цикле, чтобы только нужный продукт получил опцию.
Фабиан Блехшмидт
1
Пожалуйста, взгляните на этот великолепный ответ по отладке и оставьте комментарий: magento.stackexchange.com/a/429/217
Фабиан Блехшмидт
1
Это возможно с помощью описанных выше шагов
Фабиан Блехшмидт
2
Спасибо за предложение. Когда я добавляю в корзину, я получил два элемента, потому что я использую настраиваемый продукт и решил проблему, обновив последний элемент цитаты.
Milople Inc
1
Меня тоже нет, но я обновил ссылку. Благодарность!
Фабиан Блехшмидт
3

Событие подходящее для добавления пользовательских параметров на лету - это событие catalog_product_type_prepare_full_options, которое инициируется непосредственно перед преобразованием продукта с его пользовательскими параметрами в элемент предложения.

Если собственные данные buyRequest влияют на атрибуты или опции продукта, наблюдатель на событии catalog_product_type_prepare_{$processMode}_optionsявляется хорошим выбором, где $processModeрежим проверки и может быть «полным» или «облегченным». «Полный» режим используется, когда продукт регулярно добавляется в корзину и проверяет, установлены ли все необходимые параметры и действительна ли вся конфигурация. В режиме «lite» проверяются только параметры, содержащиеся в запросе, это используется при добавлении товара в список желаний, но также возможно при создании заказа из бэкэнда. Для обработки данных в любом случае вы можете зарегистрировать наблюдателя для обоих событий. Если есть проверка, вы должны разграничить события, конечно.

События запускаются в Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions (), и доступны следующие параметры:

  • transport: Транспортный объект для всех пользовательских параметров (но без других параметров, например, параметров пакета), поэтому вы можете изменить их в обозревателе. transport-> options - это массив в виде option_id => option_value. Внимание, транспорт сам по себе является объектом stdClass, а не экземпляром Varien_Object, как вы могли ожидать. Так что нет никаких методов get и set для transport-> options.
  • buy_request: Объект buyRequest, вы можете прочитать его здесь и по-прежнему изменять его.
  • product: Продукт, который будет преобразован в элемент цитаты позже. Здесь вы можете управлять атрибутами или добавлять их динамически. Но вам все равно нужно учитывать их в процессе конвертации. Событие, используемое для этого, sales_quote_product_add_afterзапускается только позже.

Источник: Объект Magento buyRequest - Ссылка

Таким образом, наблюдатель может выглядеть так:

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

Вы не можете установить цену для этой динамически добавленной пользовательской опции, но вы можете изменить цену элемента цитаты с помощью второго наблюдателя, catalog_product_get_final_priceнапример:

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
Фабиан Шменглер
источник