0

製品をカテゴリに自動的に追加するカスタム ルールを作成しています。以下のコードは私のオブザーバーからのものです。私が遭遇した問題は、このコードを実行すると、属性のない製品 (「shirt_color」など) が私のカテゴリに追加されることです。

なぜこれが起こっているのか、誰かが光を当てることができますか? 何らかの理由で、'shirt_color' のない製品に 'charcoal gray' が付けられたままになっています。比較すると ('charcoal gray' == 'charcoal gray')、'true' に解決されます。これが $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']
    )
);
4

1 に答える 1

0

問題を理解しました。先に宣言したので$model = Mage::getModel('catalog/product');、後で何かがめちゃくちゃになっていました。それ以外の

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

私は今持っています

Mage::getModel('catalog/product')->load($product->getId()).

に対しても同じことをしましたMage::getModel('catalog/product')->getCollection()

于 2012-06-18T16:18:16.327 に答える