2

在庫があり、数量が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)

この場合も、製品にイベントがないため、通常の製品はエラーで返されます。

このイベントはどこから来たのですか?

進歩するにつれて更新を続けます。

4

3 に答える 3

1

理解した。ステータスをクローズに設定しているカタログ イベント セットがありました。イベントを削除し、すべてが順調でした。

于 2013-01-11T19:18:02.183 に答える
0

デバッグ ステートメントの出力がどのようなものかは少しわかりませんが、私が思いつく唯一の論理的な結論は次のとおりです。

variable: 1
object: 0

はオブジェクトであるため$object、参照によってイベントに渡されます。そのため、インストールに event のイベント リスナーがある場合catalog_product_is_salable_after、そのオブジェクトの値が変更される可能性があります。isAvailableただし、ブール値を返すため、変数$salable自体をイベント内から変更することはできません。したがって、イベントが発生した後に値が取得されないため、イベント リスナーの「salable」フィールドを変更してもあまり意味がありません。それは決して返されません。

これは、出力で$salable変数が 1 の場合、関数が 1 を返す必要があることを示すための方法です。

于 2013-01-11T08:54:32.630 に答える