В чем разница между различными * get helper * методами в Magento? - PullRequest
5 голосов
/ 17 февраля 2012

Я видел несколько разных подходов к получению конкретного 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);
    }
…
}

1 Ответ

10 голосов
/ 18 февраля 2012

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 полностью зависит от выбора и имеет множество способов выполнить заданную задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...