Ajouter règle de rewriting Prestashop 1.5.4

WRInaute passionné
Bonjour à tous,

Voilà j'ai créé une nouvelle section de pages (que l'on appellera "cars" par exemple) basée sur la page de recherche de Prestashop 1.5.4

J'ai donc copié/collé puis adapté search.php en cars.php à la racine, CarsController dans le dossier controller, cars.tpl pour le template etc..Tout fonctionne bien, page php/tpl/controller sont bien associés entre eux et la page s'affiche.

J'ai besoin maintenant de réécrire les URLs de ces pages avec une règle générale, comme pour les produits ou les catégories
J'ai donc rajouté dans mon .htaccess :

Code:
RewriteRule ^([0-9]+)-cars-([a-zA-Z0-9-]*)$ /cars.php?id_cars=$1 [QSA,L]

J'avais déjà procédé de la sorte sur un Presta 1.4 et ça fonctionnait impec, puisque les règles de rewriting se trouvaient dans le .htaccess, il fallait juste en rajouter une. Mais sur cette nouvelle version il n'y a plus les autres règles dans le .htaccess, je ne sais pas où elles se trouvent ni comment en ajouter une.

Donc là ça ne fonctionne pas, si je tape l'URL rewritée souhaitée :
24-cars-ford-mustang-shelby par exemple --> j'arrive sur la page index.php?controller=cars?id_cars=24

Je suis sur la bonne page php avec le bon controller et le bon template, il ne me manque plus qu'à rewrité les URLs.
Où est-ce que l'on doit rajouter cette règle ?
 
WRInaute accro
Les dernières versions Prestashop ont maintenant le même principe de réécriture que WordPress
RewriteCond (.htaccess) + link_rewrite (BDD)

Tu dois pouvoir ajouter une url réécrite en native, à mettre en fin de fichier (pas encore testé les urls natives mais ca ne devrait pas tarder) :

# ~~end~~ garde ce commentaire, sinon Presta va le recompiler lors d'une maj du .htaccess
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^www.ndd.com$
RewriteRule ^([0-9]+)-cars-([a-zA-Z0-9-]*)$ cars.php?id_cars=$1 [L]
</IfModule>
 
WRInaute passionné
Merci Koogar, je suis impressionné que tu es l'esprit aussi clair à une heure aussi tardive :lol:

Mais ce que tu me dis je l'ai déjà fait (Cf mon 1er post) :
si je tape l'URL rewritée souhaitée :
24-cars-ford-mustang-shelby par exemple --> j'arrive sur la page index.php?controller=cars?id_cars=24
Donc l'URL rewritée est bien "traduite" en URL physique vers le bon fichier mais après il se passe un truc avec les controlleurs ou autres qui font que j'arrive sur index.php?controller=cars?id_cars=24 au lieu de rester sur l'URL rewritée

Il faudrait savoir comment on intègre une nouvelle règle à la manière des produits ou catégories ?
 
WRInaute accro
je pense qu'il faut ajouter une nouvelle route
voir fichier /classes/Dispatcher.php

'cars_rules' => array(
'controller' => 'cars',
'rule' => '{id}-cars-{rewrite}',
'keywords' => array(
'id' => array('regexp' => '[0-9]+', 'param' => 'id_cars'),
'rewrite' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
),
),

ensuite elle devrait se loader
 
WRInaute passionné
J'ai ajouté la règle dans le Dispatcher, je savais bien que sur cette version c'était le Dispatcher qui gérait tout ça !

Lorsque j'arrive sur la page, j'ai l'erreur suivante
Code:
Dispatcher::createUrl() miss required parameter "id" for route "cars"

Donc la règle est bien prise en compte et reliée aux bonnes pages, on progresse !

Seulement il ne connait pas les variables {id} et {rewrite} vu qu'elles ne sont pas enregistré en BDD je pense.
Comment je peux faire pour lui donner ses variables ? Je dois le faire dans le fichier controller ou ... ?

Merci en tout cas pour ton aide
 
WRInaute passionné
Bon je progresse, j'arrive désormais sur la bonne page avec la bonne URL. Voici ce que j'ai fait :

1. Suppression de la règle rajoutée dans le .htaccess (car ça se traite en fait dans classes/Dispatcher.php)
2. Ajout d'une règle de rewrite dans classes/Dispatcher.php
Code:
		'cars_rule' => array(
			'controller' =>	'cars',
			'rule' =>		'{id}-cars-{rewrite}',
			'keywords' => array(
				'id' =>				array('regexp' => '[0-9]+', 'param' => 'id_cars'),
				'rewrite' =>		array('regexp' => '[_a-zA-Z0-9-\pL]*'),
				'meta_keywords' =>	array('regexp' => '[_a-zA-Z0-9-\pL]*'),
				'meta_title' =>		array('regexp' => '[_a-zA-Z0-9-\pL]*'),
			),
		),
Ensuite sur mon site j'ai un lien rewrité à la main du style /24-cars-ford-mustang-shelby. Lorsque l'on clique, on arrive sur l'URL physique /index.php?controller=cars&id_cars=24

On reste sur l'URL rewritée /24-cars-ford-mustang-shelby SI et seulement SI :
l'option Admin > SEO & URLs > Rediriger automatiquement vers l'URL canonique = Non

J'ai mis du temps avant de comprendre pourquoi j'arrivais sur l'URL /index.php?controller=cars&id_cars=24 au lieu de /24-cars-ford-mustang-shelby. C'est en fait cette option dans l'admin qui redirige vers l'URL rewritée car ma règle de rewriting n'est pas ancrée nativement à Presta comme le sont les règles pour les produits ou les catégories par exemple

Si je met l'option sur "Non", je reste bien sur la même page mais l'URL reste bien rewritée.
Comment faire alors pour que cette fonction de redirection tienne compte de cette page ?
 
WRInaute accro
Regarde la fonction canonicalRedirection dans le fichier FrontController.php, la solution doit pas etre loin
 
WRInaute passionné
Ca avance, ça avance... J'ai réactivé le redirection canonique dans le BO et j'ai cherché à savoir comment ça marchais..

Dans mon fichier CarsController.php, j'ai rajouté :
Code:
$this->canonicalRedirection($url);
Avec $url est l'URL canonique complète souhaitée.

Avec ce code, et en cliquant sur une URL rewritée comme il faut, j'arrive sur l'URL :
http://www.example.com/24-cars-ford-mustang-shelby?id_cars=24

Et le beau message "La page n'est pas redirigée correctement. Firefox a détecté que le serveur redirige la demande pour cette adresse d'une manière qui n'aboutira pas."

Donc j'ai été faire un tour dans classes/controller/FrontController.php où il y a la fonction canonicalRedirection($url)

Le fonctionnement est le même pour toutes les pages, alors j'ai rajouté id_cars à cette ligne :
Code:
$excluded_key = array('isolang', 'id_lang', 'controller', 'fc', 'id_product', 'id_category', 'id_manufacturer', 'id_supplier', 'id_cms', 'id_cars');
Je ne sais pas trop à quoi sers cette ligne, mais si je n'y met pas "id_cars", j'arrive sur http://www.example.com/24-cars-ford-mustang-shelby?id_cars=24 et si j'y ajoute "id_cars" j'arrive sur http://www.example.com/index.php?controller=cars

Donc soit j'ai l'id mais je l'ai aussi en paramètre d'URL, soit je ne l'ai plus du tout et du coup je suis redirigé sur la page http://www.example.com/index.php?controller=cars

J'ai donc essayé de l'enlevé de mon "param" de ma règle dans le Dispatcher.php :
Code:
id' => array('regexp' => '[0-9]+', 'param' => 'id_cars'),
Mais idem si je l'enlève d'ici j'arrive sur http://www.example.com/index.php?controller=cars
 
WRInaute passionné
Bon alors du coup dans mon fichier CarsController.php je redirige bien vers l'URL seo
Mais "quelque chose" redirige quand à lui vers http://www.example.fr/index.php?controller=cars&id_cars=24

Ce qui fait que ça tourne en boucle... Il faut que je trouve ce "quelque chose".
Apparemment ça n'est pas dans le Dispatcher.php mais alors où... ?

En plus j'ai testé l'entête HTTP de http://www.example.com/24-cars-ford-mustang-shelby avec l'outil de WRI et ça me répond bien "OK code 200"

Le rewriting/canonical est traité encore dans un autre fichier que Dispatcher.php et FrontController.php ?
Dire qu'avant il suffisait d'une ligne dans le .htacess -_-'
 
WRInaute passionné
TATA YOYO !

J'ai réussi à trouver ce "quelque chose" qui redirigeais vers l'URL non rewritée qui elle redirigeait vers l'URL rewritée qui elle redirigeait vers l'URL non rewritée qui elle...

Pour résumer :
_ le Dispatcher.php remplace le .htaccess => ajout de la nouvelle règle qui relie l'URL rewritée avec le bon controller
_ le FrontController.php gère la redirection vers l'URL canonique (activable dans l'Admin > SEO & URLs)

Dans mon nouveau controller CarsController.php, j'avais ajouté (très résumé) $this->canonicalRedirection($url_seo);

Après une série de test et de comparaisons en PHP, j'utilisais cette fonction si URL SEO != URL courante

Sauf qu'en fait, j'ai remarqué que les controlleurs catégories, produits, fabricants (et les autres dont l'URL est complètement rewritée sous Presta) redéclaraient cette fonction canonicalRedirection() au début du fichier, afin d'en faire une spécifique et pour ne pas utiliser celle du fichier FrontController.php

J'ai donc ajouter la déclaration de cette fonction à mon controlleur et hop, adieu la boucle infinie :)

Merci Koogar qui est la seule personne à m'avoir répondu sur WRI et le forum Prestashop y compris :lol:

@++
 
Nouveau WRInaute
Puisque vous semblez familier de ce genre de chose, j'aimerai un coup de main ....
sous prestashop 1.5.3 :
J'ai réussit il y a quelques mois à faire un site multiboutique multilingue de 200 000 produits en huit langue, donc huit domaines :
le prinicipale : http://www.accessoir...t-midiauto.com/

et sept autres :
http://www.acessorios-peugeot.com/
http://www.accesorio...t-midiauto.com/
http://www.peugeot-accessories.com/
http://www.peugeot-m...sories.jpn.com/
http://www.peugeot-m...ssories.cn.com/
http://www.peugeot-m...ccessories.com/
http://www.zubehor-p...t-midiauto.com/

Sur deux de ces domaines
http://www.peugeot-accessories.com/
http://www.acessorios-peugeot.com/
les commandes sont impossibles : page not found.
la navigation fonctionne bien mais pas le passage de commande ...
Lorsque j'ai constaté le problème, j'ai remarqué que c'était les deux seul domaine à avoir l'url principale sans le www, j'ai donc modifié cela et vidé tous les caches mais toujours le mème résultat.

Sur la version française qui fonctionne correctement le lien 'identifiez vous pointe vers :
http://www.accessoir....com/mon-compte
qui redirige vers
http://www.accessoir...back=my-account


Sur la version anglaise qui ne fonctionne pas, le lien 'login' pointe vers
http://www.peugeot-a....com/my-account
mais n'est pas redirigé, c'est donc une erreur 404 qui s'affiche.

Quelqu'un sait-il ou ça se passe cette redirection ?????
 
Discussions similaires
Haut