я столкнулся с той же проблемой в последнее время.
Я зарегистрировал свое расследование 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]);
@Segey: Он возвращает только код атрибута. Мне нужны все доступные метки со значением –
Для фильтров - используйте $ filter-> getName(), $ filter-> getItems() -> getValue(). Если вы ссылаетесь на последнее решение - используйте идентификаторы для загрузки Magento \ Catalog \ Модель \ ResourceModel \ Продукт \ Атрибут \ Коллекция. Я добавлю строку для ответа –
Хорошо Позвольте мне проверить –