2012-06-15 2 views
0

나는 카테고리에 제품을 자동으로 추가하기 위해 맞춤 규칙을 만들고 있습니다. 아래 코드는 내 관찰자의 것입니다. 내가 만나는 문제는이 코드를 실행하면 속성이없는 제품 (예 : 'shirt_color')이 내 카테고리에 추가된다는 것입니다.Magento - 제품을로드 할 때 속성이 잘못 되었습니까?

왜 이런 일이 일어나는 지 알 수 있습니까? 어떤 이유로 '숯 회색'은 '셔츠 _ 색상'이없는 제품에 여전히 부착되어 있습니다. 비교했을 때 ('숯 회색'== '숯 회색') '사실'로 해석되므로 그 이유는 $ r == 1;

감사합니다.

출력 예 :

#product w/ a 'shirt_color' attribute 
productEntityId=628 
productName=Rogue GRAY International Shirt XXL 
productSKU=HW0003-XXL 
string == 
product attributeSTRTOLOWER='charcoal grey' 
value STRTOLOWER='charcoal grey' 
r=1 

#product w/o a 'shirt_color' attribute 
productEntityId=629 
productName=O'Neill Hyperfreak White 
productSKU= 
string == 
product attributeSTRTOLOWER='charcoal grey' 
value STRTOLOWER='charcoal grey' 
r=1 

번호 : 제어기에서 전달

public function onCategoryRuleSave($observe) 
{ 
    $model = Mage::getModel('catalog/product'); 
    $collection = 
     $model->getCollection() 
      ->addAttributeToSelect('entity_id'); 
    $write = Mage::getSingleton('core/resource')->getConnection('core_write'); 

    foreach ($collection as $product) { 
echo "productEntityId=" . $product->getId() . "<br>"; 
     $product = $product->load($product->getId()); 
     $productAttributeValue = 
      $model->load($product->getId()) 
       ->getAttributeText($observe['attribute_code']); 
     $r = 0; 

echo "productName=" . $product->getName() . "<br>"; 
echo "productSKU=" . $product->getSku() . "<br>"; 
     if (is_numeric($observe['value'])) { 
echo "operator= " . $observe['operator'] . "<br>"; 
      switch($observe['operator']) { 
       case "<": 
echo "numeric <<br>"; 
        $r = ($productAttributeValue < $observe['value']) ? 1 : 0; 
        break; 
       case ">": 
echo "numeric ><br>"; 
        $r = ($productAttributeValue > $observe['value']) ? 1 : 0; 
        break; 
       case "<=": 
echo "numeric <=<br>"; 
        $r = ($productAttributeValue <= $observe['value']) ? 1 : 0; 
        break; 
       case ">=": 
echo "numeric >=<br>"; 
        $r = ($productAttributeValue >= $observe['value']) ? 1 : 0; 
        break; 
       case "==": 
echo "numeric ==<br>"; 
        $r = ($productAttributeValue == $observe['value']) ? 1 : 0; 
        break; 
       case "!=": 
echo "numeric !=<br>"; 
        $r = ($productAttributeValue != $observe['value']) ? 1 : 0; 
        break; 
      } 
     } 
     else { 
      switch($observe['operator']) { 
       case "==": 
echo "string ==<br>"; 
echo "product attributeSTRTOLOWER='" . strtolower($productAttributeValue) . "'<br>"; 
echo "value STRTOLOWER='" . strtolower($observe['value']) . "'<br>"; 
        $r = (
         strtolower($productAttributeValue) == strtolower($observe['value']) 
        ) ? 1 : 0; 
echo "r=" . $r . "<br>"; 
        break; 
       case "!=": 
echo "string !=<br>"; 
echo "product attributeSTRTOLOWER='" . strtolower($productAttributeValue) . "'<br>"; 
echo "value STRTOLOWER='" . strtolower($observe['value']) . "'<br>"; 
        $r = (
         strtolower($productAttributeValue) != strtolower($observe['value']) 
        ) ? 1 : 0; 
echo "r=" . $r . "<br>"; 
        break; 
      } 
     } 
echo "<br>"; 
     if ($r==1) { 
      $write->query(
       "REPLACE INTO `catalog_category_product` (`category_id`, `product_id`) 
        VALUES (" . $observe['category_id'] . "," . $product->getId() . ")" 
      ); 
     } 
    } 
die(); 

} 

는 :

Mage::dispatchEvent(
    'category_rule_save', 
    array(
     'rule_id'  => $id, 
     'attribute_code' => $data['attribute_code'], 
     'operator'  => $data['operator'], 
     'value'   => $data['value'], 
     'category_id' => $data['category'], 
     'store_id'  => $data['store_id'] 
    ) 
); 

답변

0

문제점을 알아 냈다. 내가 $model = Mage::getModel('catalog/product');을 더 일찍 선언했기 때문에, 나중에 뭔가가 엉망이되었습니다. 대신

$model->load($product->getId())

의 지금

Mage::getModel('catalog/product')->load($product->getId()) 있습니다.

나는 Mage::getModel('catalog/product')->getCollection()에 대해 동일하게 작업했습니다.

관련 문제