如何为主页设置自定义模板?

时间:2011-06-10 13:27:17

标签: layout magento

我尝试使用local.xml文件为主页设置1列模板:

<cms_index_index>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</cms_index_index>

但这不起作用。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

主页是CMS页面。遗憾的是,您无法使用布局为CMS页面分配根模板,因为它们具有自己的属性“root_template”(cms_page表)。 您可以在后端更改此属性(CMS - 页面)。 或者您可以在代码中更改它:

$homePage = Mage::getModel('cms/page')->load('home', 'identifier');
$homePage->setRootTemplate('one_column');
$homePage->save();

我建议您编写 sql data upgrade ,这将更新主页的根模板值:

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */

$installer->startSetup();

$installer->run("
    UPDATE `{$this->getTable('cms_page')}` SET `root_template` = 'one_column' WHERE `identifier` = 'home';
");

$installer->endSetup();

答案 1 :(得分:2)

我确信其他建议效果很好,但对我来说这看起来太复杂了。我所做的似乎工作得很好的是简单地将以下内容放入有问题的CMS页面的布局更新XML中(在本例中是您的主页)

<reference name="root">
    <action method="setTemplate">
        <template>page/1column.phtml</template>
    </action>
</reference>

答案 2 :(得分:0)

问题出现在Mage_Cms_Helper_Page :: _ renderPage中。应用布局更新 - 应用前根模板(从后端配置):

Mage::dispatchEvent('cms_page_render', array('page' => $page, 'controller_action' => $action));

$action->loadLayoutUpdates();
$layoutUpdate = ($page->getCustomLayoutUpdateXml() && $inRange) ? $page->getCustomLayoutUpdateXml() : $page->getLayoutUpdateXml();
$action->getLayout()->getUpdate()->addUpdate($layoutUpdate);
$action->generateLayoutXml()->generateLayoutBlocks();

...

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

另请注意此方法中唯一的事件是如何不方便地置于所有这一点之上......如果您想要彻底解决此问题(无需查询),您应该观察以下事件:

controller_action_postdispatch_cms_index_index

然后执行以下操作(未经测试,但应该有效):

$this->getEvent()->getControllerAction()->getLayout()->helper('page/layout')->applyTemplate('one_column');

然后再次渲染布局。这只是一个如何通过观察者解决这个问题的指南。