【问题标题】:Magento 1.7+: How to use the page layout handleMagento 1.7+:如何使用页面布局句柄
【发布时间】:2013-12-13 12:47:47
【问题描述】:

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

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

对于&lt;layout_handle&gt;company_category_overview&lt;/layout_handle&gt;,我希望定义一个句柄,只有在使用此特定页面模板时,我才能使用它来更改布局。事实并非如此。我在句柄 company_category_overview 内的布局更新被忽略了。

深入挖掘后,我意识到,这似乎不是我的代码,而更像是一个普遍问题。在旧的 Magento 1.4 安装中,页面布局句柄被带到所有站点,例如page_one_column。在 Magento 1.7 和(我现在使用的)1.8 中,这只是在主页上的情况。我正在使用 Commerce Bug 进行调试。我刚刚尝试了新的 1.7 和新的 1.8 安装。

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

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

【问题讨论】:

    标签: magento magento-1.7 magento-1.8


    【解决方案1】:

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

    两者都有?两者都不? &lt;page&gt;&lt;layout&gt;...&lt;/layout&gt;&lt;/page&gt; 节点中的信息由类别页面和 CMS 页面使用,但每个系统使用信息的方式不同,并且没有一个系统以您期望的方式使用它。下面简要介绍了 category 页面如何使用这些信息。

    分类页面由以下控制器动作呈现

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

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

    【讨论】:

    • 感谢您的详细说明。深入研究 1.4 Magento 安装的类别控制器,我确实发现了当前版本的 Magento 中缺少的 applyHandle 函数调用。截至目前,如果在类别和产品页面上忽略 layout_handle,它似乎毫无用处。
    • 我需要这个 - 将页面句柄分类到布局中。我更新了我的 GlobalHandle 扩展来解决这个问题。它现在注入选定的句柄。 github.com/ProxiBlue/GlobalHandle
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多