【问题标题】:Magento Product View Page: Add Layout Changes Depending on Product Search or Category BrowsingMagento 产品视图页面:根据产品搜索或类别浏览添加布局更改
【发布时间】:2013-07-31 21:42:47
【问题描述】:

使用 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”。

编辑:我已经成功了,我的答案已经发布在下面。 :)

【问题讨论】:

    标签: php xml magento magento-1.7 block


    【解决方案1】:


    为了在您的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/ 文件夹中:

    你的名字_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
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,这可能会有所帮助...我正在考虑添加一个新的布局更新句柄,我认为这是要走的路。
    • 布局 XML 规定页面布局。它无法访问您需要的信息类型(PHP 超全局变量和 Magento 注册表)来确定哪个页面将用户引至产品页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多