2

在尝试调试了几个小时后,我没有想法并希望得到一些澄清(我想我在某些时候误解了一个概念)。

背景故事:一些基本类别需要一个“概览页面”,它应该从子类别和产品中自动生成。所以我的方法是为每个基本类别添加一个子类别,并创建一个自定义页面布局,用于所有这些子类别。对于我的客户来说,这在 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>

由于这些特殊的概述页面需要一些布局更改,我希望在特定布局文件 ( 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 和新的 1.8 安装。

这是我不理解的一些概念还是只是一个简单的错误?

另外,我知道可以在后端实现布局更新,但这只是我的最后一个选择,因为我觉得将它放在单独的文件中会更干净,而无需复制/粘贴这些东西。

4

1 回答 1

5

这是我不理解的一些概念还是只是一个简单的错误?

两个都?两者都不?节点中的信息<page><layout>...</layout></page>由类别页面和 CMS 页面使用,但每个系统使用信息的方式不同,并且没有一个系统以您期望的方式使用它。以下是类别页面如何使用此信息的简要说明。

类别页面由以下控制器操作呈现

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php
public function viewAction()
{
    ...
}

此控制器操作没有标准loadLayoutrenderLayout方法调用。相反,这个方法中有很多额外的代码用于添加布局句柄并在生成块和渲染最终布局之间做一些事情。我们感兴趣的部分是这个

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

当您在“自定义设计”选项卡中使用“页面布局”保存类别时,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;
}

相关部分是这条线,

$pageLayout = $this->_getConfig()->getPageLayout($pageLayout);

这将从您的配置中加载信息

<label>Kategorie-Übersicht</label>
<template>page/1column.phtml</template>
<layout_handle>company_category_overview</layout_handle>

作为一个Varien_Object. 然后,它将使用此信息将模板应用于根块

$this->getLayout()
->getBlock('root')
>setTemplate($pageLayout->getTemplate());

因此,对于类别页面,<layout_handle/>从不使用节点中的信息。这就是你的布局更新没有被应用的原因——Magento 实际上应用了你的句柄。

于 2013-11-28T03:27:22.617 回答