magento属性仅在最后(级别3)类别中过滤

时间:2014-06-16 15:47:55

标签: magento attributes e-commerce layered-navigation

我的类别层次结构最高为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)。

1 个答案:

答案 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-filterattributes-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个文件。

  1. config.xml中
  2. 位置: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

    1. Programmerrkt_Layerednav.xml
    2. 位置:app/etc/modules/Programmerrkt_Layerednav.xml

       <config>
          <modules>
              <Programmerrkt_Layerednav>
                  <active>true</active>
                  <codePool>local</codePool>
              </Programmerrkt_Layerednav>
          </modules>
      </config>
      

      此文件激活我们的模块。

      1. View.php
      2. 位置: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

        所做的所有更改

        由于