2012-06-25 96 views
2

我開始瞭解Magento事件觀察者是如何工作的,希望有人能幫助我弄清楚我需要尋找哪些事件才能讓我的潛在模塊工作。我有某些產品具有名爲「兒童skus」的屬性,這是我清單中其他產品的SKU編號的數組。在Magento中實現事件觀察者

例子:

名稱:完全真棒產品

SKU:TP-1212

兒童的SKU: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

真棒男人謝謝!唯一的區別是我必須按照父母的銷售數量扣除子產品的數量。我確實有一個工作腳本,每次我在一系列訂單上運行它時都會這樣做,但我希望使用Observer使其更加無縫。把我有的和你寫的東西結合起來,我應該好好去! – jkphl

+0

@Drew Hunter有什麼辦法可以減少訂購商品的數量,假設我有不同數量的訂單2產品,我想用相同的觀察者從庫存中減少相同的產品數量,有可能嗎? – Naveenbos

0

沒有與簡單的是剛剛checkout_type_onepage_save_order_after

幾種可能性但是你還需要恢復股票,如果爲了得到的取消或執行此,只有當支付款項或物品被運?

+0

不,我不會必須要恢復,如果訂單被取消或任何特別。一旦有人提交了訂單,這只是一個單向過程。謝謝! – jkphl