2012-02-17 3 views
5

Я видел несколько разных подходов к получению определенного helper, и я надеюсь, что кто-то сможет объяснить плюсы и минусы каждого подхода. Например, в template/checkout/cart/sidebar/default.phtml вы увидите как $this->helper('checkout'), так и Mage::helper('checkout'). Есть ли веская причина для этих двух разных методов в одном шаблоне?В чем разница между различными методами * get helper * в Magento?

Ниже приведены все различные способы получения помощника я мог бы найти в 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.

Метод getBlockSingleton() хранит экземпляр в $_helpers свойства объекта макета, метод createBlock() будет хранить его в $_blocks собственности.

Только блоки из массива $_blocks могут ссылаться (и перезаписываться) с использованием макета XML.

Метод 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()'. Поэтому я предпочитаю делать меньше вызовов методов. –

Смежные вопросы