Magento - получить фильтруемые атрибуты по категориям - PullRequest
12 голосов
/ 01 июля 2010

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

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

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

Категория 1

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

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

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

Ответы [ 2 ]

17 голосов
/ 24 июня 2011

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

$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 голосов
/ 01 июля 2010

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

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

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

Спасибо, Джо

...