我专门为网站创建了一个自定义导航模块,但我真的希望能够按特定类别列出可过滤属性。所以我的主要导航是:
然后,当用户将鼠标悬停在一个类别上时,他们会看到一个带有一些可过滤选项的扩展菜单,例如:
按制造商查看:
我能够获得商店的所有可过滤属性,但我希望此列表仅提取每个类别的可过滤属性,例如类别1可能有不同的制造商到类别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,
));
}
缓存仅对您传递的密钥有效,因此,如果要更改菜单(例如,不刷新缓存),请确保缓存密钥不同。
希望有所帮助!
谢谢, 乔