我已经看到了几种不同的方法来获得特定的helper
,我希望有人可以解释每种方法的优缺点。例如,在template/checkout/cart/sidebar/default.phtml
中,您会看到$this->helper('checkout')
和Mage::helper('checkout')
。这两种方法在同一模板中有充分的理由吗?
以下是我在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);
}
…
}
答案 0 :(得分: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完全是选择,并有很多方法可以完成某项任务。