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

Layout 如何为主页设置自定义模板?,layout,magento,Layout,Magento,我已尝试使用local.xml文件为主页设置1列模板: <cms_index_index> <reference name="root"> <action method="setTemplate"><template>page/1column.phtml</template></action> </reference> </cms_index_index> 第/1页

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

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

第/1页column.phtml

但这是行不通的。我怎样才能做到这一点?

主页是一个CMS页面。不幸的是,您不能使用布局为CMS页面分配根模板,因为它们有自己的属性“根模板”(CMS页面表)。 您可以在后端(CMS-Pages)中更改此属性。 或者您可以在代码中对其进行更改:

$homePage = Mage::getModel('cms/page')->load('home', 'identifier');
$homePage->setRootTemplate('one_column');
$homePage->save();
我建议您编写sql数据升级,它将更新主页的根模板值:

$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();

主页是一个CMS页面。不幸的是,您不能使用布局为CMS页面分配根模板,因为它们有自己的属性“根模板”(CMS页面表)。 您可以在后端(CMS-Pages)中更改此属性。 或者您可以在代码中对其进行更改:

$homePage = Mage::getModel('cms/page')->load('home', 'identifier');
$homePage->setRootTemplate('one_column');
$homePage->save();
我建议您编写sql数据升级,它将更新主页的根模板值:

$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();

问题在于Mage\u Cms\u Helper\u页面::\u 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());
}
还请注意,此方法中的唯一事件是如何不方便地置于所有这些事件之上的。。。如果要干净地修复此问题(无需查询),应观察以下事件:

控制器\u操作\u后调度\u cms\u索引\u索引

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


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

问题在于Mage\u Cms\u Helper\u页面::\u 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());
}
还请注意,此方法中的唯一事件是如何不方便地置于所有这些事件之上的。。。如果要干净地修复此问题(无需查询),应观察以下事件:

控制器\u操作\u后调度\u cms\u索引\u索引

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


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

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


第/1页column.phtml

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


第/1页column.phtml

或者更简单地说,可以将Snowcore的XML更改为使用
setRootTemplate
方法。@clockworkgeek如何更改?我试图将布局“setTemplate”更改为“setRootTemplate”-但不起作用。它不起作用?我不该这么轻易地假设。我犯了一个错误。似乎唯一有效的方法是通过代码(sql升级)进行设置@谢谢你!或者更简单地说,可以将Snowcore的XML更改为使用
setRootTemplate
方法。@clockworkgeek如何更改?我试图将布局“setTemplate”更改为“setRootTemplate”-但不起作用。它不起作用?我不该这么轻易地假设。我犯了一个错误。似乎唯一有效的方法是通过代码(sql升级)进行设置@谢谢你!谢谢你的提示。但是使用observer会稍微慢一点。@Snowcore:我认为性能的影响几乎可以忽略不计。。。当然,这也取决于行为的要求;observer解决方案将阻止用户修改页面布局。谢谢提示。但是使用observer会稍微慢一点。@Snowcore:我认为性能的影响几乎可以忽略不计。。。当然,这也取决于行为的要求;观察者解决方案将阻止用户修改页面布局。这看起来与原始问题相同。@clockworkgeek-不完全一样。他将代码放在local.xml中,它引用root,但仅用于cms\u index\u索引句柄。我把我的放在CMS主页本身的布局更新XML部分,它引用根目录。我想这是最重要的:)看起来和原来的问题一样。@clockworkgeek-不完全一样。他将代码放在local.xml中,它引用root,但仅用于cms\u index\u索引句柄。我把我的放在CMS主页本身的布局更新XML部分,它引用根目录。我想这是最重要的:)