2

我有一个通用模板文件,我希望将其用于每个页面。我目睹了一位同事向他的 local.xml 或 page.xml 布局文件添加了一个参数,该参数强制每个页面使用特定的布局文件,而不管数据库值如何。他已经离开了公司,所以我不能问他是怎么做到的。我已经尝试了如何使用 local.xml 在 Magento 1.5 中设置默认布局中建议的答案?但这没有用。

如何强制 Magento (1.7) 仅加载我想要的模板/布局?

4

3 回答 3

3

遗憾的是,您不仅可以使用单个选项来确保所有页面布局都将使用您的模板,而且您可以应用布局句柄,该句柄将在每个页面布局句柄中设置您的自定义模板。

所以在你的 local.xml 中应该有如下内容:

<your_custom_handle>
     <action method="setTemplate" block="root"><template>your/template.phtml</template></action>
</your_custom_handle>

<page_empty>
     <update handle="your_custom_handle" />
</page_empty>

<page_one_column>
     <update handle="your_custom_handle" />
</page_one_column>

<page_two_columns_left>
     <update handle="your_custom_handle" />
</page_two_columns_left>

<page_two_columns_right>
     <update handle="your_custom_handle" />
</page_two_columns_right>

<page_three_columns>
     <update handle="your_custom_handle" />
</page_three_columns>

布局更新的第一部分,创建您自己的句柄,将模板设置为根块。所有其他人都将您的自定义句柄包含到不同的页面布局中。

享受!

于 2012-07-27T15:07:58.383 回答
1

作为 Ivans 回答的替代方案,您还可以使用事件观察器来设置模板。有关更长的解释,请参见此答案。这是您可以使用的代码:

应用程序/设计/前端/yourpackage/yourtheme/layout/local.xml

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">

    <!-- your other adjustments for default, category_product_view and so on go here -->

    <set_root_template>
        <reference name="root">
             <action method="setTemplate"><template>your/template.phtml</template></action>
        </reference>
    </set_root_template>
</layout>

app/code/yourpool/Company/Extension/Model/Observer.php

    <?php

    class Company_Extension_Model_Observer
    {
        /**
         * Sets the template file for the root block.
         * 
         * Uses the event 'controller_action_layout_load_before'.
         * 
         * @param Varien_Event_Observer $observer
         * @return YourCompany_YourExtension_Model_Observer
         */
        public function setRootTemplate(Varien_Event_Observer $observer)
        {
            $layout = $observer->getEvent()->getLayout()->getUpdate();
            $layout->addHandle('set_root_template');
            return $this;
        }
    }

app/code/yourpool/Company/Extension/etc/config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<config>
    <modules>
        <Company_Extension>
            <version>0.0.1</version>
        </Company_Extension>
    </modules>

    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <company_extension_set_root_template>
                        <type>singleton</type>
                        <class>company_extension/observer</class>
                        <method>setRootTemplate</method>
                    </company_extension_set_root_template>
                </observers>
            </controller_action_layout_load_before>
        </events>
        <!-- declaring your layout xml etc. -->
    </frontend>

    <global>
        <!-- declaring your block classes etc. -->
        <models>
            <company_extension>
                <class>Company_Extension_Model</class>
            </company_extension>
        </models>
    </global>
</config>

应用程序/etc/modules/Company_Extension.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Company_Extension>
            <active>true</active>
            <codePool>local</codePool>
        </Company_Extension>
    </modules>
</config>
于 2012-08-08T16:46:49.110 回答
0

作为另一种选择。(但与@MatthiasZeis 的建议基本相同)。我只是还提供了一个模块来做它)

我有同样的问题,我想出了相同的想法,即使用观察者事件将自定义句柄注入 magento。

因此我的代码注入了一个名为 'load last' 的句柄<GLOBAL_OVERRIDE>,然后允许您通过布局指令设置根模板。

由于它是最后加载的,因此任何先前设置的用于更改模板的布局指令都将替换为<GLOBAL_OVERRIDE>

<GLOBAL_OVERRIDE>
        <reference name="root">
            <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        </reference>
    </GLOBAL_OVERRIDE>

您可以轻松地使用它来全局删除另一个句柄,或取消设置整个站点的子块

我将代码放在github中:

https://github.com/ProxiBlue/GlobalHandle

于 2014-02-13T09:47:57.790 回答