Question

Here am trying to get layered navigation available filters here is my code

 $filterableAttributes = $this->filterableAttributes;
        $layerResolver = $this->layerResolver;
        
        $filterList = $this->objectmanager->create(
        \Magento\Catalog\Model\Layer\FilterList::class,
            [
                'filterableAttributes' => $filterableAttributes
            ]
        );
        $filtersResponse = array();
        $sortOptionsResponse = array();
        $layer = $layerResolver->get();
        $layer->setCurrentCategory($param['categoryId']);
        $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++;
           }

Here am getting only price filter, it should show 4 more attributes, those are enabled for Filter with Results in admin. Still am not able get all filter. Where am doing wrong , can I get Help? thank you in advance.

Was it helpful?

Solution

foreach ($filters as $filter) {
                if(count($filter->getItems())){
                    $filtersResponse[$i]['name'] = $filter->getName();
                    if($filter->getName() == 'Price'){
                        $filtersResponse[$i]['attribute'] =  "special_price";//strtolower($filter->getName());
                        $filtersResponse[$i]['type'] = "range";
                    }else{
                        $filtersResponse[$i]['type'] = ($filter->getName() =="Category")? "single" : "multi";
                    }
                    if($filter->getName() == 'Price'){
                        $filtersResponse[$i]['values']['min_value'] = $minPrice; //$layer->getProductCollection()->getMinPrice();
                        $filtersResponse[$i]['values']['max_value'] = $maxPrice; //$layer->getProductCollection()->getMaxPrice();
                    }else{                    
                        foreach ($filter->getItems() as $j => $item) {
                            $filtersResponse[$i]['attribute'] = $item->getFilter()->getRequestVar();
                            $filtersResponse[$i]['values'][$j]['label'] = str_replace("&","&",$item->getLabel());
                            $filtersResponse[$i]['values'][$j]['value'] = $item->getValue();
                        }
                    }
                    $i++;
                }
            }
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top