I'm creating rest api for mobile app in Magento 2,now i'm wondering to get layered navigation (filters) for a category and loaded collection like search or custom collection using rest api.
Please help
I'm creating rest api for mobile app in Magento 2,now i'm wondering to get layered navigation (filters) for a category and loaded collection like search or custom collection using rest api.
Please help
Have 2 mothod
Filter.php (api model)
public function __construct(\Magento\Framework\Webapi\Rest\Request
$request){
$this->_request = $request;
}
/**
* Retrieve filterlist
*
* @api
* @return array
*/
public function retrieve(){
$category = $this->_request->getParam('categoryId');
$objectManager = \Magento\Framework\App\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
]
);
$layer = $layerResolver->get();
$layer->setCurrentCategory($category);
$filters = $filterList->getFilters($layer);
$maxPrice = $layer->getProductCollection()->getMaxPrice();
$minPrice = $layer->getProductCollection()->getMinPrice();
$i = 0;
foreach($filters as $filter)
{
//$availablefilter = $filter->getRequestVar(); //Gives the request param name such as 'cat' for Category, 'price' for Price
$availablefilter = (string)$filter->getName(); //Gives Display Name of the filter such as Category,Price etc.
$items = $filter->getItems(); //Gives all available filter options in that particular filter
$filterValues = array();
$j = 0;
foreach($items as $item)
{
$filterValues[$j]['display'] = strip_tags($item->getLabel());
$filterValues[$j]['value'] = $item->getValue();
$filterValues[$j]['count'] = $item->getCount(); //Gives no. of products in each filter options
$j++;
}
if(!empty($filterValues) && count($filterValues)>1)
{
$filterArray['availablefilter'][$availablefilter] = $filterValues;
}
$i++;
}
echo json_encode($filterArray);
exit;
}
Sample out put of this code will be:
{
"availablefilter": {
"Climate": [
{
"display": "All-Weather",
"value": "202",
"count": "1"
},
{
"display": "Cool",
"value": "204",
"count": "1"
}
],
"Manufacturer": [
{
"display": "Azzedine Alaïa",
"value": "216",
"count": "1"
},
{
"display": "Balenciaga",
"value": "217",
"count": "1"
}
],
"Material": [
{
"display": "Cotton",
"value": "33",
"count": "1"
},
{
"display": "Nylon",
"value": "37",
"count": "1"
}
],
Second method
public function __construct(
\Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory $productAttributeCollectionFactory
) {
$this->productAttributeCollectionFactory = $productAttributeCollectionFactory;
}
public function getFilterableAttributes()
{
/** @var \Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection $productAttributes */
$productAttributes = $this->productAttributeCollectionFactory->create();
$productAttributes->addFieldToFilter(
['is_filterable', 'is_filterable_in_search'],
[[1, 2], 1]
);
return $productAttributes;
}
Please refer this url : Magento 2 api - How to get layer navigation filters available in rest api?