Підходяща подія для додавання користувальницьких опцій під час руху - це 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);
}
}