Подтвердить что ты не робот

Magento - получить атрибуты фильтрации по категориям

Я создал специальный навигационный модуль специально для веб-сайта, но я действительно хочу иметь возможность перечислять атрибуты фильтрации по определенной категории. Так, например, моя основная навигация:

  •   
  • Категория 1  
  • Категория 2  
  • Категория 3 и т.д.

Затем я, когда пользователь переводит категорию в категорию, затем отображается расширенным меню с несколькими фильтруемыми параметрами, например:


Категория 1

Просмотр по производителю:

  •   
  • Производитель 1  
  • Производитель 2  
  • Производитель 3 и т.д.

Я могу получить все фильтруемые атрибуты для хранилища, но я хочу, чтобы этот список извлекал только фильтруемые атрибуты для каждой категории, так как, например, для категории 1 могут быть разные производители для категории 2. Мне тогда нужно кэшировать эти результаты поскольку это не будет часто меняться.

4b9b3361

Ответ 1

Ответ, который дал Джо, был хорошей отправной точкой, но атрибуты еще не вернули никаких параметров. После многих разочарований я решил проблему со следующим кодом. Надеюсь, это поможет вам всем.

$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

Ответ 2

Magento использует модель Catalog_Model_Layer для достижения этой цели, поэтому я предполагаю, что это может быть вашим лучшим выбором. Caveat emptor, я еще не тестировал этот код:

$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,
    ));
}

Кэш будет действителен только для ключа, который вы передаете, поэтому убедитесь, что, если меню будет изменено (без сброса кеша, например), ключ кеша отличается.

Надеюсь, что это поможет!

Спасибо, Джо