Jump to content
Dokimedia

Récuperer ID de la page précédente

Recommended Posts

Bonjour à tous,

Je suis sur la création d'un thème en prestashop 1.7 pour des clients (ici rien de bien spécial), mais j'aurais besoin de récupérer une infos qui (à priori) n'est pas récupérer par défaut.

 

J'aurais voulu savoir comment il était possible de récupérer l'ID de la catégorie depuis laquelle j'ai cliquer lorsque je suis sur mon produits.

 

Par exemple : 

Catégorie Chemise (id 3) | Catégorie Haut de Femme (id 2)

Mon vêtement serais disponible dans les deux catégories, et aurais en catégorie principal (par défaut) haut de femme par exemple.

Si je suis sur le listing de Chemise et que je clique sur mon produit, évidemment lorsque je suis sur mon produit je ne peux pas savoir d'où je viens (vu que le liens de Prestashop seras celui créer avec la catégorie par défaut). Je souhaiterais avoir cette ID (ici 3) lorsque je clique sur le produit. Je m'explique je dois afficher des images et des liens en fonctions de là ou je viens de cliquer (donc des liens pour des chemises si j'ai cliqué depuis chemise et des liens vers des haut de femme si j'ai cliqué depuis haut de femme).

 

Il faudrait que j'aille modifier vers quel fichier (un controller je suppose), mais surtout est-il possible de modifier ce genre de fichier de manière "définitive" ou bien c'est écraser obligatoirement à chaque mise à jours de Prestashop.

 

Merci d'avance pour vos suggestions, si vous avez besoin de plus d'information pour m'aider n’hésitez pas.

 

Edited by Dokimedia (see edit history)

Share this post


Link to post
Share on other sites

Je crois que vous n'allez pas aimer ma réponse ;).

J'ai été confronté à un problème du même genre sur un projet PS récent, mais pas avec les catégories. Dans votre cas, si id_category n'est pas présent dans l'URL du produit, la seule solution c'est de l'y ajouter. Et la seule façon de l'y ajouter... ben... faut coder du PHP. Vous pouvez modifier directement le code, mais vous ne pourrez alors plus faire de mise à jour de PS. L'autre solution est de créer un module spécifique... à moins qu'il en existe un tout fait (ce dont je doute).

Share this post


Link to post
Share on other sites

Ah oui je n'aime pas ! :)

Il n'y à pas l'équivalent d'un $_POST chez Prestashop ? (j'ai pour l'habitude de developper des thèmes sous Wordpress je ne suis donc pas spécialement fin connaisseur de smarty).

Si je dois modifier les fichier core de PS sans pouvoir faire de MaJ tant pis (j'ai pas mal lu qu'il n'était pas tout à faire conseiller de faire les MaJ à chaque fois, donc au pire je noterais quelque part ce que j'ai modifier). Mais ce serais quel fichier à modifier pour arriver à faire ce que j'ai besoin ?

Dans la catégorie je peux bien évidemment avoir l'ID actuel (il est présent dans l'URL et une variable existe pour l'avoir), mais bien sûr cette ID n'est pas présent dans l'URL de mon produit (c'est l'ID du produit qui est présent). 

Share this post


Link to post
Share on other sites

$_POST est une variable PHP. A ma connaissance, elle ne contient des données que dans la cas d'un SUBMIT d'un formulaire. Lorsque PS crée l'URL de chaque produit, vous pourriez y ajouter le paramètre id_category à l'URL du produit (&id_category=n), par exemple en "tripatouillant" ;) la méthode link->getProductLink() (dans le fichier classes/link.php)...

OK, c'est faisable mais je dois retourner voir dans mon code comment j'ai fait! J'ai créé un module pour un shop de pièces détachées qui ajoute des paramètres aux URL et les récupère par la suite. Pour le moment, cela fonctionne quand les URL simplifiées sont OFF. Je suis en train de modifier mon code pour qu'il fonctionne avec les URL simplifiées sur ON.

Là je vais devoir partir mais si vous n'avez pas trouvé d'ici mardi, n'hésitez pas à re-contacter en MP, je vous expliquerai exactement comment faire pour les URL simplifiées. A la fin de la semaine, je serai probablement en mesure de vous expliquer comment faire lorsque les URL simplifiées sont sur ON (mais c'est plus compliqué).

Share this post


Link to post
Share on other sites

Bonjour,

Et bien pourquoi pas pour partagez vos informations à ce niveau ça peux aider.

Nous sommes sur la refontes d'un site déjà existante donc nous gérons les URL depuis la fiche produit, je crois que c'est justement des URL simplifiées.

Je peux donc attendre que vous ayez trouvé une solution pour les URL simplifiées.

Je vous remercie en tout cas, je vais en attendant regarder un peu dans classes/link.php.

Share this post


Link to post
Share on other sites

 

Il n'y à pas l'équivalent d'un $_POST chez Prestashop ?

Si 

Tools::getValue()

Modifier la class link pourquoi pas mais bon dire qu'on ne pourra plus faire de mise à jour alors qu'il existe des overrides je ne comprends pas ?

Sinon pourquoi ne pas utiliser le referer avec un module sur les hook souhaités ?
 

Share this post


Link to post
Share on other sites

Tools::getValue() je l'ai compris (presque) mais mon soucis c'est justement d'envoyer une infos sur la page produit depuis ma page catégorie.

En gros faire passer le "Tools::getValue('id_category')" de mon listing à mon produit. Afin d'avoir tout simplement cette infos depuis mon produit, pour le moment je ne récupère que l'ID par defaut (avec $product->id_category_default).

Pour l'overrides j'y est pensé justement donc c'est ce que j'ai utiliser pour modifier le link.php


D'ailleurs ce link ne me prend pas mes informations j'ai l'impression (j'essaye d'ajouter un paramètre mais il n'est pas pris en compte). 

Pour votre dernière phrase, et bien pourquoi pas, mais je ne connais pas. Comme je l'ai dis plus haut je suis un développeur classique Wordpress et PHP, c'est mon premier projet en Prestashop et j'avoue que c'est un peu compliqué de trouver des sources concluante avec Prestashop 1.7. Donc toutes infos est la bienvenue afin de réussir ce que je cherche à faire (je ne suis bien évidemment pas contre la doc mais j'avoue que là je ne sais pas trop où chercher).

 

Edit : en regardant bien plus le Link.php je me rend compte que dans la partie getProductLink() il y a une variable qui s'appelle "extraParams" (ligne 130 et 222) mais je n'arrive pas à trouvez une docs complète sur ce nouveau {url} pour l'ajouter (j'ai essayé : {url entity=product id=$product.id extraParams=['paramKey1' => 12, 'paramKey2' => 247]} en vain.

Edited by Dokimedia
Recherche (see edit history)

Share this post


Link to post
Share on other sites

Je crois qu'on ne parle pas de la même chose, mais je peux me tromper, à vous de me dire.

  • La question de départ, c'est : quand je suis sur une fiche produit, comment récupérer id_category de la catégorie par laquelle je suis arrivé à cette fiche produit ?
    • Donc, en imaginant que URL simplifiée soit sur off, j'ai cliqué sur un produit dont l'URL était du genre ...controller=product&id_product=4454.
    • Cette URL ne contient pas l'id_category d'où je viens. La seule catégorie dont ProductController soit au courant, c'est la catégorie par défaut du produit, qui n'est pas forcément celle d'où je viens.
    • A mon sens, la seule manière de pouvoir récupérer cet id_category d'où je viens, c'est de l'ajouter à l'URL du produit. Mais si quelqu'un a une autre solution, cela m'intéresse au plus haut point.
    • Donc, cela revient à transformer à notre URL en ...controller=product&id_product=4454&id_category=39.
    • La solution que je propose, c'est d'ajouter le paramètre "&id_category=39" au moment où cette URL est préparée. En attaché, j'ai mis un diagramme de séquence UML qui décrit comment CategoryController construit la liste des produits à afficher. Tout en bas à gauche, on voit que la classe Product appelle getProductLink().
    • Grâce à ce schéma, on voit aussi que l'on peut intervenir à plusieurs niveaux pour ajouter le paramètre id_category=39 à l'URL. Le problème, c'est qu'il faut avoir accès à CategoryController->category->id_category pour en avoir la valeur.
    • Deux façons:
      • A l'intérieur de CategoryController: $this->category->id_category;
      • Depuis n'importe quelle autre classe du schema UML:
        $category = $this->context->controller->getCategory();
        $id_category = $category->id;
        $link = $link.'&id_category='.$id_category;

 

Merci de me dire si je me trompe avant que j'explique la solution que j'ai appliquée ;).

prestashop_product_default_search_sequence_diagram.thumb.jpg.c2606aedc9e45fad33b4d1742758b7fb.jpg

Edited by Pierre_d (see edit history)

Share this post


Link to post
Share on other sites

Tu es sur une page qui a pour adresse : 

https://monsite.com/3_category_chaussure 

Il y a une liste de produit avec par exemple un produit qui a pour adresse :

https//monsite.com/4-chaussure-bleu

Si tu cliques sur ce lien 

La variable : 

{$smarty.server.HTTP_REFERER} sera https://monsite.com/3_category_chaussure  donc tu as bien l'id de la catégorie dedans :) 

Regarde ici : 

http://www.chafoins.com/16114/8-robes

La page d'ou tu viens est affiché en haut à droite en rouge sur la page produit.

Essaye de passer par femme ou robe.

 

  • Like 1

Share this post


Link to post
Share on other sites

Ok, je comprends mieux. $smarty.server.HTTP_REFERER est donc bien la page sur laquelle j'étais quand j'ai cliqué sur le lien qui m'a amené à la nouvelle page. Merci de cette info, je n'avais pas investigué Smarty jusqu'à maintenant.

Mais je vois aussi que HTTP_REFERER est une variable PHP, donc disponible en dehors de Smarty ?

EDIT: je viens d'essayer. Elle est effectivement disponible en PHP, dans ProductController->init() par exemple.
 

$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
var_dump($referer);

 

Edited by Pierre_d (see edit history)

Share this post


Link to post
Share on other sites

En smarty tu utilises :
 

$smarty.server.HTTP_REFERER


En php 
 

$_SERVER['HTTP_REFERER']


C'est la même valeur. 

Share this post


Link to post
Share on other sites
EDIT: je viens d'essayer. Elle est effectivement disponible en PHP, dans ProductController->init() par exemple.


Il ne faut pas utiliser les fichiers du core pour bien faire.

Mais un module qui se greffera aux hooks disponibles sur la page product.

 

 

Share this post


Link to post
Share on other sites

Merci beaucoup pour toutes ces informations c'est vraiment pratique je ne connaissais pas cette variable du tout en smarty.

Par contre elle me retourne une URL on est d'accord, il y a moyen de tester si cette url est une url de category, de page, de l'accueil ou quelquechose du genre ? De plus comment recuperer l'ID si c'est une catégory ? Avec un extrait du liens ?

Je pensais que la manière la plus simple c'était vraiment celle de Pierre_D car on savais directement que l'on vennais d'une category. (Mes articles peuvent etre accessible depuis le listing category, mais aussi depuis un produit [avec les produits conseillée] mais aussi depuis une page que nous avons développé a l'aide d'un module etc). Je pourrais y faire des if pour tester mais il faudrais que je trouve un pattern dans ce liens.

En tout cas merci déjà pour cette informations je vais continuer à chercher depuis ici.

Ps : Pierre_D nous sommes plus ou moins dans la même optique on dirais, car j'utilise aussi ça pour un magasin de pièces détachés et mon soucis c'est qu'une pièce détachée peux être attaché à plusieurs catégories de produits.

Share this post


Link to post
Share on other sites

Dans les url produit il y a .html et pas dans les url catégorie :) 

Ce qui te permet de différencier le tout. 

Share this post


Link to post
Share on other sites

Oh mais bien sûr ! Allez ... j'aurais bien finis par le trouver (j'essaye de me convaincre un peu ...).

Share this post


Link to post
Share on other sites

Voilà, j'ai modifié le code de mon shop pour que mes filtres fonctionnent quel que soit le mode friendly url (on/off). J'avais d'abord pensé à modifier les url pour avoir un truc du genre .../254-john-deere-6320/1001-categorie-boite-de-vitesse mais c'est vraiment compliqué à mettre en œuvre et ça risque de poser des problèmes SEO.

J'ai donc opté pour la solution suivante.

  • URL normales: .../controller=category&id_category=1001&id_tractor=254.
  • URL simplifiées: .../1001-categories-boite-de-videsse?filtre_tracteur=254-john-deere-6320.

L'avantage, c'est que si le client revient en ayant bookmarké l'url, ben ça fonctionne.

PS: je n'ai pas modifié ProductController core, c'était bien mon override ;).

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More