Magento产品视图页面:根据产品搜索或类别浏览添加布局更改

时间:2013-07-31 21:42:48

标签: php xml magento magento-1.7 block

使用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”,而是创建了“catalog_product_view_browsed”和“catalog_product_view_searched”,它们都应用于默认的产品视图。

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

2 个答案:

答案 0 :(得分: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:

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加载。

Observer.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”。

那个local.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 -->


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

答案 1 :(得分:0)

遗憾的是,无法跟踪Magento布局XML中的引用页面,但您可以通过选中$_SERVER['HTTP_REFERER']来判断是否有人通过搜索进入了产品页面。

如果用户从搜索进入产品页面,则引荐网址将如下所示:/catalogsearch/result/?q=[SEARCH TERM]