我的类别层次结构最高为3级.ex,
Root Category
Category 1
Category 1.1
Category 1.1.1
Category 1.1.2
Category 1.1.3
Category 1.2
Category 1.2.1
Category 1.2.2
Category 1.2.3
Category 1.3
Category 2
. . .
. . .
. . .
问题 在分层导航中浏览类别时,产品属性的过滤器显示在所有层中,但我想仅在最后一个类别(例如,第三级别类别)中属性过滤。怎么做
注意:我已经搜索了很多但是在magento meta的一个问题上,一个答案是改变css以隐藏特定页面中的过滤器。但我想在更高级别上做(没有CSS,如果可能的话,然后是php hacks)。
答案 0 :(得分:1)
如果只需要在level-3中显示layered navigation
,则需要在模板中设置一个呈现分层导航块的条件。
分层导航块由模板app/design/frontend/<your_package>/<your_theme>/template/catalog/layer/view.phtml
渲染。您必须修改内容,如下所示
<?php
if(Mage::registry('current_category')->getData('level')== 4):
?>
<?php
/**
* Content in the template comes here :)
*
* Add content in this file, inside this condition
*/
?>
<?php endif; ?>
我们在这里做的是,我们使用Mage::registry('current_category')
方法获取当前类别级别,并检查它是否为level-4
。如果是,则呈现内容。否则它不会。
注意:您在上下文中描述为level-3的内容实际上是level-4
。这是因为,magento将root-category
计为level-1
多数民众赞成。那就行了。享受编码。如果您有任何疑问,请告诉我。
因此,您需要在所有类别级别中显示类别导航,但只需要在级别4中显示其他过滤器属性。如果是这种情况,让我们实施它。
正如我已经说过的,app/design/frontend/<your_package>/<your_theme>/template/catalog/layer/view.phtml
是分层导航块的起点。在该文件中,您可以看到它,它调用下面的方法
<?php $_filters = $this->getFilters() ?>
显示分层导航内容。此方法在Mage_Catalog_Block_Layer_View
类中定义,文件位于app/code/core/Mage/Catalog/Block/Layer/View.php
位置。让我们分析一下这种方法。
public function getFilters()
{
$filters = array();
if ($categoryFilter = $this->_getCategoryFilter()) {
$filters[] = $categoryFilter;
}
$filterableAttributes = $this->_getFilterableAttributes();
foreach ($filterableAttributes as $attribute) {
$filters[] = $this->getChild($attribute->getAttributeCode() . '_filter');
}
return $filters;
}
在这里你可以看到,当我们调用这个方法时,它返回一个数组,即$filters
。您再次可以看到,category-filter
和attributes-filter
分别存储在$filters
中。所以我们很幸运。我们需要做的是,只有当我们站在第4级时才包含attribute-filters
到$filters
数组。您可以通过更改此格式的代码轻松实现此目的。
public function getFilters()
{
$filters = array();
if ($categoryFilter = $this->_getCategoryFilter()) {
$filters[] = $categoryFilter;
}
$current_layer = Mage::registry('current_category')->getData('level');
if($current_layer == 4) {
$filterableAttributes = $this->_getFilterableAttributes();
foreach ($filterableAttributes as $attribute) {
$filters[] = $this->getChild($attribute->getAttributeCode() . '_filter');
}
}
return $filters;
}
多数民众赞成。你完成了但是改变核心文件并不是一个好习惯。因此,为了保持核心文件不变,让我们创建一个覆盖此类的小module
。您只需要模块中的3个文件。
位置:app/code/local/Programmerrkt/Layerednav/etc/config.xml
<config>
<modules>
<Programmerrkt_Layerednav>
<version>0.1.0</version>
</Programmerrkt_Layerednav>
</modules>
<global>
<blocks>
<!-- rewrites Mage_Catalog_Block_Layer_View -->
<catalog>
<rewrite>
<layer_view>Programmerrkt_Layerednav_Block_Layer_View</layer_view>
</rewrite>
</catalog>
</blocks>
</global>
</config>
config.xml
告诉magento我要覆盖核心块Mage_Catalog_Block_Layer_View
。
位置:app/etc/modules/Programmerrkt_Layerednav.xml
<config>
<modules>
<Programmerrkt_Layerednav>
<active>true</active>
<codePool>local</codePool>
</Programmerrkt_Layerednav>
</modules>
</config>
此文件激活我们的模块。
位置:app/code/local/Programmerrkt/Layerednav/Block/Layer/View.php
<?php
class Programmerrkt_Layerednav_Block_Layer_View extends Mage_Catalog_Block_Layer_View {
/**
* Get all layer filters
*
* This method Overwrites getFilter() method of class Mage_Catalog_Block_Layer_View
*
* Adds attribute filter only when category leve is 4
*
* @return array
*/
public function getFilters()
{
$filters = array();
if ($categoryFilter = $this->_getCategoryFilter()) {
$filters[] = $categoryFilter;
}
$current_layer = Mage::registry('current_category')->getData('level');
if($current_layer == 4) {
$filterableAttributes = $this->_getFilterableAttributes();
foreach ($filterableAttributes as $attribute) {
$filters[] = $this->getChild($attribute->getAttributeCode() . '_filter');
}
}
return $filters;
}
}
这将覆盖核心类。
现在清除缓存并重新加载页面。检查它是否有效。请记住,您需要删除对文件view.phtml
由于