How can I add Layered Navigation in Advance Search result page(2 Column Left layout)?
How can I dot it?
advanced-searchfilterlayered-navigationmagento2
How can I add Layered Navigation in Advance Search result page(2 Column Left layout)?
How can I dot it?
Create new file in local or override Layer model in local module app/code/local/Mage/CatalogSearch/Model/Layer.php file and Change prepareProductCollection function
public function prepareProductCollection($collection)
{
if(Mage::helper('catalogsearch')->getQuery()->getQueryText())
{
$collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addSearchFilter(Mage::helper('catalogsearch')->getQuery()->getQueryText())
->setStore(Mage::app()->getStore())
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addStoreFilter()
->addUrlRewrite();
}
else
{
$collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes());
$attributes = Mage::getSingleton('catalog/product')->getAttributes();
foreach($attributes as $attribute)
{
$attribute_code = $attribute->getAttributeCode();
if($attribute_code == "price")
continue;
if (empty($_REQUEST[$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::getSingleton('catalogsearch/advanced')->prepareProductCollection($collection);
}
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInSearchFilterToCollection($collection);
return $this;
}
After that do same with app/code/local/Mage/CatalogSearch/Model/Advanced.php and change getProductCollection and getSearchCriterias functions
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 = $this->_searchCriterias;
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;
}
Here in below layer navigation is prepared for advance search product collection now must display that layer navigation using theme xml file so edit your theme's catalogsearch.xml file and add below code in tag.
<reference name="left">
<block type="catalogsearch/layer" name="catalogsearch.leftnav" after="currency" template="catalog/layer/view.phtml"/>
</reference>
For More information visit this link
When ever your try to filter product based on price using advanced search form this sent header value like
Price value goes to array form like from
and to
.
But, if you try to filter layered navigation its goes to string not a array like from
and to
-10000
means price 0-10000
10000-
means price 10000- above
.
I tried Below Solution its works fine.
Override this Model Class: vendor/magento/module-catalog-search/Model/Advanced.php
.
Create di.xml file with in directory app/code/Vendor/Module/etc/di.xml
.
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\CatalogSearch\Model\Advanced" type="Clorida\AddFilter\Model\Rewrite\Advanced" />
</config>
Then Create Advanced.php in with in app/code/Vendor/Module/Model/Rewrite/Advanced.php
Advanced.php
<?php
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Vendor\Module\Model\Rewrite;
use Magento\Catalog\Model\Config;
use Magento\Catalog\Model\Product\Visibility;
use Magento\Catalog\Model\ProductFactory;
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
use Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory as AttributeCollectionFactory;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
use Magento\CatalogSearch\Model\ResourceModel\Advanced\Collection as ProductCollection;
use Magento\CatalogSearch\Model\ResourceModel\AdvancedFactory;
use Magento\Directory\Model\CurrencyFactory;
use Magento\Eav\Model\Entity\Attribute as EntityAttribute;
use Magento\Framework\Model\Context;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Store\Model\StoreManagerInterface;
/**
* Catalog advanced search model
* @method \Magento\CatalogSearch\Model\ResourceModel\Advanced getResource()
* @method int getEntityTypeId()
* @method \Magento\CatalogSearch\Model\Advanced setEntityTypeId(int $value)
* @method int getAttributeSetId()
* @method \Magento\CatalogSearch\Model\Advanced setAttributeSetId(int $value)
* @method string getTypeId()
* @method \Magento\CatalogSearch\Model\Advanced setTypeId(string $value)
* @method string getSku()
* @method \Magento\CatalogSearch\Model\Advanced setSku(string $value)
* @method int getHasOptions()
* @method \Magento\CatalogSearch\Model\Advanced setHasOptions(int $value)
* @method int getRequiredOptions()
* @method \Magento\CatalogSearch\Model\Advanced setRequiredOptions(int $value)
* @method string getCreatedAt()
* @method \Magento\CatalogSearch\Model\Advanced setCreatedAt(string $value)
* @method string getUpdatedAt()
* @method \Magento\CatalogSearch\Model\Advanced setUpdatedAt(string $value)
*
* @author Magento Core Team <core@magentocommerce.com>
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class Advanced extends \Magento\CatalogSearch\Model\Advanced
{
/**
* User friendly search criteria list
*
* @var array
*/
protected $_searchCriterias = [];
/**
* Product collection
*
* @var ProductCollection
*/
protected $_productCollection;
/**
* Initialize dependencies
*
* @var Config
*/
protected $_catalogConfig;
/**
* Catalog product visibility
*
* @var Visibility
*/
protected $_catalogProductVisibility;
/**
* Attribute collection factory
*
* @var AttributeCollectionFactory
*/
protected $_attributeCollectionFactory;
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* Product factory
*
* @var ProductFactory
*/
protected $_productFactory;
/**
* Currency factory
*
* @var CurrencyFactory
*/
protected $_currencyFactory;
/**
* Advanced Collection Factory
*
* @var ProductCollectionFactory
*/
protected $productCollectionFactory;
protected $logger;
/**
* Construct
*
* @param Context $context
* @param Registry $registry
* @param AttributeCollectionFactory $attributeCollectionFactory
* @param Visibility $catalogProductVisibility
* @param Config $catalogConfig
* @param CurrencyFactory $currencyFactory
* @param ProductFactory $productFactory
* @param StoreManagerInterface $storeManager
* @param ProductCollectionFactory $productCollectionFactory
* @param AdvancedFactory $advancedFactory
* @param array $data
*
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
public function __construct(
Context $context,
Registry $registry,
AttributeCollectionFactory $attributeCollectionFactory,
Visibility $catalogProductVisibility,
Config $catalogConfig,
CurrencyFactory $currencyFactory,
ProductFactory $productFactory,
StoreManagerInterface $storeManager,
ProductCollectionFactory $productCollectionFactory,
AdvancedFactory $advancedFactory,
\Psr\Log\LoggerInterface $loggerinterface,
array $data = []
) {
$this->_attributeCollectionFactory = $attributeCollectionFactory;
$this->_catalogProductVisibility = $catalogProductVisibility;
$this->_catalogConfig = $catalogConfig;
$this->_currencyFactory = $currencyFactory;
$this->_productFactory = $productFactory;
$this->_storeManager = $storeManager;
$this->productCollectionFactory = $productCollectionFactory;
$this->logger = $loggerinterface;
parent::__construct(
$context,
$registry,
$attributeCollectionFactory,
$catalogProductVisibility,
$catalogConfig,
$currencyFactory,
$productFactory,
$storeManager,
$productCollectionFactory,
$advancedFactory,
$data
);
}
/**
* Add advanced search filters to product collection
*
* @param array $values
* @return $this
* @throws LocalizedException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function addFilters($values)
{
$attributes = $this->getAttributes();
$allConditions = [];
foreach ($attributes as $attribute) {
/* @var $attribute Attribute */
if (!isset($values[$attribute->getAttributeCode()])) {
continue;
}
$value = $values[$attribute->getAttributeCode()];
$preparedSearchValue = $this->getPreparedSearchCriteria($attribute, $value);
if (false === $preparedSearchValue) {
continue;
}
$this->addSearchCriteria($attribute, $preparedSearchValue);
if ($attribute->getAttributeCode() == 'price') {
$rate = 1;
$store = $this->_storeManager->getStore();
$currency = $store->getCurrentCurrencyCode();
if ($currency != $store->getBaseCurrencyCode()) {
$rate = $store->getBaseCurrency()->getRate($currency);
}
if(is_array($value)){
$value['from'] = (isset($value['from']) && is_numeric($value['from']))
? (float)$value['from'] / $rate
: '';
$value['to'] = (isset($value['to']) && is_numeric($value['to']))
? (float)$value['to'] / $rate
: '';
}else{
}
}
if ($attribute->getBackendType() == 'datetime') {
$value['from'] = (isset($value['from']) && !empty($value['from']))
? date('Y-m-d\TH:i:s\Z', strtotime($value['from']))
: '';
$value['to'] = (isset($value['to']) && !empty($value['to']))
? date('Y-m-d\TH:i:s\Z', strtotime($value['to']))
: '';
}
$condition = $this->_getResource()->prepareCondition(
$attribute,
$value,
$this->getProductCollection()
);
if ($condition === false) {
continue;
}
$table = $attribute->getBackend()->getTable();
if ($attribute->getBackendType() == 'static') {
$attributeId = $attribute->getAttributeCode();
} else {
$attributeId = $attribute->getId();
}
$allConditions[$table][$attributeId] = $condition;
}
if ($allConditions) {
$this->_registry->register('advanced_search_conditions', $allConditions);
$this->getProductCollection()->addFieldsToFilter($allConditions);
} else {
throw new LocalizedException(__('Please specify at least one search term.'));
}
return $this;
}
/**
* Retrieve array of attributes used in advanced search
*
* @return array|\Magento\Catalog\Model\ResourceModel\Product\Attribute\Collection
*/
public function getAttributes()
{
$attributes = $this->getData('attributes');
if ($attributes === null) {
$product = $this->_productFactory->create();
$attributes = $this->_attributeCollectionFactory
->create()
->addHasOptionsFilter()
->addDisplayInAdvancedSearchFilter()
->addStoreLabel($this->_storeManager->getStore()->getId())
->setOrder('main_table.attribute_id', 'asc')
->load();
foreach ($attributes as $attribute) {
$attribute->setEntity($product->getResource());
}
$this->setData('attributes', $attributes);
}
return $attributes;
}
/**
* Retrieve advanced search product collection
*
* @return Collection
*/
public function getProductCollection()
{
if ($this->_productCollection === null) {
$collection = $this->productCollectionFactory->create();
$this->prepareProductCollection($collection);
if (!$collection) {
return $collection;
}
$this->_productCollection = $collection;
}
return $this->_productCollection;
}
/**
* Prepare product collection
*
* @param Collection $collection
* @return $this
*/
public function prepareProductCollection($collection)
{
$collection
->addAttributeToSelect($this->_catalogConfig->getProductAttributes())
->setStore($this->_storeManager->getStore())
->addMinimalPrice()
->addTaxPercents()
->addStoreFilter()
->setVisibility($this->_catalogProductVisibility->getVisibleInSearchIds());
return $this;
}
/**
* @param EntityAttribute $attribute
* @param mixed $value
* @return void
*/
protected function addSearchCriteria($attribute, $value)
{
if (!empty($value)) {
$this->_searchCriterias[] = ['name' => $attribute->getStoreLabel(), 'value' => $value];
}
}
/**
* Add data about search criteria to object state
*
* @todo: Move this code to block
*
* @param EntityAttribute $attribute
* @param mixed $value
* @return string|bool
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
protected function getPreparedSearchCriteria($attribute, $value)
{
if (is_array($value)) {
if (isset($value['from']) && isset($value['to'])) {
if (!empty($value['from']) || !empty($value['to'])) {
if (isset($value['currency'])) {
/** @var $currencyModel Currency */
$currencyModel = $this->_currencyFactory->create()->load($value['currency']);
$from = $currencyModel->format($value['from'], [], false);
$to = $currencyModel->format($value['to'], [], false);
} else {
$currencyModel = null;
}
if (strlen($value['from']) > 0 && strlen($value['to']) > 0) {
// -
$value = sprintf(
'%s - %s',
$currencyModel ? $from : $value['from'],
$currencyModel ? $to : $value['to']
);
} elseif (strlen($value['from']) > 0) {
// and more
$value = __('%1 and greater', $currencyModel ? $from : $value['from']);
} elseif (strlen($value['to']) > 0) {
// to
$value = __('up to %1', $currencyModel ? $to : $value['to']);
}
} else {
return '';
}
}
}
if (($attribute->getFrontendInput() == 'select' ||
$attribute->getFrontendInput() == 'multiselect') && is_array($value)
) {
foreach ($value as $key => $val) {
$value[$key] = $attribute->getSource()->getOptionText($val);
if (is_array($value[$key])) {
$value[$key] = $value[$key]['label'];
}
}
$value = implode(', ', $value);
} elseif ($attribute->getFrontendInput() == 'select' || $attribute->getFrontendInput() == 'multiselect') {
$value = $attribute->getSource()->getOptionText($value);
if (is_array($value)) {
$value = $value['label'];
}
} elseif ($attribute->getFrontendInput() == 'boolean') {
$value = $value == 1
? __('Yes')
: __('No');
}
return $value;
}
/**
* Returns prepared search criterias in text
*
* @return array
*/
public function getSearchCriterias()
{
return $this->_searchCriterias;
}
}
With in the Price Section, I have change like this.
if ($attribute->getAttributeCode() == 'price') {
$rate = 1;
$store = $this->_storeManager->getStore();
$currency = $store->getCurrentCurrencyCode();
if ($currency != $store->getBaseCurrencyCode()) {
$rate = $store->getBaseCurrency()->getRate($currency);
}
if(is_array($value)){
$value['from'] = (isset($value['from']) && is_numeric($value['from']))
? (float)$value['from'] / $rate
: '';
$value['to'] = (isset($value['to']) && is_numeric($value['to']))
? (float)$value['to'] / $rate
: '';
}else{
}
}
Then, Clear cache and Check it let me know if you have issue.
Best Answer
Override catalogsearch_advanced_index.xml in your theme
From
To
Now change layout 1column to 2columns-left
Now add container sidebar.main with left navigation block
Your final catalogsearch_advanced_index.xml like this
Same way you need to override
1) catalogsearch_advanced_result.xml and
2) catalogsearch_result_index.xml