2016-12-19 4 views
6

Я создал категорию «Bag» в Magento 2. имеющего атрибут фильтра:Как получить Фильтруемые атрибуты из категории в Magento 2

  1. цвета
  2. Размер

Я пытаюсь получить Filterable Attributes из категории «Сумка».

Я не нашел никакого решения.

Я уже сделал это то же самое в Magento 1.9:

Mage::app()->setCurrentStore($store); 
$layer = Mage::getModel("catalog/layer"); 
$category = Mage::getModel("catalog/category")->load($categoryid); 
$layer->setCurrentCategory($category); 
$attributes = $layer->getFilterableAttributes(); 

Но я не получил это в Magento 2.x

Пожалуйста, помогите мне

ответ

9

я столкнулся с той же проблемой в последнее время.

Я зарегистрировал свое расследование here.

Мне не удалось найти фреймворк api для предоставления фильтруемых атрибутов для определенной категории, однако я обмениваюсь обходными решениями.

В основном все фильтруемых атрибуты в Magento 2 может быть retrived от FilterableAttributeList:

$filterableAttributes = ObjectManager::getInstance()->get(\Magento\Catalog\Model\Layer\Category\FilterableAttributeList::class); 
$attributes = $filterableAttributes->getList(); 

Пожалуйста, используйте DI вместо ObjectManager :: GetInstance(). Я использовал его, чтобы иметь более компактный пример :)

Извлечение фильтров, участвующих в многоуровневой навигации, немного сложнее.

$filterableAttributes = ObjectManager::getInstance()->get(\Magento\Catalog\Model\Layer\Category\FilterableAttributeList::class); 

$appState = ObjectManager::getInstance()->get(\Magento\Framework\App\State::class); 
$layerResolver = ObjectManager::getInstance()->get(\Magento\Catalog\Model\Layer\Resolver::class); 
$filterList = ObjectManager::getInstance()->create(
\Magento\Catalog\Model\Layer\FilterList::class, 
    [ 
     'filterableAttributes' => $filterableAttributes 
    ] 
); 

$category = 1234; 

$appState->setAreaCode('frontend'); 
$layer = $layerResolver->get(); 
$layer->setCurrentCategory($category); 
$filters = $filterList->getFilters($layer); 

Однако это не окончательный результат. Чтобы убедиться, что фильтры актуальны, необходимо проверить количество элементов для каждого фильтра. (Что проверка фактически выполняются во время основной слоистой навигации rendering)

$finalFilters = []; 
foreach ($filters as $filter) { 
    if ($filter->getItemsCount()) { 
     $finalFilters[] = $filter; 
    } 
} 

Тогда вы можете получить имена фильтров и значение. то есть:

$name = $filter->getName(); 
foreach ($filter->getItems() as $item) { 
    $value = $item->getValue(); 
} 

Наконец, я хотел бы добавить альтернативное решение, что это немного брутальный, подумали :)

$categoryId = 1234; 

$resource = ObjectManager::getInstance()->get(\Magento\Framework\App\ResourceConnection::class); 
$connection = $resource->getConnection(); 

$select = $connection->select()->from(['ea' => $connection->getTableName('eav_attribute')], 'ea.attribute_id') 
->join(['eea' => $connection->getTableName('eav_entity_attribute')], 'ea.attribute_id = eea.attribute_id') 
->join(['cea' => $connection->getTableName('catalog_eav_attribute')], 'ea.attribute_id = cea.attribute_id') 
->join(['cpe' => $connection->getTableName('catalog_product_entity')], 'eea.attribute_set_id = cpe.attribute_set_id') 
->join(['ccp' => $connection->getTableName('catalog_category_product')], 'cpe.entity_id = ccp.product_id') 
->where('cea.is_filterable = ?', 1) 
->where('ccp.category_id = ?', $categoryId) 
->group('ea.attribute_id'); 

$attributeIds = $connection->fetchCol($select); 

Тогда можно использовать атрибут идентификаторов для загрузки коллекции.

/** @var $collection \Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection */ 
$collection = $this->collectionFactory->create(); 
$collection->setItemObjectClass('Magento\Catalog\Model\ResourceModel\Eav\Attribute') 
     ->addStoreLabel($this->storeManager->getStore()->getId()); 
$collection->addFieldToFilter('attribute_id', ['in' => $attributeIds]); 
+0

@Segey: Он возвращает только код атрибута. Мне нужны все доступные метки со значением –

+0

Для фильтров - используйте $ filter-> getName(), $ filter-> getItems() -> getValue(). Если вы ссылаетесь на последнее решение - используйте идентификаторы для загрузки Magento \ Catalog \ Модель \ ResourceModel \ Продукт \ Атрибут \ Коллекция. Я добавлю строку для ответа –

+0

Хорошо Позвольте мне проверить –

Смежные вопросы