2012-06-15 167 views
0

我正在創建自定義規則以自動將產品添加到類別中。下面的代碼來自我的觀察者。我遇到的問題是,在運行此代碼時,沒有屬性的產品(例如'shirt_color')會​​被添加到我的類別中。Magento - 加載產品時屬性不好?

任何人都可以闡明爲什麼會發生這種情況?由於某種原因,'炭灰色'仍然附着在沒有'shirt_color'的產品上。當比較('炭灰'=='炭灰')它解析爲'真',這就是爲什麼$ 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()