Создайте пользовательский API, чтобы получить фильтруемый атрибут для определенной категории в magento 2

Я создаю API, чтобы получить фильтруемый атрибут для определенной категории в magento 2.

Мы видим на странице категории для многоуровневой навигации. Я хочу добиться точно таких же данных в API.

  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();

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

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

$category_id = 41;

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

$finalFilters = [];
$data = array();
$i = 0;
foreach ($filters as $filter) {
if ($filter->getItemsCount()) {
$name = $filter->getName();
foreach ($filter->getItems() as $item) {

if($item->getFilter()->getAttributeModel()->getAttributeCode() == 'price'){

$finalFilters[$name][$i]['name'] = $this->Helper->removeHTML($item->getLabel()->getArguments());
$finalFilters[$name][$i]['value'] = $item->getValue();
$finalFilters[$name][$i]['code'] = $item->getFilter()->getAttributeModel()->getAttributeCode();
}
else{

$finalFilters[$name][$i]['name'] = $item->getLabel();
$finalFilters[$name][$i]['value'] = $item->getValue();
$finalFilters[$name][$i]['code'] = $item->getFilter()->getAttributeModel()->getAttributeCode();
}
$i++;
}
}
}

Но получаю следующую ошибку.

Исключение № 0 (Magento \ Framework \ Exception \ LocalizedException): модель атрибута не определена.

0

Решение

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

public function filters($categoryId)
{
$categoryLayer = $this->layerResolver->get()->setCurrentCategory($categoryId);
$category      = $this->getCategory();

$filterList       = new FilterList($this->objectManager, $this->fill);
$filterAttributes = $filterList->getFilters($categoryLayer);
$filterArray      = [];

$i = 0;

foreach ($filterAttributes as $filter) {
$attributeLabel = (string) $filter->getName();
$attributeCode  = (string) $filter->getRequestVar();
$items          = $filter->getItems();
$filterValues   = [];

$j = 0;

foreach ($items as $item) {
if ($attributeCode == 'cat') {
$filterValues[$j]['display'] = strip_tags($item->getLabel());
$filterValues[$j]['value']   = $item->getValue();
} elseif ($category->getIsAnchor()) {
if ($filter->getAttributeModel()
&& $filter->getAttributeModel()->getFrontendInput() == 'price') {
$filterValues[$j]['min_price'] = $filter->getLayer()->getProductCollection()->getMinPrice();
$filterValues[$j]['max_price'] = $filter->getLayer()->getProductCollection()->getMaxPrice();
break;
}

$filterValues[$j]['display'] = strip_tags($item->getLabel());
$filterValues[$j]['value']   = $item->getValue();

// Get Swatches.
$swatchesValues = $this->getSwatches($filter, $item, $j);
if (!empty($swatchesValues)) {
$filterValues[$j]['swatch_value'] = $swatchesValues['swatch_value'];
$filterValues[$j]['swatch_type']  = $swatchesValues['swatch_type'];
}
}
$j++;
}

if (!empty($filterValues)) {
$filterArray['available_filter'][$attributeCode]['label']  = $attributeLabel;
$filterArray['available_filter'][$attributeCode]['values'] = $filterValues;
}
$i++;
}

return [$filterArray];
}//end filters()
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]