/ / Magento - Złe atrybuty podczas ładowania produktu? - php, magento

Magento - złe atrybuty podczas ładowania produktu? - php, magento

Tworzę niestandardowe reguły do ​​automatycznego dodaniaprodukty do kategorii. Poniższy kod pochodzi od mojego obserwatora. Problem, z którym się spotykam, polega na tym, że po uruchomieniu tego kodu produkty bez atrybutu (na przykład „shirt_color”) są dodawane do mojej kategorii.

Czy ktoś może rzucić nieco światła na to, dlaczego tak jestwydarzenie? Z jakiegoś powodu do produktu nadal dołącza się „grafitowy szary” bez „shirt_color”. Porównany („grafitowy” == „grafitowy”) przekształca się w „true” i dlatego $ r == 1;

Dzięki.

Przykładowe wyniki:

#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

Kod:

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();

}

Przekazane przez kontrolera:

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"]
)
);

Odpowiedzi:

0 dla odpowiedzi № 1

Zrozumiałem problem. Ponieważ zadeklarowałem $model = Mage::getModel("catalog/product"); wcześniej coś się popsuło. Zamiast

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

teraz mam

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

Zrobiłem to samo dla Mage::getModel("catalog/product")->getCollection().