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() было бы достаточно для большинства установок.

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

Другие вопросы по тегам