2

Magento のすべてのブロックは、抽象から継承し、コードのフラグメント内にあります。

#File: app/code/core/Mage/Core/Block/Abstract.php   
public function setLayout(Mage_Core_Model_Layout $layout)
{
    $this->_layout = $layout;
    Mage::dispatchEvent('core_block_abstract_prepare_layout_before', array('block' => $this));
    $this->_prepareLayout();
    Mage::dispatchEvent('core_block_abstract_prepare_layout_after', array('block' => $this));
    return $this;
}

コア ブロックの準備レイアウトにフックする方法は 2 つあります。

  1. コア ブロックを独自のものに書き直し、その親を呼び出して _prepareLayout 関数を作成し、その後にコードを実行します。
  2. core_block_abstract_prepare_layout_after イベントを観察し、ブロックのインスタンスが目的のものであるかどうかを確認します

2 番目の利点は、イベント/オブザーバー パターンが、追加機能を実装するためのより優れた、より安定した選択肢であることです。ただし、欠点は、レイアウトが準備されているすべてのブロックに対してオブザーバーを実行する必要があることです。

ここでより良いプログラミング手法はどれですか?

4

1 に答える 1

2

Abstractクラスを書き換えても、ほとんどのブロックはコア内のブロックを引き続き使用します。これは、Abstractクラスから直接拡張され、Magentoの書き換えルールを使用しないためです。だから私はあなたの2番目の解決策でそれをします。すべてのブロックにオブザーバーがある場合でも、パフォーマンスの問題はそれほど大きくないはずです。ほとんどの場合、instanceofを使用して単純な条件を実行するだけなので、これは非常に高速です。

于 2013-02-11T14:31:15.533 に答える