我有一个通用模板文件,我希望将其用于每个页面。我目睹了一位同事向他的 local.xml 或 page.xml 布局文件添加了一个参数,该参数强制每个页面使用特定的布局文件,而不管数据库值如何。他已经离开了公司,所以我不能问他是怎么做到的。我已经尝试了如何使用 local.xml 在 Magento 1.5 中设置默认布局中建议的答案?但这没有用。
如何强制 Magento (1.7) 仅加载我想要的模板/布局?
我有一个通用模板文件,我希望将其用于每个页面。我目睹了一位同事向他的 local.xml 或 page.xml 布局文件添加了一个参数,该参数强制每个页面使用特定的布局文件,而不管数据库值如何。他已经离开了公司,所以我不能问他是怎么做到的。我已经尝试了如何使用 local.xml 在 Magento 1.5 中设置默认布局中建议的答案?但这没有用。
如何强制 Magento (1.7) 仅加载我想要的模板/布局?
遗憾的是,您不仅可以使用单个选项来确保所有页面布局都将使用您的模板,而且您可以应用布局句柄,该句柄将在每个页面布局句柄中设置您的自定义模板。
所以在你的 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>
布局更新的第一部分,创建您自己的句柄,将模板设置为根块。所有其他人都将您的自定义句柄包含到不同的页面布局中。
享受!
作为 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>
作为另一种选择。(但与@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中: