Magento - How to add Layered Navigation to Advanced Search?

前端 未结 5 1319
孤城傲影
孤城傲影 2021-01-02 16:42

How can I add Layered Navigation to the Advanced Search result pages?

Magento Version 1.7.

5条回答
  •  走了就别回头了
    2021-01-02 16:50

    The patch below will display the layered navigation in Advanced search result and will work fine with layered navigations. The layered navigation and search result are displayed based on two separate product collections, one created by catalogsearch/Model/Layer.php and the other by catalogsearch/Model/Advanced.php. So we need to override few functions of both these models to make layered nav work in Advanced search.

    1- In your local.xml under catalogsearch_advanced_result tag add.

     
          
     
    

    Override prepareProductCollection function of catalogsearch/model/Layer.php with

    public function prepareProductCollection($collection){
    
        if(Mage::helper('catalogsearch')->getQuery()->getQueryText())//for normal search we get the value from query string q=searchtext
            return parent::prepareProductCollection($collection);
        else{
    
            $collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes());
            /**
             * make sure you cross check the $_REQUEST with $attributes
             */
            $attributes = Mage::getSingleton('catalog/product')->getAttributes();
    
            Mage::log(print_r($_REQUEST,1));
            foreach($attributes as $attribute){
                $attribute_code = $attribute->getAttributeCode();
                //Mage::log("--->>". $attribute_code);
                if($attribute_code == "price")//since i am not using price attribute
                    continue;
    
                if (empty($_REQUEST[$attribute_code])){
                    //Mage::log("nothing found--> $attribute_code");
                    continue;
                }
                if(!empty($_REQUEST[$attribute_code]) && is_array($_REQUEST[$attribute_code]))
                    $collection->addAttributeToFilter($attribute_code, array('in' => $_REQUEST[$attribute_code]));
                else
                if(!empty($_REQUEST[$attribute_code]))
                    $collection->addAttributeToFilter($attribute_code, array('like' => "%" . $_REQUEST[$attribute_code] . "%"));
            }
    
            $collection->setStore(Mage::app()->getStore())
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->addStoreFilter()
            ->addUrlRewrite();
    
            //Mage::log($collection->getSelect()->__toString());
    
            Mage::getSingleton('catalogsearch/advanced')->prepareProductCollection($collection);    
            Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
            Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($collection);
        }
    
        return $this;
    }
    

    Override getProductCollection, getSearchCriterias function of catalogsearch/model/Advanced.php with

    public function getProductCollection(){
    
        if (is_null($this->_productCollection)) {
            $this->_productCollection = Mage::getResourceModel('catalogsearch/advanced_collection')
                ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
                ->addMinimalPrice()
                ->addStoreFilter();
                Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($this->_productCollection);
                Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($this->_productCollection);
    
            if(isset($_GET['cat']) && is_numeric($_GET['cat'])) 
                $this->_productCollection->addCategoryFilter(Mage::getModel('catalog/category')->load($_GET['cat']),true);
        }
        return $this->_productCollection;
    }
    
    public function getSearchCriterias()
    {
        $search = parent::getSearchCriterias();
        /* display category filtering criteria */
        if(isset($_GET['cat']) && is_numeric($_GET['cat'])) {
            $category = Mage::getModel('catalog/category')->load($_GET['cat']);
            $search[] = array('name'=>'Category','value'=>$category->getName());
        }
        return $search;
    }
    

提交回复
热议问题