0

使用 Magento 1.7.0.2 CE,我想尝试找到一种方法来更改产品视图页面的 XML 布局,具体取决于产品是在站点内搜索还是从类别视图中找到。原因是,我为我们的网站制作的左侧栏上的自定义垂直导航使用 Magento 注册表中的“current_category”键来正确显示。

如果没有设置类别,则显示我们的 7 个主要基本类别。如果设置了类别,则仅显示该基本类别的子类别(约 34 个子类别,使用活动子类别扩展)。所以很自然,当垂直导航栏很小时,我想平衡我的侧边栏空间。

如果通过类别浏览产品,注册表会保留“current_category”键,因此我的垂直导航可以很好地填充左侧栏。如果被搜索,导航栏与右侧栏相比接近高度的 30% 左右。

我理想的解决方案是对 local.xml 进行布局更新,但我不确定 Magento 是否已经内置了任何东西来执行此操作。

所以我的最后一个问题分为两部分:Magento 的 XML 布局中是否有办法确定“catalog_product_view”页面是通过类别还是搜索加载的?

如果不是:根据产品是否被搜索或浏览,将几个块从产品视图页面的右侧栏移到左侧的最有效编码方式是什么?

一种可能的解决方案(最后一点):有人知道如何在新的布局标签中编码吗?我正在考虑创建应用于默认产品视图的“catalog_product_view_browsed”和“catalog_product_view_searched”,而不仅仅是“catalog_product_view”。

编辑:我有它的工作,我的答案已发布在下面。:)

4

2 回答 2

3


为了在您的local.xml文件中使用自定义布局句柄,首先您必须为其创建一个观察者。要创建观察者,首先将其添加为扩展/模块。如果不存在,请创建以下文件/文件夹(名称YournameModulename可以是任何东西,只要确保它显示的位置相同,包括大写/小写):

目录视图

/app/etc/modules/Yourname_Modulename.xml
/app/code/local/Yourname/Modulename/etc/config.xml
/app/code/local/Yourname/Modulename/Model/Observer.php


现在你已经有了文件结构,让我们看看第一个文件,Yourname_Modulename.xml 隐藏在 app/etc/modules/ 文件夹中:

Yourname_Modulename.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Yourname_Modulename>
            <codePool>local</codePool>
            <active>true</active>
        </Yourname_Modulename>
    <modules>
<config>


现在 /app/code/local/Yourname/Modulename/etc/config.xml:

配置文件

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <yournamemodulename>
                <class>Yourname_Modulename_Model</class>
            </yournamemodulename>
        </models>
    </global>
    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <yourname_modulename_model_observer>
                        <type>singleton</type>
                        <class>Yourname_Modulename_Model_Observer</class>
                        <method>controllerActionLayoutLoadBefore</method>
                    </yourname_modulename_model_observer>
                </observers>
            </controller_action_layout_load_before>
        </events>
    </frontend>
</config>


最后是文件 /app/code/local/Yourname/Modulename/Model/Observer.php。对于这个,你需要知道你想给“your_layout_handle”取什么名字,以及如何确定你的布局是否应该通过 PHP 加载。

观察者.php

<?php
    class Yourname_Modulename_Model_Observer
    {
        public function controllerActionLayoutLoadBefore( Varien_Event_Observer $observer)
        {
            //Get Layout Object
            $layout = $observer->getEvent()->getLayout();

            /*
            *Begin Logic to Determine If Layout Handle Should Be Applied.
            *Below Determines If We Are On A Product View Page.
            *Here is Where You Would Modify The Code For Different Layout Handles
            */
            if( Mage::registry( 'current_product' ) ) {

                //Check if current_category is set
                if( Mage::registry( 'current_category' ) ) {

                    //Send Layout Update Handle If Product Was Browsed
                    $layout->getUpdate()->addHandle( 'your_layout_handle' );
                }
                else {

                    //Send Layout Update Handle If Product Was Linked or Searched
                    $layout->getUpdate()->addHandle( 'your_other_handle' );
                }
            }
        }
    }


我想说这就是全部,但当然你现在需要对 app/code/design/frontend/package/theme/layout/local.xml 中的布局句柄做一些事情。它的行为方式取决于您,但这里的示例是适用于我的 local.xml 的部分。我用于句柄的名称是“catalog_product_view_browsed”和“catalog_product_view_searched”。

本地.xml

<!-- Jump To Relevant Section -->

    <catalog_product_view_browsed>
        <reference name="left">
            <action method="unsetChild">
                <name>left.poll</name>
            </action>
        </reference>
        <reference name="right">
            <action method="insert">
                <blockName>left.poll</blockName>
                <siblingName>right.newsletter</siblingName>
                <after>0</after>
            </action>
        </reference>
    </catalog_product_view_browsed>

    <catalog_product_view_searched>
        <reference name="left">
            <action method="insert">
                <blockName>right.newsletter</blockName>
                <siblingName>left.vertnav</siblingName>
                <after>1</after>
            </action>
        </reference>
        <reference name="right">
            <action method="unsetChild">
                <name>right.newsletter</name>
            </action>
        </reference>
    </catalog_product_view_browsed>

<!-- End Relevant Section -->


您可能需要刷新/清理缓存。应该是这样的。

于 2013-08-01T18:19:53.067 回答
0

不幸的是,没有办法在 Magento 的布局 XML 中跟踪引用页面,但您可以通过检查来判断是否有人通过搜索来到产品页面$_SERVER['HTTP_REFERER']

如果用户通过搜索进入产品页面,则引用 URL 将如下所示/catalogsearch/result/?q=[SEARCH TERM]

于 2013-07-31T22:37:43.297 回答