Реализация наблюдателя событий в Magento
Я начинаю понимать, как работают наблюдатели событий Magento, и надеюсь, что кто-нибудь поможет мне выяснить, какое событие мне нужно найти, чтобы заставить работать мой потенциальный модуль. У меня есть определенные продукты, у которых есть атрибут "детский скус", который представляет собой массив номеров SKU других продуктов в моем инвентаре.
Пример:
Название: совершенно потрясающий продукт
Артикул: TP-1212
Детский SKUS: GP-3232,FD-4332,VC-5332
Каждый раз, когда кто-то покупает TP-1212, мне также нужно, чтобы Magento вычитал это количество из этих детских закулисных закулисных сцен. Кто-нибудь знает, есть ли диспетчер событий после завершения покупки, который бы обрабатывал что-то подобное?
2 ответа
Это немного сложнее, и, скорее всего, есть некоторые крайние случаи, не описанные в приведенном ниже коде. Также ответ предполагает следующее:
- Вы хотите уменьшить уровень запасов всех сопутствующих товаров только что купленного родителя
- Вы хотите уменьшить только на 1
- Нет никаких дополнительных осложнений или других условий, которые должны быть выполнены / решены
Код:
Итак, вам, очевидно, нужно сначала создать модуль. Файл config.xml должен объявить наблюдателя, который будет слушать checkout_type_onepage_save_order_after
, (Примечание: есть другие события, которые вы можете прослушать, чтобы достичь своей цели).
Файл config.xml будет содержать как минимум следующий код:
<?xml version="1.0"?>
<config>
<modules>
<YourCmpany_YourModule>
<version>1.0.0</version>
</YourCmpany_YourModule>
</modules>
<frontend>
<events>
<checkout_type_onepage_save_order_after>
<observers>
<yourmodule_save_order_observer>
<class>YourCompany_YourModule_Model_Observer</class>
<method>checkout_type_onepage_save_order_after</method>
</yourmodule_save_order_observer>
</observers>
</checkout_type_onepage_save_order_after>
</events>
</frontend>
<global>
<models>
<yourmodule>
<class>YourCompany_YourModule_Model</class>
</yourmodule>
</models>
</global>
</config>
Тогда в вашем наблюдателе:
<?php
class YourCompany_YourModule_Model_Observer
{
public function checkout_type_onepage_save_order_after(Varien_Event_Observer $observer)
{
$order = $observer->getEvent()->getOrder();
/**
* Grab all product ids from the order
*/
$productIds = array();
foreach ($order->getItemsCollection() as $item) {
$productIds[] = $item->getProductId();
}
foreach ($productIds as $productId) {
$product = Mage::getModel('catalog/product')
->setStoreId(Mage::app()->getStore()->getId())
->load($productId);
if (! $product->isConfigurable()) {
continue;
}
/**
* Grab all of the associated simple products
*/
$childProducts = Mage::getModel('catalog/product_type_configurable')
->getUsedProducts(null, $product);
foreach($childProducts as $childProduct) {
/**
* in_array check below, makes sure to exclude the simple product actually
* being sold as we dont want its stock level decreased twice :)
*/
if (! in_array($childProduct->getId(), $productIds)) {
/**
* Finally, load up the stock item and decrease its qty by 1
*/
$stockItem = Mage::getModel('cataloginventory/stock_item')
->loadByProduct($childProduct)
->subtractQty(1)
->save()
;
}
}
}
}
}
Есть несколько возможностей с простейшим checkout_type_onepage_save_order_after
однако вам также необходимо вернуть запас, если заказ был отменен, или выполнить его только после оплаты или доставки товаров?