Magento: adminhtml Блок Директивы не загружается во внешнем шаблоне электронной почты
Я искал сеть в поисках этого. Magento Commerce делает нас сухими для меня. поиск кода, чтение Alan Storm, просмотр Inchoo и даже поиск связанных вопросов по SO, для меня не найдется ответов.
С учетом вышесказанного моя проблема связана с шаблоном транзакционной электронной почты, который работает при обработке из бэкэнда, но не из внешнего интерфейса. Вот фрагмент:
<td width="100%" colspan="2" align="left">
<!-- inject products quote table -->
{{block type="adminhtml/sales_quotation_email" template="sales/quotation/email_quote_items.phtml" inherits=$template quote=$quote salesrep=$salesrep}}
<!-- inject cross-sell products table -->
{{block type="adminhtml/sales_quotation_email" template="sales/quotation/email_quote_cross_sells.phtml" inherits=$template quote=$quote salesrep=$salesrep}}
</td>
В серверной части эти блоки отображаются так, как ожидается. Во внешнем интерфейсе все выше и ниже этих директив блока отображается, но кажется, что директивы умирают в обработке, когда приходит время визуализации шаблона. Ошибки не выбрасываются.
Я последовал совету здесь, но не повезло. Первоначально я пытался использовать setDesignConfig в модели шаблона электронной почты, но это не сработало. Я даже пытался установить area
в качестве атрибута в директиве, но это также не сработало. Коллега предложил мне две копии вышеупомянутых шаблонов: один установлен в design/adminhtml
и другие design/frontend
, Я бы предпочел не беспокоиться о дополнительном обслуживании. Кроме того, я боюсь, что столкнусь с той же проблемой, если тип блока, указанный в директиве, взят из adminhtml. Я не хочу этого решения.
Так что я делаю не так? Что я не понимаю?
Как Magento разрешает реальный путь к шаблону и вынужден ли шаблон находиться в области его родительского блока?
Нужна помощь! Благодарю.
1 ответ
РЕШИТЬ
Я нашел похожую статью в Magento Commerce, которая вернула меня на круги своя. Я начал выводить конфигурацию проекта на два контроллера: 1 в frontend
и один в adminhtml
, Я сразу заметил, что информация о теме отсутствовала в frontend
запрос. Посмотрите пример выходных данных из моего frontend
контроллер:
Mage_Core_Model_Design_Package Object (
[_store:protected] =>
[_area:protected] => frontend
[_name:protected] => mypackage
[_theme:protected] => Array
(
[layout] =>
[template] =>
[skin] =>
[locale] => mytheme
)
[_rootDir:protected] =>
[_callbackFileDir:protected] =>
[_config:protected] =>
[_shouldFallback:protected] => 1 )
Заметить, что layout
, template
, а также skin
пусты в theme
имущество. Когда я сбросил конфигурацию проекта из adminhtml
контроллер, эти свойства были установлены.
Итак, возвращаясь к моему frontend
Контроллер, я добавил следующую строку, прежде чем я создал свою модель шаблона электронной почты:
Mage::getDesign()->setArea('adminhtml');
Mage::getDesign()->setTheme('mytheme');
И пшик! Это сработало! Мои директивы блоков были обработаны, и полностью визуализированный контент был возвращен, как и ожидалось.
Поэтому, хотя мое мышление было правильным, чтобы установить area
Одного этого было недостаточно. Я также должен настроить theme
,
Я доволен решением. Я надеюсь, что это помогает другим. Но чтобы полностью ответить на этот вопрос, мне все еще интересно, если кто-нибудь знает, почему информация о пакете отсутствует в конфигурации проекта во время frontend
запрос. Связано ли это с типом блока в директиве adminhtml
? Это имело бы смысл, потому что adminhtml
не нужно беспокоиться о теме информации. Я просто не знаю, где эти решения будут приняты в основном коде. Смотрите обновление ниже.
ОБНОВИТЬ:
Узнал еще больше с оригинального поста. Мой вопрос дал пример кода, который построил блок типа, который пришел adminhtml
, Я подумал, что путь к шаблону переходит во внешний интерфейс, и поэтому шаблон не может быть найден. На самом деле это не так. Блок adminhtml из-за соглашения об именах классов будет выглядеть design/adminhtml/package/default/module
для вашего шаблона.
Тем не менее, в моей конкретной установке Magento, у меня есть переопределение дизайна в local.xml, который меняет тему администратора так, что она проверяет запросы администратора design/adminhtml/package/mytheme/module
для шаблонов. И именно здесь хранятся мои шаблоны phtml. Таким образом, по внешнему запросу контроллер не имеет ни малейшего представления об этом переопределении, а только создает конфигурацию проекта на основе того, что установлено в конфигурации хранилища для конкретного пакета и темы.
Таким образом, мой вызов setTheme() должен использовать эти измененные данные конфигурации следующим образом:
Mage::getDesign()->setTheme(
(string) Mage::app()
->getConfig()
->getNode('stores/admin/design/theme/default')
);
Полагаю, это говорит о том, что простого вызова setArea() было бы достаточно для большинства установок.
Наконец, вам нужно будет отменить изменения конфигурации проекта после выполнения вашей работы, в противном случае последующие действия могут привести к нежелательным результатам.