Magento - 按类别获取可过滤属性

时间:2010-07-01 12:36:22

标签: attributes magento filter categories

我专门为网站创建了一个自定义导航模块,但我真的希望能够按特定类别列出可过滤属性。所以我的主要导航是:

        
  • 第1类
  •     
  • 第2类
  •     
  • 第3类等。

然后,当用户将鼠标悬停在一个类别上时,他们会看到一个带有一些可过滤选项的扩展菜单,例如:


第1类

按制造商查看:

        
  • 制造商1
  •     
  • 制造商2
  •     
  • 制造商3等。

我能够获得商店的所有可过滤属性,但我希望此列表仅提取每个类别的可过滤属性,例如类别1可能有不同的制造商到类别2.然后我需要缓存这些结果因为这不会经常改变。

2 个答案:

答案 0 :(得分:17)

Joe给出的答案是一个很好的起点,但属性还没有返回任何选项。经过很多挫折后,我用以下代码解决了这个问题。希望它可以帮助你们所有人。

$layer = Mage::getModel("catalog/layer");
foreach($categories as $categoryid) {
    $category = Mage::getModel("catalog/category")->load($categoryid);
    $layer->setCurrentCategory($category);
    $attributes = $layer->getFilterableAttributes();

    foreach ($attributes as $attribute) {
        if ($attribute->getAttributeCode() == 'price') {
            $filterBlockName = 'catalog/layer_filter_price';
        } elseif ($attribute->getBackendType() == 'decimal') {
            $filterBlockName = 'catalog/layer_filter_decimal';
        } else {
            $filterBlockName = 'catalog/layer_filter_attribute';
        }

        $result = $this->getLayout()->createBlock($filterBlockName)->setLayer($layer)->setAttributeModel($attribute)->init();

        foreach($result->getItems() as $option) {
            echo $option->getLabel().'<br/>';
            echo $option->getValue();
        }
}

您唯一需要做的就是使用getValue()函数创建正确的链接。

此代码已在Magento 1.5中测试

答案 1 :(得分:2)

Magento使用模型Catalog_Model_Layer来完成此任务,所以我猜这可能是你最好的选择。警告,我还没有测试过这段代码:

$layer = Mage::getModel("catalog/layer");
foreach($categories as $categoryid) {
    $category = Mage::getModel("catalog/category")->load($categoryid);
    $layer->setCurrentCategory($category);
    $attributes = $layer->getFilterableAttributes();
    // do something with your attributes
}

此处的每次迭代都会为您提供类Mage_Catalog_Model_Resource_Eav_Mysql4_Attribute_Collection的对象,您应该能够在foreach循环中迭代以获得所需的输出。

对于缓存,请尝试在您的站点上启用块缓存,并为块提供如下所示的缓存标记。 Magento将缓存HTML输出,所有这些都将适用于世界:

protected function _construct() {
    $this->addData(array(
        'cache_lifetime' => 3600,
        'cache_tags'     => array(Mage_Catalog_Model_Product::CACHE_TAG),
        'cache_key'      => $someUniqueIdentifierYouCreate,
    ));
}

缓存仅对您传递的密钥有效,因此,如果要更改菜单(例如,不刷新缓存),请确保缓存密钥不同。

希望有所帮助!

谢谢, 乔