在庫があり、数量が400000を超える商品が、販売できないと言っているという問題が発生しました。むしろ、isSalableは値を返していません。
関数を引き上げて見てみると、何か変なことに気づきました。
関数は次のとおりです。
public function isSalable(){
Mage::dispatchEvent('catalog_product_is_salable_before', array(
'product' => $this
));
$salable = $this->isAvailable();
$object = new Varien_Object(array(
'product' => $this,
'is_salable' => $salable
));
Mage::dispatchEvent('catalog_product_is_salable_after', array(
'product' => $this,
'salable' => $object
));
// echo "variable: ".$salable."<br />object: ".$object->getIsSalable();
return $object->getIsSalable();
}
コメントされたエコーは、オブジェクトに配置される前の値と、オブジェクトから取得された値を確認することでした。私が得る問題のある製品について:
variable: 1
object:
他の製品では、両方とも1として返されます。
誰かがこれが起こる原因を知っていますか?
- -編集 - -
申し訳ありませんが、関数は$object->getIsSalable()
ではなく、を返します$salable
。
これはMagentoEnterprise1.12にあります
オブジェクト呼び出しがfalseを返していることに気付きました。一日の終わりにこれを投稿することの効果。
イベントディスパッチの前にエコーを移動しましたが、両方とも1として戻ってきたので、イベントを調べて、falseに設定されている場所を追跡しました。
Enterprise/CatalogEventでこの関数を追跡しました。
public function applyIsSalableToProduct(Varien_Event_Observer $observer){
$event = $observer->getEvent()->getProduct()->getEvent();
echo "<br />".$event->getStatus()."<br />";
if ($event && in_array($event->getStatus(), array(
Enterprise_CatalogEvent_Model_Event::STATUS_CLOSED,
Enterprise_CatalogEvent_Model_Event::STATUS_UPCOMING
))) {
$observer->getEvent()->getSalable()->setIsSalable(false);
}
return $this;
}
ifの外にエコー$event->getStatus()
すると、問題のある製品はクローズのステータスになり、$ eventが存在しないため、他の製品はエラーをスローします。
違いの原因は何ですか?
---編集2---
クローズは製品イベントから来ていることがわかりました。
$event = $observer->getEvent()->getProduct()->getEvent();
オブジェクトの作成後に戻ってisSalable()
追加し、これを取得しました。print_r($this->getEvent()->getData());
Array([event_id] => 3 [category_id] => 12 [date_start] => 2012-11-28 09:54:00 [date_end] => 2012-11-29 09:54:00 [display_state] => [sort_order] => [status] => closed)
この場合も、製品にイベントがないため、通常の製品はエラーで返されます。
このイベントはどこから来たのですか?
進歩するにつれて更新を続けます。