我希望我的所有CMS页面(但不是所有页面)都使用自定义模板文件,但是当我在local.xml文件中使用setTemplate操作时,它不会更改模板。该块正确渲染但没有正确的布局。
我现在使用的XML是:
<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<cms_page_view>
<reference name="root">
<action method="setTemplate"><template>page/cms-page.phtml</template></action>
</reference>
<reference name="right">
<block type="catalog/navigation" name="default_page_view" template="navigation/game-menu.phtml"/>
</reference>
</cms_page_view>
</layout>
我做错了什么?
答案 0 :(得分:3)
您没有做错任何事 - 您的指令被实体数据覆盖。出于这个原因,请参阅Mage_Cms_Helper_Page::_renderPage()
:
protected function _renderPage(/*...*/)
{
//snip...
$action->getLayout()->getUpdate()
->addHandle('default')
->addHandle('cms_page');
$action->addActionLayoutHandles();
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
//snip...
}
因此,您的指令正在完整的操作名称句柄cms_page_view
下处理,该句柄通过$action->addActionLayoutHandles();
调用添加。 CMS页面实际上始终通过管理员保存root_template
值,而此值将始终覆盖基于文件的指令。
虽然可以更新数据,但是当它被覆盖时会有被覆盖的风险为了提供一个备用模板,当通过管理员编辑页面时将保留该模板,有必要指定一些配置值和一些相应的布局XML。在自定义模块的配置XML(或 app/etc/local.xml
中,如果这是非分布式更改):
<global>
<page>
<layouts>
<cms_page_custom>
<label>Empty</label>
<template>page/cms-page.phtml</template>
<layout_handle>cms_page_custom</layout_handle>
</cms_page_custom>
</layouts>
</page>
</global>
这将在CMS页面管理期间为选择输入提供选项。要完成此工作,请在自定义布局XML中:
<cms_page_custom>
<reference name="root">
<action method="setTemplate"><template>page/cms-page.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>empty</name></action>
</reference>
</cms_page_custom>