Создание пользовательской опции и приза для простого добавления продукта в корзину с помощью Observer
-
16-10-2019 - |
Вопрос
Я хочу добавить пользовательскую опцию в цитату с использованием Observer, какого наблюдателя CACKOUTCartProductAdDafter и пожаров после добавления продукта в CART.
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;
}
Мой наблюдатель работает, но я не могу добавить пользовательскую опцию к добавлению продукта. Пожалуйста, предоставьте помощь, чтобы добавить пользовательскую опцию, используя Observer, чтобы просто добавить продукт.
Решение
@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>
В viserver.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),
)
);
}
}
Вот больше об этой теме:
и более:
Другие советы
Событие Appropiate для добавления пользовательских опций на лету catalog_product_type_prepare_full_options
, который запускается непосредственно перед тем, как продукт с его пользовательскими опциями преобразуется в пункт цитаты.
Если данные BuyRequest повлияют на атрибуты или опции продукта, наблюдатель на мероприятии
catalog_product_type_prepare_{$processMode}_options
хороший выбор, где$processMode
это режим проверки и может быть «полным» или «lite». Режим «Полный» используется, когда продукт регулярно добавляется в корзину, и подтверждается, если все необходимые параметры установлены и вся конфигурация действительна. В параметрах «Lite» только в режиме, содержащихся в запросе, подтверждены, он используется при добавлении продукта в список желаний, но также возможна при создании порядка из бэкэнда. Чтобы обработать данные в любом случае, вы можете зарегистрировать наблюдатель для обоих событий. Если будет проверка, вы должны дифференцировать события, конечно.События запускаются в mage_catalog_model_product_type_abstract :: _ prepareoptions () и следующие параметры доступны:
transport
: Транспортный объект для всех пользовательских параметров (но никаких других параметров, например, параметров пакета), чтобы вы могли изменить их в наблюдателе. Transport-> Параметры-это массив в форме Option_id => option_value. Внимание, транспорт сам является объектом stdclass, а не экземпляром varien_object, как вы можете ожидать. Таким образом, нет никаких методов Getter и Setter для транспортировки.> Опции.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);
}
}