1

我一直在网上搜寻这个。Magento Commerce 对我来说很干。grepping 核心代码,阅读 Alan Storm,细读 Incho,甚至在 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为指令中的属性,但这也不起作用。一位同事建议我将上述模板复制两份:一份设置为 in design/adminhtml,另一份设置为design/frontend. 我宁愿不必担心额外的维护。另外,如果指令中指定的块类型来自 adminhtml,我担心我会遇到同样的问题。我不想要那个解决方案。

那么我做错了什么?我不明白什么?

Magento 如何解析模板的真实路径,模板是否强制驻留在其父块的区域中?

需要帮助!谢谢。

4

1 回答 1

0

解决了

我在Magento Commerce上找到了一篇相关的帖子,让我重回正轨。我开始在两个控制器中转储设计配置:1 infrontend和 1 in 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() 的简单调用就足够了。

最后,您需要在工作完成后恢复设计配置更改,否则后续操作可能会产生不希望的结果。

于 2013-01-03T19:20:54.790 回答