否决Magento模板

时间:2013-07-07 18:05:35

标签: magento magento-1.7

我希望我的所有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>

我做错了什么?

1 个答案:

答案 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>