我有几个方案,我尝试使用CMS手柄来更新CMS页面的布局。例如,我试图使用CMS_INDEX_INDEX句柄引用根并设置页面模板。这是失败的,我必须直接通过主页CMS页面显示设置上的管理系统进行此布局更新。

我还尝试使用CMS_PAGE句柄添加一个块以左图。再次失败了,我必须通过管理系统实现布局更新。

我读到您无法将根模板分配给CMS页面。这是正确的,有人可以解释为什么吗?

我还想知道是否有一种方法可以使CMS手柄使用左,右,根等等标准参考?我似乎能够参考诸如头部和内容之类的东西。

有帮助吗?

解决方案

为什么更改根模板不起作用

两个都

Mage_Cms_IndexController::indexAction()

Mage_Cms_IndexController::viewAction()

负责显示默认主页和CMS页面分别调用助手:

Mage::helper('cms/page')->renderPage($this, $pageId)

如果您跳入助手(位于App/Code/Core/Mage/CMS/Helper/Page.php)并关注 renderPage() 到受保护的方法 _renderPage() 您会看到Magento检查了两次根模板(Magento CE 1.7.0.2):

if ($page->getRootTemplate()) {
    $handle = ($page->getCustomRootTemplate()
                && $page->getCustomRootTemplate() != 'empty'
                && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
    $action->getLayout()->helper('page/layout')->applyHandle($handle);     
}

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

这两个呼叫都在布局手柄之后发生,例如“ CMS_PAGE”等处理,因此您在这里不幸。

您可以做什么来更改根系模板

有一个事件 cms_page_render 您可以将其用于在CMS页面上添加自己的XML布局句柄。创建您自己的扩展名(我将在此处放置一些详细信息)并在您的观察者中配置事件观察者 config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Emzee_Cms>
            <version>0.0.1</version>
        </Emzee_Cms>
    </modules>

    <global>
        <events>
            <cms_page_render>
                <observers>
                    <emzee_cms_page_render>
                        <class>emzee_cms/observer</class>
                        <method>cms_page_render</method>
                    </emzee_cms_page_render>
                </observers>
            </cms_page_render>
        </events>
        <models>
            <emzee_cms>
                <class>Emzee_Cms_Model</class>
            </emzee_cms>
        </models>
    </global>
</config>

添加您的活动观察者:

<?php

class Emzee_Cms_Model_Observer
{
    public function cms_page_render(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        $actionName = strtolower($action->getFullActionName());
        $action->getLayout()->getUpdate()
            ->addHandle($actionName . '_after');
        return $this;
    }
}

最后,添加您的新布局XML句柄(例如在您的 local.xml):

<?xml version="1.0"?>
<layout version="0.1.0">
    <cms_index_index_after>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </cms_index_index_after>
</layout>

您也可以使用此方法添加 cms_page_view_after 处理或创建特定页面作为 cms_page_render 通过 $page 对象的观察者。

为什么您不能在“参考左”中添加一个块

您确定所使用的模板具有左列吗?这个问题听起来可能很愚蠢,但默认的“ 2列具有右栏”布局仅提供'content'和``正确''区域。我可以使用 cms_page 没有问题,所以这可能是问题。

通常,您只能轻松地将块添加到引用中,并在

  • 所选的根模板使用您要引用的块(请参阅 app/design/frontend/base/default/template/page/*.phtml) 和
  • 您所引用的块是类型 core/text_list, ,电话 $this->getChildhtml() 没有争论,或者做其他事情以呼应所有儿童障碍。

没有更多的详细信息,我无法告诉您为什么您的块在左或右列中没有回声。

其他提示

关于您的“无法使用 <reference name="left/>,您确定您的CMS页面有一个名为左的块吗?例如,如果您考虑使用Magento示例数据发票的默认主页,则 出现 要有一个名为左的块。

is that a left column?

但是,如果您查看后端中的页面,则可以看到它设置为使用根模板

`2 columns with right bar`    

然后在其内容区域中,使用HTML标记添加左列(将Wysiwyg切换到源视图)

<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>

该定向图清楚地表明没有命名 left 钩住(单击以获取全尺寸图像)

directed graph generated with Commerce Bug

关于设置模板,如果您查看“布局”下拉的源

<select id="page_root_template" name="root_template" class=" required-entry select">
    <option value="empty">Empty</option>
    <option value="one_column">1 column</option>
    <option value="two_columns_left">2 columns with left bar</option>
    <option value="two_columns_right" selected="selected">2 columns with right bar</option>
    <option value="three_columns">3 columns</option>
</select>

您可以在设置此字段时查看,实际值为实际值是类似的 one_column, two_columns_left, 等等。这些值对应于同名的布局手柄。

#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
    <label>All One-Column Layout Pages</label>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>one_column</name></action>
    </reference>
</page_one_column>
...
<page_two_columns_left translate="label">
    <label>All Two-Column Layout Pages (Left Column)</label>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>two_columns_left</name></action>
    </reference>
</page_two_columns_left>

当Magento渲染CMS页面时,它会引用保存的值,并将适当的布局句柄添加到页面。虽然它与问题是切线,但此处添加了此处

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    //...
    $action->addActionLayoutHandles();        
    if ($page->getRootTemplate()) {
        $handle = ($page->getCustomRootTemplate()
                    && $page->getCustomRootTemplate() != 'empty'
                    && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
        $action->getLayout()->helper('page/layout')->applyHandle($handle);
    }  
    //...
}

更重要的是 命令 布局手柄添加了

Handles Tab of Commerce Bug

正如您在上面的屏幕截图中看到的那样 page_two_columns_right 添加了手柄 cms_index_index 处理。这意味着,如果添加了布局XML更新代码以更改模板 cms_index_index 您的代码将运行,但是布局更新XML代码 page_two_columns_right 将追随它。

我一直怀疑这是设计是为了确保用户界面中的模板设置为 总是 正确的。在先前版本的Magento中 <action method="setIsHandle"><applied>1</applied></action> 方法调用似乎存在出于相同的原因。

因此,使用纯布局XML代码无法完成您想做的事情。如果您喜欢创建自定义模块和观察者代码,请查看 cms_page_render 事件。这是之前发射的 loadLayoutUpdates 被称为,可以让您在中滑动一个手柄名称,或删除现有的手柄名称。

许可以下: CC-BY-SA归因
scroll top