2012-02-17 13 views
5

私は特定のhelperを得るためのいくつかの異なるアプローチを見てきました。私は、誰かがそれぞれのアプローチの長所/短所を説明できることを望んでいます。たとえば、template/checkout/cart/sidebar/default.phtmlには、$this->helper('checkout')Mage::helper('checkout')の両方が表示されます。同じテンプレートにこれらの2つの異なるメソッドがあるのは良い理由はありますか?Magentoのさまざまな* get helper *メソッドの違いは何ですか?

以下

は、私はMagentoの中で見つけることができるヘルパーを取得するすべての異なる方法があります。

abstract class Mage_Core_Block_Abstract extends Varien_Object 
{ 
… 
    /** 
    * Return block helper 
    * 
    * @param string $type 
    * @return Mage_Core_Block_Abstract 
    */ 
    public function getHelper($type) 
    { 
     return $this->getLayout()->getBlockSingleton($type); 
    } 

    /** 
    * Returns helper object 
    * 
    * @param string $name 
    * @return Mage_Core_Block_Abstract 
    */ 
    public function helper($name) 
    { 
     if ($this->getLayout()) { 
      return $this->getLayout()->helper($name); 
     } 
     return Mage::helper($name); 
    } 
… 
} 

class Mage_Core_Model_Layout extends Varien_Simplexml_Config 
{ 
… 
    /** 
    * Enter description here... 
    * 
    * @param string $type 
    * @return Mage_Core_Helper_Abstract 
    */ 
    public function getBlockSingleton($type) 
    { 
     if (!isset($this->_helpers[$type])) { 
      $className = Mage::getConfig()->getBlockClassName($type); 
      if (!$className) { 
       Mage::throwException(Mage::helper('core')->__('Invalid block type: %s', $type)); 
      } 

      $helper = new $className(); 
      if ($helper) { 
       if ($helper instanceof Mage_Core_Block_Abstract) { 
        $helper->setLayout($this); 
       } 
       $this->_helpers[$type] = $helper; 
      } 
     } 
     return $this->_helpers[$type]; 
    } 

    /** 
    * Retrieve helper object 
    * 
    * @param string $name 
    * @return Mage_Core_Helper_Abstract 
    */ 
    public function helper($name) 
    { 
     $helper = Mage::helper($name); 
     if (!$helper) { 
      return false; 
     } 
     return $helper->setLayout($this); 
    } 
… 
} 

答えて

10

Mage_Core_Block_Abstract::getHelper()

Mage_Core_Model_Layout::getBlockSingleton()方法は、Magentoのヘルパーオブジェクトではなく、インスタンスを返しません。 Magentoオブジェクトタイプブロックの
Mage::getBlockSingleton()メソッドが非難されているなど、これは従来のコードと考えています。

いずれの場合も、ブロックインスタンスはMagentoクラスIDから作成されます。

メソッドgetBlockSingleton()は、レイアウトオブジェクトの$_helpersプロパティにインスタンスを格納します。メソッドcreateBlock()は、$_blocksプロパティに格納します。

$_blocksアレイのブロックのみが、レイアウトXMLを使用して参照(および上書き)できます。

メソッドgetBlockSingleton()は、特定のブロッククラスのインスタンスが必要な場合に、すでに存在する場合はそのブロックの新しいインスタンスを作成しないようにする場合に便利です。 Mage_Core_Block_Abstract::helper()方法は、Magentoの中で共通しているもののインスタンスを返します

public function alternativeGetBlockSingleton($classId) 
{ 
    foreach (Mage::app()->getLayout()->getAllBlocks() as $block) 
    { 
     if ($block->getType() == $classId) 
     { 
      return $block; 
     } 
    } 
    return $this->createBlock($classId); 
} 

Mage_Core_Block_Abstract::helper()

:あなたは以下のコードが必要になりcreateBlock()経由で作成されたインスタンスと(ほぼ)同じ効果を達成するために
ヘルパーと呼ばれる。
Mage::helper($name)を呼び出すこととの唯一の違いは、レイアウトオブジェクトがヘルパーインスタンスのプロパティとして設定されていることです。 Mageクラス(したがって、依存関係)ハードコードされた参照の数が減少しているため

一つは、テンプレートファイルに$this->helper()を使用すると、Mage::helper()その後、クリーンであることを主張するかもしれませんが、Magentoのの場合、その引数は、無益であるすべてのモジュール理由とにかくMageMage_Coreクラスのいくつかに非常に依存しています。

実際には、Mage::helper()がはるかに一般的でよく知られている点を除いて、他のものよりも優先する機能的理由はおそらくありません。他の開発者がコードを読みにくくなり、

一方、Magentoはすべての選択について、与えられたタスクを達成するための多くの方法を持っています。

+0

私は 'Mage :: helper()'がもっと便利だと思います。すべてのヘルパーでレイアウトオブジェクトにアクセスする必要がないからです。とにかく、 'Mage :: app() - > getLayout()'でレイアウトを得ることができます。だから私はメソッドの呼び出しを少なくすることを好みます。 –

関連する問題