2011-09-12 11 views
4

Magento 1.5.1.0の拡張機能を開発中です。在庫量がゼロになる製品にカタログ価格ルールを追加できます。 auto_discount_activeという属性セットに属性を追加しました。この属性は、私の価格規則の条件として機能する私のオン/オフスイッチです。Magento - 製品属性を変更した後のカタログルールの再割り当て

私はイベントsales_order_place_aftercatalog_product_save_beforeに反応するObserverを書いた。現在の製品の在庫量が変更されているかどうかをチェックし、カスタム属性をオンまたはオフに設定するのがタスクです。

catalog_product_save_beforeイベントを処理するメソッドは正常に動作します。バックエンドに商品を保存した後、価格ルールは(必要に応じて)アクティブになります。コードは次のようになります。

class Company_AutoDiscount_Model_Observer 
{ 
    public function updateAutoDiscount($observer) 
    { 
    /** 
    * @var Varien_Event 
    */ 
    $event  = $observer->getEvent(); 

    $product = $event->getProduct(); 
    $data  = $product->getStockData(); 

    $discount = $data['qty'] < 1 ? true : false; 
    $attributes = $product->getAttributes(); 
    $attribute = $attributes["auto_discount_active"]; 

    if ($product->getAutoDiscountAllowed()) 
    { 
     $product->setAutoDiscountActive($discount); 
    } 

    return $this; 
    } 
} 

私は誰かが私の店に注文すると、私は同じことをしたいと思います。それは私が今までに働いているイベントsales_order_place_afterを使用するためです。カスタム属性の値を変更した後は、価格ルールは更新されません。私のオブザーバメソッドは、次のようになります。

public function updateAutoDiscountAfterOrder($observer) 
{ 
    /** 
    * @var Varien_Event 
    */ 
    $event  = $observer->getEvent(); 
    $order  = $event->getOrder(); 

    foreach ($order->getItemsCollection() as $item) 
    { 
     $productId = $item->getProductId(); 
     $productIds[] = $productId; 
     $product = Mage::getModel('catalog/product')->setStoreId($order->getStoreId())->load($productId); 
     $data  = $product->getStockData(); 

     $discount = $data['qty'] < 1 ? true : false; 

     if ($product->getAutoDiscountAllowed()) 
     { 
      $product->setAutoDiscountActive($discount); 
      $product->save(); 
     } 

     Mage::getModel('catalogrule/rule')->applyAllRulesToProduct($productId); 
    } 
    return $this; 
} 

変更することなく、バックエンドに手動で注文して買った記事を保存した後、価格ルールが更新されます。しかし、私は私のオブザーバーメソッドで更新を取得しています。

カスタム属性を変更した後、カタログ価格ルールを割り当てるにはどうすればよいですか?

Thxで事前に!

答えて

1

さて、私はいくつかのメジャーコードの最適化についてアドバイスしたいと思います。

あなたはあなたのコレクションのサイズを小さくして使用して、ループ内で条件ロジックを削除することができます

$order->getItemsCollection()->addFieldToFilter('is_in_stock', 0); 

あなたはまた、(セーブよりもずっと速い方法ですべての属性を更新することができ)、使用して:

Mage::getSingleton('catalog/product_action') 
    ->updateAttributes($order->getItemsCollection()->addFieldToFilter('is_in_stock', 0)->getAllIds(), array('auto_discount_active' => 1), 0); 

また、オブザーバーを製品在庫レベルの変更に適用する必要があります。製品の保存、インポート、クレジットメモ(払い戻し) - そのかなり広大な領域です。あなたはおそらく、これをカバーするのに十分な範囲を与えるイベントがあまりにも多くはないので、株式クラスを書き換える方が良いでしょう。最後に

、ルールの逢引を実行するためには、製品IDのあなたの配列を渡すことができるように、私は(全体カタログを反復処理して保存する)ルール(Mage/CatalogRule/Model/Mysql4/Rule.php)のリソースモデルを拡張することをお勧め。

getRuleProductIds()を拡張して、上記のコレクションから製品IDを持つMage ::レジストリ変数(設定されている場合)を取得できます。変更されている製品のみのために - そして、上記のコードを実行した後、あなただけのインデックスを再し、必要に応じて新製品にルールを適用します

Mage::getModel('catalogrule/rule')->load(myruleid)->save(); 

を実行する可能性があります。

この方法でオーバーヘッドを大幅に削減することができます。