Après des heures de casse-tête, j’ai trouvé comment modifier l’odre des tri dans le select sur les listes produit, et de définir une direction par défaut selon tel ou tel tri, et sans surcharge !
MAJ 14/10/2014 : Ajout de la gestion du tri et de la direction dans l’URL

La solution tient dans deux observers :

<events>
	<core_block_abstract_to_html_before>
		<observers>
			<minimax_catalog>
				<class>minimax_catalog/observer</class>
				<method>setGoodDirection</method>
			</minimax_catalog>
		</observers>
	</core_block_abstract_to_html_before>
	<catalog_block_product_list_collection>
		<observers>
			<minimax_catalog>
				<class>minimax_catalog/observer</class>
				<method>changeSelectOrders</method>
			</minimax_catalog>
		</observers>
	</catalog_block_product_list_collection>
</events>

Le premier Observer va permettre de choisir la direction selon la clé de l’attribut de tri. Pour ma part je défini mon tableau de correspondance dans ma classe, mais vous pouvez le personnaliser pour qu’il soit paramétrable dans le BO !

	private $__positionOrders = array('position' => 'asc' ,'news_from_date' => 'desc' ,'price' => 'asc');

Et le code de l’Observer (commenté en anglais désolé 🙂 )

public function setGoodDirection(Varien_Event_Observer $observer)
    {
		// We need to set the direction in this observer and not in the other
		// because the Mage_Review Observer load the product collection and after we can't set direction
        $block = $observer->getEvent()->getBlock();

        if ($block instanceof Mage_Catalog_Block_Product_List) {
			$toolbar =  $block->getToolbarBlock();
			if($toolbar){
				// We get Collection in order to launch the prepareSortableFieldsByCategory method
				// This method will retrieve the default sort parameter for the category (if there is one)
				$collection = $block->getLoadedProductCollection(); 
				// If current order is in request, we use it
				$customOrder = Mage::app()->getRequest()->getParam('order');
				if($customOrder){
					$finalOrder = $customOrder;
				} else {
					$finalOrder = $block->getSortBy();
				}
				// We set the current order
				$toolbar->setData('_current_grid_order', $finalOrder);
				foreach($this->__positionOrders AS $order => $direction){
					// If it's current order, we apply our custom direction
					if($toolbar->isOrderCurrent($order)){
						// If current direction is in request, we use it
						$customDirection = Mage::app()->getRequest()->getParam('dir');
						if($customDirection){
							$finalDirection = $customDirection;
						} else {
							$finalDirection = $direction;
						}
						// We set the current direction
						$toolbar->setData('_current_grid_direction', $finalDirection);
						$toolbar->setDefaultDirection($finalDirection);
					}
				}
			}
		}
		return $this;
    }

Le second observer va permettre de changer l’ordre des éléments dans le menu select qui permet de changer le tri :

public function changeSelectOrders(Varien_Event_Observer $observer)
	{
		// We need to change the select options order here because in this observer
		// changes made on the toolbar doesn't take effect
		$toolbar = Mage::app()->getLayout()->getBlock('product_list_toolbar');
		// We change the order of the select options
		$positionsOrders = $this->__positionOrders;
		$orders = $toolbar->getAvailableOrders();
		$sortedOrders = array();
		
		// If catalogsearch, remove position, in my case, check if you want to keep it
		$actionName = Mage::app()->getFrontController()->getAction()->getFullActionName();
		if($actionName == "catalogsearch_result_index"){
			if(isset($positionsOrders['position'])){
				unset($positionsOrders['position']);
			}
		}
		
		// We put the order defined in the array
		foreach($positionsOrders AS $order => $direction){
			if(isset($orders[$order])){
				$sortedOrders[$order] = $orders[$order];
				unset($orders[$order]);
			}
		}
		// If there is other orders, we put its at the end of the array
		foreach($orders AS $key => $label){
			$sortedOrders[$key] = $orders[$key];
		}
		// We set our new sorted array to the toolbar
		$toolbar->setAvailableOrders($sortedOrders);
		return $this;
		
	}

Vous allez peut être devoir faire des ajustement dans votre template si besoin, vous trouverez le template dans :

app\design\frontend\<package>\default\template\catalog\product\list\toolbar.phtml

Si vous le souhaitez, une archive du module est disponible :

bouton_telecharger1

Modifier l’ordre du select des tris de liste produit, et définir une direction par défaut
Taggé sur :                

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous utilisons des cookies afin de nous assurer de vous proposer la meilleure expérience sur ce site.
Ok