5

イベントをキャッチするためにオブザーバーを実装しようとすると、メソッド in がその親を呼び出さずにメソッドをオーバーライドするため、システムが通常のイベントとイベントをディスパッチできない'cataloginventory_stock_item_save_before'ことに気付きました..._beforeSave()Mage_CatalogInventory_Model_Stock_ItemMage_Core_Model_Abstract 'model_save_before'$this->_eventPrefix.'_save_before'

Mage_Core_Model_Abstract

protected function _beforeSave()
{
    //...
    Mage::dispatchEvent('model_save_before', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
    return $this;
}

Mage_CatalogInventory_Model_Stock_Item

protected function _beforeSave()
{
    //...some other stuff, but no parent::_beforeSave()!
    return $this;
}

私は Magento に非常に慣れていませんが、これは私には奇妙に見えます。特に、メソッドを拡張し、メソッドをMage_Core_Model_Abstractオーバーライドするが呼び出しを行う他の多くの Magento クラスを見ると(次の例に示すように、さまざまな方法で)。_beforeSave()parent::_beforeSave()

たとえば、Mage_Catalog_Model_Product次のようになります。

protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}

Mage_Catalog_Model_Product_Compare_Item

protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}

またはでMage_Catalog_Model_Abstract

protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}

等。

さらに奇妙なことに、Mage_CatalogInventory_Model_Stock_Itemもオーバーライドしますが_afterSave()、今回親のメソッドを呼び出します。

Mage_CatalogInventory_Model_Stock_Item

protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}

私の質問は(そこにいるMagentoの達人を対象としています):このin
の省略に正当な理由があるかどうかを理解していますか? それともバグとしてリストする必要がありますか?parent::_beforeSave()Mage_CatalogInventory_Model_Stock_Item

イベントをキャッチできるようにするために私が考えた唯一の修正は、クラス'cataloginventory_stock_item_save_before'全体を から にコピーし、への呼び出し、または への直接の呼び出しを追加することです。 この解決策は悪いハックではありませんか?Mage_CatalogInventory_Model_Stock_Itemcorelocalparent::_beforeSave()Mage::dispatchEvent('cataloginventory_stock_item_save_before', ...)

の他の多くの直系の子孫を(好奇心で)検索したところ、少なくともメソッドに関する限り、他の2つのサブクラスだけが同じ問題を共有してMage_Core_Model_Abstractいることがわかりました(他の基本的なイベントはチェックしていません)など): Mage_Dataflow_Model_Batch`. このことから、たった 3 つのクラスでのこの省略は、意図的に行われたのではない可能性があると思います...Mage_CatalogInventory_Model_Stock_Item_beforeSave()_afterSaveMage_XmlConnect_Model_Application``and

だから:それはバグですか、それとも間違っていますか?

4

1 に答える 1

4

このコンテキストで「メレンゲ」が何を意味するのかはわかりませんが、これは、対象となる Mage_Core_Model_Abstract自動起動イベントのいくつかの例の 1 つです...

  • *_load_before
  • *_load_after
  • *_delete_before
  • *_delete_after
  • *_delete_commit_after
  • *_save_before
  • *_save_after
  • *_save_commit_after

...壊れている。

これは、オーバーライドされたときにサブクラスが親テンプレート メソッドを呼び出せないために発生するか (言及したように) _eventPrefix、サブクラスでオーバーライドに失敗したために発生します。私には、これは常に意図ではなく省略のように思えました。

この場合、Mage_CatalogInventory_Model_Stock_Item::_beforeSave()これは省略されているようです。このクラスのバージョン 1.3.2.4まで、このメソッドは対象となるイベント ロジックを複製します (ただし、 のディスパッチは省略されますmodel_save_before)。このファイルの 1.4.0.0-alpha2 バージョンでは、プロパティ_eventPrefix追加されていることがわかりますが、親_beforeSave()メソッドの呼び出しに失敗すると、このターゲット イベントが失われます。

この例で私が見ることができる唯一の意図はstock_item、製品の保存プロセスのコンテキストで、開発者に cataloginventory オブジェクトをプロパティとして操作するよう強制することかもしれませんが、それにはコード コメントが必要です。

于 2012-08-29T14:14:24.520 に答える