the*_*roc 2 magento magento-1.7 magento-1.8
在尝试调试几个小时后,我没有想法,希望得到一些澄清(我想我在某些时候想念一个概念).
背景故事:一些基类需要一个"概述页面",它应该从子类别和产品中自动生成.所以我的方法是在每个基类别中添加一个子类别,并创建一个从所有这些子类别中使用的自定义页面布局.对于我的客户来说,这很容易在Magento后端管理,因为他只需要在一个下拉列表中更改值.所以我创建了一个定义新页面布局的简单模块.在后端我也可以选择这个.
模块配置:
<?xml version="1.0"?>
<config>
<modules>
<Company_Layouts>
<version>0.1.0</version>
</Company_Layouts>
</modules>
<global>
<page>
<layouts>
<company_category_overview module="page" translate="label">
<label>Kategorie-Übersicht</label>
<template>page/1column.phtml</template>
<layout_handle>company_category_overview</layout_handle>
</company_category_overview>
</layouts>
</page>
</global>
<frontend>
<layout>
<updates>
<company_layouts>
<file>company_layouts.xml</file>
</company_layouts>
</updates>
</layout>
</frontend>
</config>
Run Code Online (Sandbox Code Playgroud)
由于这些特殊的概述页面需要进行一些布局更改,我希望在特定的布局文件中引用布局(company_layouts.xml)...这里我的逻辑离开了我:
随着<layout_handle>company_category_overview</layout_handle>我希望定义一个手柄,我可以用它来改变时,才使用这种特定的页面模板布局.确切情况并非如此.我company_category_overview只是忽略了句柄内部的布局更新.
深入挖掘后,我意识到,它似乎不是我的代码,而更像是一般问题.在旧的Magento 1.4安装中,页面布局句柄被传送到所有站点,例如page_one_column.在Magento 1.7和(我现在使用的)1.8这只是在主页上的情况.我正在使用Commerce Bug进行调试.我刚尝试了一个全新的1.7和一个freh 1.8安装.
这是一些我不理解的概念还是一个普通的错误?
另外,我知道布局更新可以在后端实现,但这只是我的最后一个选项,因为我觉得在一个单独的文件中更清晰,而不需要复制/粘贴这些东西.
这是一些我不理解的概念还是一个普通的错误?
都?都不是?<page><layout>...</layout></page>节点中的信息由类别页面和CMS页面使用,但每个系统使用不同的信息,并且两个系统都不会以您期望的方式使用它.以下是类别页面如何使用此信息的简要说明.
类别页面由以下控制器操作呈现
#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
public function viewAction()
{
...
}
Run Code Online (Sandbox Code Playgroud)
此控制器操作没有标准loadLayout和renderLayout方法调用.相反,此方法中有许多额外的代码用于在生成块和渲染最终布局之间添加布局句柄和操作.我们感兴趣的部分就是这个
$design = Mage::getSingleton('catalog/design');
$settings = $design->getDesignSettings($category);
#...other stuff we don't care about...
if ($settings->getPageLayout()) {
$this->getLayout()->helper('page/layout')->applyTemplate($settings->getPageLayout());
}
Run Code Online (Sandbox Code Playgroud)
在"自定义设计"选项卡中使用"页面布局"保存类别时getPageLayout,应返回上面的方法调用company_category_overview.在类别页面上,Magento不使用它来应用句柄,而是将值传递给applyTemplate方法.完全是这个方法.
#File: app/code/core/Mage/Page/Helper/Layout.php
public function applyTemplate($pageLayout = null)
{
if ($pageLayout === null) {
$pageLayout = $this->getCurrentPageLayout();
} else {
$pageLayout = $this->_getConfig()->getPageLayout($pageLayout);
}
if (!$pageLayout) {
return $this;
}
if ($this->getLayout()->getBlock('root') &&
!$this->getLayout()->getBlock('root')->getIsHandle()) {
// If not applied handle
$this->getLayout()
->getBlock('root')
->setTemplate($pageLayout->getTemplate());
}
return $this;
}
Run Code Online (Sandbox Code Playgroud)
相关部分是这一行,
$pageLayout = $this->_getConfig()->getPageLayout($pageLayout);
Run Code Online (Sandbox Code Playgroud)
这将从您的配置加载信息
<label>Kategorie-Übersicht</label>
<template>page/1column.phtml</template>
<layout_handle>company_category_overview</layout_handle>
Run Code Online (Sandbox Code Playgroud)
作为一个Varien_Object.然后,它将使用此信息将模板应用于根块.
$this->getLayout()
->getBlock('root')
>setTemplate($pageLayout->getTemplate());
Run Code Online (Sandbox Code Playgroud)
因此,对于类别页面,<layout_handle/>永远不会使用节点中的信息.这就是为什么你的布局更新没有应用 - Magento实际上应用了你的句柄.
| 归档时间: |
|
| 查看次数: |
1468 次 |
| 最近记录: |