使用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”,它们都应用于默认的产品视图。
修改:我有它的工作,我的答案已在下面发布。 :)
答案 0 :(得分:3)
为了在local.xml
文件中使用自定义布局句柄,首先必须为其创建一个观察者。要创建观察者,首先要将其添加为扩展/模块。如果不存在,则创建以下文件/文件夹(名称Yourname
和Modulename
可以是任何内容,只需确保它显示的位置相同,包括大写/小写):
/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 /文件夹中:
<?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
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”。
<!-- 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]
。