ошибка на странице списка отзывов


В моем наблюдателе за core_layout_block_create_after

Я проверяю

public function addButtonBlock($observer)
    {
        $block = $observer->getEvent()->getBlock();

        if (($block->getAction()->getFullActionName() == 'catalog_product_view') && ($block->getNameInLayout() == 'product.info')) {
            }}

Он отлично работает на странице просмотра продукта, в то время как на странице списка отзывов с формой он выдает ошибку

Неустранимая ошибка PHP: Вызов функции-члена getFullActionName() в строке в /var/www/html/meemee/app/code/community/Tebet/SocialShare/Model/Observer.php в строке 15, ссылка: http://localhost/meemee/asd.html

Я могу получить эхо для список рецензий_продуктов для $block->getAction()->getFullActionName() , но при его использовании в условии if он выдает ошибку

Author: Raphael at Digital Pianism, 2016-04-08

1 answers

Здесь возникает интересная проблема.

В основном проблема заключается в том, что метод getAction, объявленный в Mage_Core_Block_Abstract, определенно является тем, что вам нужно использовать здесь, и ваш код определенно правильный.

Предполагается, что он возвращает Mage_Core_Controller_Varien_Action, который вы можете использовать для получения полного имени действия.

Однако блок Mage_Review_Block_Form полностью переписывает метод getAction со следующим кодом:

public function getAction()
{
    $productId = Mage::app()->getRequest()->getParam('id', false);
    return Mage::getUrl('review/product/post', array('id' => $productId, '_secure' => $this->_isSecure()));
}

Этот код возвращает строку, поэтому вы не можете вызвать метод getFullActionName для нее, это проблема.

Я не уверен, почему команда Magento использовала то же имя, что и такая важная функция родительского блока, для меня это звучит как ошибка.

Чего вы можете избежать, так это:

Либо используйте вместо этого следующий код:

Mage::app()->getFrontController()->getAction()->getFullActionName()

Или, если вы хотите что-то сделать для определенного блока, а не для каждого созданного блока, добавьте условие для проверки класса блоков:

if ($block instanceof The_Block_You_Want)
{
    if (($block->getAction()->getFullActionName() == 'catalog_product_view') && ($block->getNameInLayout() == 'product.info'))
        {
              //
        }
}

Конечно, это не сработает, если блок, который вы хотите протестировать, является Mage_Review_Block_Form ^^

На примечание, пожалуйста, обратите внимание, что следующий блок также переписывает метод getAction: Mage_Customer_Block_Newsletter (и он также возвращает строку)

 6
Author: Raphael at Digital Pianism, 2016-04-08 10:12:27