Мы используем расширение, которое глобально перезаписывает блок 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>
Хотя расширение работает в контексте многоуровневой категории навигации, переписанный класс не работает должным образом, когда мы вставляем произвольный список продуктов в другое (настраиваемое) представление в нашем собственном внутреннем модуле. Если мы удалим перезапись расширения только для целей тестирования, все будет нормально.
Как мы можем отменить переписывание расширения только для нашего собственного контроллера, не редактируя код сообщества разработчиков расширения?
magento-1
extensions
overrides
Аарон Поллок
источник
источник
<rewrite>
каждого класса, поэтому, хотя я мог создать свой собственный класс, расширяющий базовый класс, я не уверен, как заставить его работать с помощьюgetBlock('catalog/product_list_toolbar')
фабричного метода.Ответы:
Предостережения: в системе нет спроектированного способа сделать то, что вы просите. Следующее должно работать, но я никогда не пробовал это на производственной системе, и могут быть ситуации, когда это вызовет больше проблем, чем оно того стоит. Продолжайте, только если вам удобно отлаживать проблемы, связанные с изменением переписывания работающей системы.
Шаг 1 отменяет переписывание. Дерево конфигурации Magento может быть изменено во время выполнения. Итак, если вы запустите следующий код
Затем Magento создаст исходный
Mage_Catalog_Block_Product_List_Toolbar
блок для оставшейся части запроса.Шаг 2 решает, где вызвать это в вашем модуле. Так как это только для вашего контроллера, и он переписывает блок, который не будет создан до конца вашего контроллера, я бы добавил метод к вашему классу контроллера примерно так
а затем просто вызовите этот метод в начале каждого из ваших действий
Это может показаться немного неуклюжим, но я думаю, что неплохо быть неуклюжим (то есть очевидным), когда вы хорошо разбираетесь в системных объектах Magento. Другим местом для этого могут быть
controller_action_predispatch
илиcontroller_action_predispatch_front_controller_action
события и / или условия применения.Просто помните, что перезапись не будет отменена, пока не будет вызван этот метод. Это означает, что если вы попытаетесь создать экземпляр блока перед вызовом
_undoRewrites
, переписанный класс будет использован для создания объекта.источник
Решение 1.
Вы можете попытаться создать экземпляр класса напрямую (php way) в вашем контроллере.
вместо того
что-то типа:
Решение 2.
Другой подход заключается в создании нового класса в вашем модуле, который расширяет исходный класс и использует его.
Решение 3.
В противном случае, если расширение не зашифровано (мы все любим открытый исходный код :), вы можете попытаться выяснить, почему оно ломает ваши данные
источник
rewrite
в том же базовом классе. Поэтому фабричный метод не сработает (вы уже поняли это, я думаю, уже). Возможно, нет никакого Magento способа сделать это, но давайте немного подождем, чтобы увидеть, есть ли лучший способ.$this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")
когда вы находитесь в контексте класса блока). Если его нет/
в параметре, Magento просто использует строку как есть для поиска класса.Если существует несколько перезаписей для одного и того же псевдонима класса, то последний из них, загрузчик конфигурации Magento, анализирует из config.xml "wins". Я бы напал на эту проблему:
catalog/product_list_toolbar
в своем расширенииMage_Catalog_Block_Product_List_Toolbar
вместо класса Amasty.источник
Подобно тому, что предложил Франческо выше, но я полагаю, что вы действительно можете передать полное имя класса в getModel. Таким образом, вы все еще делаете то же самое, но используете для этого основные методы. Я не совсем уверен в плюсах / минусах этого метода, но подумал, что я выброшу это как идею.
Кстати, я считаю, что это будет стандартный способ загрузки классов в Magento2.
источник
Я боюсь, что вам нужно немного изменить код расширения. Не переписывайте класс по-своему
config.xml
, просто измените его,Amasty_Shopby_Block_Catalog_Product_List_Toolbar
чтобы расширить класс, который, в свою очередь, расширяетсяMage_Catalog_Block_Product_List_Toolbar
.источник