Как расширения переопределяют неперезаписываемые классы
Я собирался собрать крошечное расширение, чтобы включить подсказки шаблона в глобальной области, но застрял, пытаясь переписать core/template
.
Перезапись класса работает только для классов, созданных с помощью одного из методов Magento для этого (helper
, getModel
, getSingleton
). Для абстрактных и сильно расширенных классов у вас, похоже, остается возможность переопределения local/Mage
.
Два вопроса:
- Есть ли разумный способ вообще избежать переопределений
local/Mage
раз? - Если нет, то как вы собираетесь включать такие переопределения в расширения сообщества?
1 answers
1) Любое расширение, которое вы предлагаете сообществу, должно находиться в пуле кодов сообщества.
2) Вы не должны, но вы можете, а иногда и должны, потому что Деметра часто игнорировалась в Magento 1.
Почти всегда есть способ обойти необходимость переопределения, включая использование отражения , как упоминал Винай некоторое время назад.
Если у обходных путей слишком много недостатков, вы просто должны взять на себя ответственность за определение класса. Ты можешь выполните одно из следующих действий, при условии, что пользователи будут проинформированы:
- В пуле кода сообщества предоставьте измененное определение в соответствующем пространстве имен Mage|Varien|Zend. Возможная проблема заключалась бы в том, что конечный пользователь мог бы сделать то же самое.
- Как указано выше, но в новом пуле кода: добавьте новый пул кода к загрузочным путям включения, используя
set_include_path()
. Недостаток: большеstat()
, вызванных загрузчиком, и ваши манипуляции с включением пути будут неочевидными, поскольку они находятся за пределами из начальной загрузки. - Если возможно, предоставьте определение самостоятельно, прежде чем оно будет загружено из своего обычного местоположения, например, явно
include()
используя его из нестандартного местоположения в вашем пространстве имен.
Озвучьте ваши индивидуальные потребности здесь - у кого-нибудь появится идея. Что касается подсказок пути к шаблону в области администратора, смотрите Мой ответ, который даже не требует PHP.