2011-09-12 9 views
4

Magento 1.5.1.0에 대한 확장 기능을 개발하는 중입니다. 재고 수량이 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 :: registry 변수 (설정 한 경우)를 가져올 수 있습니다. 변경 한 경우에만 제품 - 그럼 위의 코드를 실행 한 후, 당신은 단지 재 인덱스와 필요에 따라 새로운 제품에 규칙을 적용합니다

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

를 실행할 수 있습니다.

나는이 방법이 간접비를 상당히 상당량 줄이는 것을 상상합니다.