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


15

Я хочу додати нестандартну опцію цитування, використовуючи спостерігач, який спостерігач перевіряєCartProductAddAfter події та пожежі після того, як продукт доданий у кошик.

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
Fabian Blechschmidt

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_Ab Abstract :: _ PrepaOptions (), і такі параметри доступні:

  • transport: Транспортний об'єкт для всіх користувацьких параметрів (але жодних інших варіантів, наприклад, опцій пакетів), тому ви можете змінити їх у спостерігачі. transport-> options - це масив у формі option_id => option_value. Увага, транспорт сам по собі об’єкт stdClass, а не екземпляр Varien_Object, як ви могли очікувати. Таким чином, для транспорту-> варіантів немає методів геттера та сетера.
  • buy_request: Об'єкт buyRequest, ви можете прочитати його тут і все одно змінити.
  • product: Продукт, який згодом буде перетворений на пункт цитати. Тут ви можете маніпулювати атрибутами або динамічно додавати їх. Але вам все одно потрібно врахувати їх у процесі перетворення. Подія, яка використовується для цього, sales_quote_product_add_afterзапускається лише пізніше.

Джерело: Magento buyRequest Object - Довідка

Отже, спостерігач може виглядати так:

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);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.