Debe crear una nueva extensión que verifique, antes de mostrar la página de búsqueda rápida (o búsqueda avanzada) si la colección de productos contiene exactamente un producto.
Para esto creemos una nueva extensión llamada StackExchange_CatalogSearch
.
Necesitará los siguientes archivos:
app/etc/modules/StackExchange_CatalogSearch.xml
- el archivo de declaración
<?xml version="1.0"?>
<config>
<modules>
<StackExchange_CatalogSearch>
<codePool>local</codePool>
<active>true</active>
<depends>
<Mage_CatalogSearch />
</depends>
</StackExchange_CatalogSearch>
</modules>
</config>
app/code/local/StackExchange/CatalogSearch/etc/config.xml
- el archivo de configuración:
<?xml version="1.0"?>
<config>
<modules>
<StackExchange_CatalogSearch>
<version>1.0.0</version>
</StackExchange_CatalogSearch>
</modules>
<global>
<models>
<stackexchange_catalogsearch>
<class>StackExchange_CatalogSearch_Model</class>
</stackexchange_catalogsearch>
</models>
</global>
<frontend>
<events>
<controller_action_layout_render_before_catalogsearch_result_index><!-- for the quick search-->
<observers>
<stackexchange_catalogsearch>
<model>stackexchange_catalogsearch/observer</model>
<method>redirectToProduct</method>
</stackexchange_catalogsearch>
</observers>
</controller_action_layout_render_before_catalogsearch_result_index>
<controller_action_layout_render_before_catalogsearch_advanced_result><!-- for the advanced search-->
<observers>
<stackexchange_catalogsearch>
<model>stackexchange_catalogsearch/observer</model>
<method>redirectToProduct</method>
</stackexchange_catalogsearch>
</observers>
</controller_action_layout_render_before_catalogsearch_advanced_result>
</events>
</frontend>
</config>
app/code/local/StackExchange/CatalogSearch/Model/Observer.php
- El observador que hace todo el trabajo.
<?php
class StackExchange_CatalogSearch_Model_Observer
{
//the product list block name in layout
const RESULT_BLOCK_NAME = 'search_result_list';
public function redirectToProduct($observer)
{
/** @var Mage_Catalog_Block_Product_List $block */
$block = Mage::app()->getLayout()->getBlock(self::RESULT_BLOCK_NAME);
if ($block) {
$collection = $block->getLoadedProductCollection();
if ($collection && $collection->getSize() == 1) {
/** @var Mage_Catalog_Model_Product $product */
$product = $collection->getFirstItem();
$url = $product->getProductUrl();
if ($url){
Mage::app()->getResponse()->setRedirect($url);
Mage::app()->getResponse()->sendResponse();
exit; //stop everything else
}
}
}
}
}
Borre el caché, desactive la compilación si está habilitado y pruébelo.
Nota: Esta extensión redirige a la página del producto cuando la página de búsqueda (y búsqueda avanzada) debe regresar solo en el producto, incluso si esto sucede después de la búsqueda o después de aplicar un filtro de navegación en capas.