Что мне делать, когда расширение перезаписывает класс во всем мире, и я хочу использовать оригинал?

magento.stackexchange https://magento.stackexchange.com/questions/9

  •  16-10-2019
  •  | 
  •  

Вопрос

Мы используем расширение, которое глобально перезаписывает блок mage_catalog_block_product_list_toolbar.

<global>
    <blocks>
        <catalog>
            <rewrite>
                <product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
            </rewrite>
        </catalog>
    </blocks>
</global>

В то время как расширение работает в контексте слоистой категории навигации, переписанный класс не работает должным образом, когда мы вставляем произвольный список продуктов в другой (пользовательский) представление в наш собственный внутренний модуль. Если мы выберем перезапись расширения только для целей тестирования, все работает нормально.

Как мы можем отменить переписывание расширения только для нашего собственного контроллера, не редактируя код сообщества разработчика расширения?

Это было полезно?

Решение

Предостережения: нет никакого разработанного способа сделать то, что вы спрашиваете в системе. Следующее должно работать, но я никогда не пробовал это в системе производства, и могут возникнуть ситуации, когда это вызовет больше проблем, чего стоит. Продолжайте, только если вам удобно отлаживать проблемы, связанные с изменением переписывания рабочей системы.

Шаг 1 отменить переписывание. Дерево конфигурации Magento можно изменить во время выполнения. Итак, если вы запускаете следующий код

$config = Mage::getConfig();        
$config->setNode(
    'global/blocks/catalog/rewrite/product_list_toolbar',
    'Mage_Catalog_Block_Product_List_Toolbar'
);

Тогда Magento создаст оригинал Mage_Catalog_Block_Product_List_Toolbar Блок на оставшуюся часть запроса.

Шаг 2 решает, куда назвать это в вашем модуле. Поскольку это только для вашего контроллера, и он переписывает блок, который не будет создан до конца вашего контроллера, я бы добавил метод в ваш класс контроллера что -то вроде этого

protected function _undoRewrites()
{
    $config = Mage::getConfig();        
    $config->setNode(
        'global/blocks/catalog/rewrite/product_list_toolbar',
        'Mage_Catalog_Block_Product_List_Toolbar'
    );    
}

а затем просто назовите этот метод в начале каждого из ваших действий

public function indexAction()
{
    $this->_undoRewrites();
    $test = Mage::getSingleton('core/layout')->createBlock('catalog/product_list_toolbar');        
    var_dump($test);
}

Это может показаться немного неуклюжим, но я думаю, что это хорошая идея быть неуклюжей (то есть очевидно), когда вы умны с системными объектами Magento. Другим местом для этого может быть controller_action_predispatch или же controller_action_predispatch_front_controller_action События и/или применяются условно.

Просто помните, что переписать не будет отменен, пока этот метод не будет вызван. Это означает, что если вы попытаетесь создать блок перед вызовом _undoRewrites, Переписанный класс будет использоваться для создания объекта.

Другие советы

Решение 1:
Вы можете попытаться создать экземпляр класса напрямую (PHP Way) в вашем контроллере

вместо

$this->getLayout()->createBlock('catalog/product_list_toolbar');

что-то типа:

$block = New Magento_Catalog_Product_List_Toolbar;
$this->getLayout()->addBlock(....);

Решение 2:
Другим подходом будет создание нового класса в вашем модуле, который расширяет исходный класс и использует этот.

Решение 3:
В противном случае, если расширение не зарисовано (мы все любим открытый исходный код :) Вы можете попытаться выяснить, почему оно нарушает ваши вещи

Если для одного и того же псевдоним классов существует несколько перезаписываний, то последнее, что нагнетатель Magento Config Sacder Sacks от config.xml «выигрывает». Я бы напал на эту проблему по:

  1. Создайте новое расширение собственного.
  2. Переписать catalog/product_list_toolbar в вашем расширении
  3. Попросите свой блок расширить Mage_Catalog_Block_Product_List_Toolbar Вместо Amasty Class.
  4. Либерально прокомментируйте ваш класс, объясняя, что этот переписывающий конфликт является преднамеренным. Вы не хотите, чтобы другой разработчик, который управляет Magerun, пытался «исправить» конфликт переписывания, который вы только что создали.
  5. Добавьте зависимость в приложение для вашего расширения/и т. Д./Модули/Blah.xml, чтобы убедиться, что ваше расширение загружается после амасти.

Подобно тому, что Франческо предложил выше, но я считаю, что вы действительно можете передать полное имя класса GetModel. Таким образом, вы все еще делаете то же самое, но используете основные методы для этого. Я не совсем уверен в плюсах/минусах в этом методе, но подумал, что выброжу это как идея.

Mage::getModel('Mage_Catalog_Block_Product_List_Toolbar');

С другой стороны, я считаю, что это будет стандартным способом загрузки классов в Magento2.

Вам нужно сделать небольшое изменение кода расширения, я боюсь. Не переписывайте класс самостоятельно config.xml больше, просто изменить Amasty_Shopby_Block_Catalog_Product_List_Toolbar Чтобы продлить свой класс, который, в свою очередь, распространяется Mage_Catalog_Block_Product_List_Toolbar.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top