2

Magento Event Observers がどのように機能するかを理解し始めており、潜在的なモジュールを機能させるためにどのイベントを探す必要があるかを誰かが理解するのを手伝ってくれることを願っています。インベントリ内の他の製品の SKU 番号の配列である「子 skus」と呼ばれる属性を持つ特定の製品があります。

例:

名前: 完全に素晴らしい製品

SKU: TP-1212

子 SKU: GP-3232、FD-4332、VC-5332

誰かが TP-1212 を購入するたびに、Magento が舞台裏で子 sku からその数量を差し引く必要もあります。そのようなことを処理する購入が完了した後のイベントディスパッチャがあるかどうか、誰かが知っていますか??

4

2 に答える 2

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()
                                ;
                }
            }
        }
    }
}
于 2012-06-25T21:41:28.807 に答える
0

最も単純なものはいくつかの可能性がありますcheckout_type_onepage_save_order_after

ただし、注文がキャンセルされた場合、または支払いが行われたときまたは商品が発送されたときにのみこれを実行する場合、在庫を元に戻す必要もありますか?

于 2012-06-25T19:50:35.237 に答える