2012-02-17 70 views
5

我見過幾種不同的方法來獲得一個特定的helper,我希望有人可以解釋每種方法的優缺點。例如,在template/checkout/cart/sidebar/default.phtml中,您會看到$this->helper('checkout')Mage::helper('checkout')。這兩種不同的方法在同一個模板中是否有很好的理由?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屬性中。

只能使用佈局XML來引用(和覆蓋)來自$_blocks數組的塊。

如果您需要某個特定塊類的實例,並且您希望確保不創建該塊的新實例(如果該實例已存在),則該方法getBlockSingleton()非常有用。
爲了實現(幾乎)通過createBlock()你需要下面的代碼創建的實例相同的效果:

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()

Mage_Core_Block_Abstract::helper()方法返回的在Magento是通常一個實例簡稱助手。
直接調用Mage::helper($name)的唯一區別是佈局對象被設置爲助手實例的屬性。

有人可能會認爲,在模板文件中使用$this->helper()更乾淨,然後Mage::helper(),因爲是減少硬編碼引用(因而依賴)到Mage類的數量,但在Magento的情況下,這樣的說法是徒勞的,因爲每一個模塊無論如何非常依賴於Mage和一些Mage_Core類。

在實踐中,除了Mage::helper()更常見且衆所周知外,可能沒有任何功能原因會使其中一個比較喜歡,其他開發人員閱讀代碼會更容易混淆,這會使其更易於維護。

另一方面,Magento是所有關於選擇,並有許多方法來完成給定的任務。

+0

我覺得'Mage :: helper()'更有用,因爲不是每個幫助者都需要訪問佈局對象。無論如何,你可以通過'Mage :: app() - > getLayout()'獲得佈局。所以我寧願減少方法的調用。 – 2014-11-05 10:26:03

相關問題