CMS XML手柄用于布局更新
-
16-10-2019 - |
题
我有几个方案,我尝试使用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示例数据发票的默认主页,则 出现 要有一个名为左的块。
但是,如果您查看后端中的页面,则可以看到它设置为使用根模板
`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
钩住(单击以获取全尺寸图像)
关于设置模板,如果您查看“布局”下拉的源
<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);
}
//...
}
更重要的是 命令 布局手柄添加了
正如您在上面的屏幕截图中看到的那样 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
被称为,可以让您在中滑动一个手柄名称,或删除现有的手柄名称。