Tutoriel override prestashop partie 3 : surcharge de la classe Link pour modifier l’URL rewriting

Prestashop 1.4Nous souhaitons à présent accéder à notre page Manufacturer listant tous les produits de la marque.

Si vous avez suivi ce tutoriel jusqu’ici, vous saurez que cette page a forcément une nouvelle URL puisque l’URL de base redirige vers une page de type CMS.

Nous allons décider que pour y accèder, nous passerons un paramètre à notre URL afin d’indiquer au controller qu’il faut bien afficher le listing de produits. Nous lui passerons le paramètre « param » avec la valeur « products« .

Si vous reprenez le code du ManufacturerController, à la ligne 19, vous verrez que nous testons si nous recevons bien ce paramètre, et si oui, nous effectuons le traitement classique :

if(in_array(Tools::getValue("param"), array("products")))
			{
				$nbProducts = $this->manufacturer->getProducts($this->manufacturer->id, NULL, NULL, NULL, $this->orderBy, $this->orderWay, true);
				$this->pagination($nbProducts);
				self::$smarty->assign(array(
					'nb_products' => $nbProducts,
					'products' => $this->manufacturer->getProducts($this->manufacturer->id, (int)self::$cookie->id_lang, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay),
					'manufacturer' => $this->manufacturer,
					'path' => ($this->manufacturer->active ? Tools::safeOutput($this->manufacturer->name) : ''),
				));
			}

Très bien, sauf que nous devons maintenant avoir une méthode qui va générer cette nouvelle URL et l’afficher sur le lien « Voir tous les produits » présent dans la page.

Pour cela, faisons tout d’abord en sorte que le fichier « .htaccess » prenne en compte notre règle. Rajoutez ou remplacez ceci dans votre fichier « .htaccess » :

RewriteRule ^(products/)?([0-9]+)_([a-zA-Z0-9-]*)(.*)$ manufacturer.php?id_manufacturer=$2&param=$1$4 [QSA,L,E]

Attention, cela n’est utile que si vous utilisez la fonctionnalité d’URL rewriting ou URL simplifiées de Prestashop.

Puis, nous devons maintenant redéfinir la méthode de génération d’URL pours les manufacturers.

Dans prestashop, tout se passe dans la classe Link qui gère les URLs de tous les composants. Nous allons l’overrider. Rendez vous donc dans « override/classes » pour y créer le fichier « Link.php » suivant :

<?php
class Link extends LinkCore
{
	public function getManufacturerProductsLink($id_manufacturer, $alias = NULL, $id_lang = NULL)
	{
		return $this->getManufacturerWithParamLink($id_manufacturer, 'products', $alias, $id_lang);
	}	
 
	public function getManufacturerWithParamLink($id_manufacturer, $param = 'products', $alias = NULL, $id_lang = NULL)
	{
		if (is_object($id_manufacturer))
			return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$param.'/'.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer->id).'_'.$id_manufacturer->link_rewrite) :
			(_PS_BASE_URL_.__PS_BASE_URI__.'manufacturer.php?id_manufacturer='.(int)($id_manufacturer->id).'&param='.$param);
		if ($alias)
			return ($this->allow == 1) ? (_PS_BASE_URL_.__PS_BASE_URI__.$param.'/'.$this->getLangLink((int)($id_lang)).(int)($id_manufacturer).'_'.$alias) :
			(_PS_BASE_URL_.__PS_BASE_URI__.'manufacturer.php?id_manufacturer='.(int)($id_manufacturer).'&param='.$param);
		return _PS_BASE_URL_.__PS_BASE_URI__.'manufacturer.php?id_manufacturer='.(int)($id_manufacturer).'&param='.$param;
	}
}

La méthode « getManufacturerLink() » de la classe de base est donc remplacée par « getManufacturerWithParamLink() » qui prend en argument un « $param » qui aura la valeur par défaut « products« . Ainsi nous pourrons si nous le voulons plus tard, lui passer d’autres paramètres (comme « photos » pour afficher un diaporama photos de la marque par exemple).

Nous avons également écrit une méthode « getManufacturerProductsLink() » qui nous servira à écrire plus simplement la fonction lors de l’appel dans notre template Smarty.

Et c’est enfin terminé, nous avons maintenant accès à notre page Manufacturer par une URL du type : »manufacturer.php?id_manufacturer=2&param=products » pour les URL non réécrites et : « products/2_ma-marque » pour les URL réécrites.

CONCLUSION

Cet article clôt une série de 3 articles traitant de la surcharge de classes et de controllers dans Prestashop 1.4. Pour mettre en oeuvre une fonctionnalité concrête de liaison de pages CMS aux pages Marques, nous avons eu à surcharger différentes classes et controllers et également changer les règles d’URL rewriting.

Nous retiendrons surtout que depuis que l’override classe est possible dans notre logiciel e-commerce préféré, les possibilités de customisation de vos pages sont quasiment illimités ! A vous d’inventer et de coder des fonctionnalités qui ne seraient pas encore disponibles !

Vous pouvez répondre, ou faire un trackback depuis votre propre site web.

2 Réponses sur “Tutoriel override prestashop partie 3 : surcharge de la classe Link pour modifier l’URL rewriting”

  1. Pierre Roche dit :

    Bonsoir Monsieur Courtade,

    J’ai un problème épineux avec prestashop. Je souhaite pour optimiser le référencement créer des urls terminant par slash
    ex :
    http://www.coeurdedeco.fr/
    http://www.coeurdedeco.fr/54-miroirs/

    Je n’ai rien trouvé dans le forum Prestashop et après avoir regardé les préconisations htaccess, celles proposées ne fonctionnent pas.Je me demande s’il n’est pas nécessaire de modifier des fichiers du noyau Prestashop (ex:link.php).
    Pouvez-vous me conseiller?

    D’avance merci
    Cordialement
    Pierre Roche

    • Michel dit :

      Bonjour,

      avant de pouvoir répondre à cette question, je me demande tout d’abord pourquoi vouloir rajouter un slash à la fin de vos URLs ?
      L’URL rewriting n’est pas un facteur de ranking sur les algos des moteurs de recherche (Google en particulier). Bien sûr, la réécriture d’URL sert à une meilleure indexation de vos pages dans les SERPS et permet une meilleure lisibilité des résultats pour les internautes (il cliquera plus facilement sur votre URL si elle est réécrite), mais en aucun cas le fait d’avoir de l’URL rewriting servira à avoir un avantage par rapport à un autre site qui n’en aurait pas.
      Si votre Prestashop utilise déjà les URLS réécrites, je ne pense pas qu’il soit nécessaire de vouloir modifier leur format, à moins que vous ayez d’autres motivations que je ne connais pas ?

      Merci
      Michel

Donner votre avis