2012-06-25 76 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