Prestarocket

Blog

#Prestashop : Changer l'ordre des groupes d'attributs grâce à l'override

Lorsqu'un produit a des déclinaisons dans votre boutique Prestashop, l'affichage des groupes d'attributs dans la page produit se fait par ordre alphabétique sur le nom public.
L'astuce consiste à changer le nom (pas le nom public) en ajoutant un numéro au début (ex : 01, 02 etc...).

Prestashop : groupe attributs

Grâce à l'override, nous allons changer la façon dont les groupes d'attributs sont classés : nous les classerons par leur nom.

1.Récupérer la fonction qui gère l'affichage des groupes d'attributs

Cette fonction (getAttributesGroups) se trouve dans la classe Produts.php de Prestashop :

 public function getAttributesGroups($id_lang)
	{
		return Db::getInstance()->ExecuteS('
		SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name, a.`id_attribute`, al.`name` AS attribute_name,
		a.`color` AS attribute_color, pa.`id_product_attribute`, pa.`quantity`, pa.`price`, pa.`ecotax`, pa.`weight`, pa.`default_on`, pa.`reference`, pa.`unit_price_impact`, pa.`minimal_quantity`
		FROM `'._DB_PREFIX_.'product_attribute` pa
		LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
		LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON ag.`id_attribute_group` = agl.`id_attribute_group`
		WHERE pa.`id_product` = '.(int)($this->id).'
		AND al.`id_lang` = '.(int)($id_lang).'
		AND agl.`id_lang` = '.(int)($id_lang).'
		ORDER BY agl.`public_name`, al.`name`');
	}

2.Création d'un fichier Product.php pour l'override

Ce fichier doit être dans le dossier override/classes.
Nous allons recopier dans ce fichier la fonction getAttributesGroups et modifier "ORDER BY" pour classer les groupes d'attributs par nom et non plus par nom public :
Fichier Product.php :

<!--?php   class Product extends ProductCore {   	 	public function getAttributesGroups($id_lang) 	{ 		return Db::getInstance()--->ExecuteS('
		SELECT ag.`id_attribute_group`, ag.`is_color_group`, agl.`name` AS group_name, agl.`public_name` AS public_group_name, a.`id_attribute`, al.`name` AS attribute_name,
		a.`color` AS attribute_color, pa.*
		FROM `'._DB_PREFIX_.'product_attribute` pa
		LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON pac.`id_product_attribute` = pa.`id_product_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute` a ON a.`id_attribute` = pac.`id_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute_group` ag ON ag.`id_attribute_group` = a.`id_attribute_group`
		LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON a.`id_attribute` = al.`id_attribute`
		LEFT JOIN `'._DB_PREFIX_.'attribute_group_lang` agl ON ag.`id_attribute_group` = agl.`id_attribute_group`
		WHERE pa.`id_product` = '.(int)($this->id).'
		AND al.`id_lang` = '.(int)($id_lang).'
		AND agl.`id_lang` = '.(int)($id_lang).'
		ORDER BY agl.`name`');
	}

}
?>

Et voilà !!