0

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

1

1 Answer 1

0

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?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.