2012-06-25 3 views
2

Я начинаю понимать, как наблюдатели событий Magento работают и надеются, что кто-то сможет помочь мне разобраться, какое событие мне нужно будет искать, чтобы заставить мой потенциальный модуль работать. У меня есть определенные продукты, у которых есть атрибут «child skus», который представляет собой массив номеров SKU других продуктов в моем инвентаре.Реализация наблюдателя событий в Magento

Пример:

Название: Полностью Удивительный продукт

Артикул: TP-1212

Детский SKUs: GP-3232, FD-4332, VC-5332

Каждый раз, когда кто-то покупает TP-1212 Мне также нужно, чтобы Magento вычитал это количество из этого детского ску за кулисами. Кто-нибудь знает, есть ли диспетчер событий после завершения покупки, который обрабатывал бы что-то подобное?

ответ

13

Это немного сложнее, и там, скорее всего, некоторые крайние случаи, не охваченные в коде ниже - Кроме того, ответ подразумевает следующее:

  1. Вы хотите уменьшить уровень запасов всех связанных продуктов из родитель только что купил
  2. Вы хотите уменьшить только 1
  3. Там нет никаких дальнейших осложнений или других условий, которые должны быть выполнены/рассмотрены

Код:

Таким образом, вам, очевидно, необходимо сначала создать модуль. Файл 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() 
           ; 
       } 
      } 
     } 
    } 
} 
+0

Awesome man thanks! Единственное различие заключается в том, что я должен был бы вычесть количество субпродуктов по количеству проданного родителя. У меня есть рабочий скрипт, который делал это каждый раз, когда я запускал его по ряду заказов, но я хотел использовать Observer, чтобы сделать его более бесшовным. Объединив то, что у меня есть и что вы написали, я должен быть хорошим! – jkphl

+0

@Drew Hunter есть ли способ уменьшить количество заказанных предметов, предположим, что у меня есть продукт orderd 2 с разными количествами, я хочу уменьшить количество продуктов из инвентаря, используя одного и того же наблюдателя, возможно ли это? – Naveenbos

0

Есть несколько возможностей с простейшими быть просто checkout_type_onepage_save_order_after

однако вы также должны вернуть акции, если заказ получить отменена или выполнить это только тогда, когда оплата производится или детали погружены?

+0

Нет, я не имел бы к, чтобы вернуться обратно, если заказ был отменен или что-нибудь особый. Это будет всего лишь односторонний процесс, как только кто-то подаст заказ. Благодаря! – jkphl

Смежные вопросы