gaius57 Posted February 7, 2014 Share Posted February 7, 2014 Bonjour à tous les codeux !Voila je commence à me perdre de la strucutre MVC de Prestashop pour mon module de Blog. J'en viens même à me demander s'il s'agit bien d'un "vrai" MVC de type framework PHP.D'un point de vue fonctionnement c'est simple. Via l'administration et les AdminController, j'arrive à creer mes articles très facilement via les Helpers. Maintenant viens la partie Front Office. J'ai créé le controller default qui liste tous les articles en les bouclans dans un TPL Smarty. Ce que j'essais de faire désormais, c'est de fixer un hyperlien sur le titre de l'article qui amène sur la page dédié a ce seul article avec les commentaires. Mais voila je n'y arrive pas.Mes mécanisme de vrai framework php m'ont directement fais penser à creer une méthode single() dans le controller default. Cette méthode serai alors interprété comme action, exactement comme le fonctionnement d'un Symfony2 ou CakePHP. Mais non, si je fait .../blog/default/single ça ne marche tout simplement pas.Au final j'aimerai pouvoir arriver a générer l'url de chaque article. URL de type /blog/default/single/id_article qui ammainerai sur une page dédié a ce seul article au lieu de la page les listant tous.Je sais pas si j'ai été très clair dans mon explication, c'est pas simple à écrire ^^!Si vous avez des solutions je suis tout ouïe !Merci bien. Link to comment Share on other sites More sharing options...
gaius57 Posted February 7, 2014 Author Share Posted February 7, 2014 Je viens de partiellement me répondre à ma question.Pour générer un lien il faut-il obligatoirement le faire comme ceci ? $posts = Post::findAll(); foreach ($posts as $value) { echo $this->context->link->getModuleLink('jbblog','single')."?id=".$value['id_jbblog_post']; } J'avoue que je suis un peut perplexe face a ceci car d'une part je trouve que cela revient à coder un peu en dur les URLs ( en rajoutant nous même ?id=...&machin=... à la fin de l'URL. Et d'autre part 1 vue = 1 controller et ça c'est vraiement étrange, a moins là encore de rediriger vers un autre template en testant le $_GET, mais c'est vraiement du codage en dur bien moche non ?Je reste à l'écoute si vous avez d'autre solution bien sûr ! Link to comment Share on other sites More sharing options...
aschaeffer Posted February 8, 2014 Share Posted February 8, 2014 Hello Gaius, Pour répondre à ta question, le développement d'un module avec Prestashop respecte bien le design pattern MVC. Avec : - les controlleurs qui effectuent le métier - les ObjectModel qui font la lien avec la BDD - les templates qui s'occupe de la vue Après, concernant ton problème pour la navigation, je pense que tu es sur la bonne voie. C'est en tout cas, si j'ai bien compris ce que tu fais, celle que j'utilise : tu as ta liste d'article pour l'adresse : maboutique/module/blog/default/ Celle liste d'article renvoie vers des liens : maboutique/module/blog/article?id=ID_DE_LARTICLE Tu as donc deux controlleurs et deux vues pour afficher tout cela (default pour la liste, article pour tes articles). Là où je te perds, c'est qu'en tu dis : Et d'autre part 1 vue = 1 controller et ça c'est vraiement étrange, a moins là encore de rediriger vers un autre template en testant le $_GET, mais c'est vraiement du codage en dur bien moche non ? Tu voudrais avoir une vue et un controlleur par article pour ne pas tester l'id de l'article ? Cela ne serait pas terrible, car cela te reviendrait à dupliquer du code sans raison et cela deviendrait rapidement dur à maintenir. Petit détails, ne test jamais les paramètres $_GET et $_POST directement lorsque tu utilises un framework. Généralement, on te propose des méthodes pour récupérer ces valeurs. L'avantage de ces méthodes est qu'elles appliquent des tests de sécurités. Pour prestashop, tu peux utiliser, "Tools::getValue()", par exemple : $idArticle = Tools::getValue('idArticle'); 1 Link to comment Share on other sites More sharing options...
Matt75 Posted February 9, 2014 Share Posted February 9, 2014 Salut, Moi généralement j'affiche la liste des mes objets (dans ton cas des articles) dans le controller default puis un seul objet (dans ton cas un article) avec un controller display. Sinon si tu veux utiliser un seul controller, regarde le controller qui gére les pages CMS dans Prestashop /controllers/front/CmsController.php De plus dans ton cas, il serait intéressant d'utiliser l'URL Rewriting pour avoir une URL /blog qui correspondrait à la liste de tes articles sur ton controller default et une URL /blog/1-mon-premier-article Pour cela il faut utiliser un nouveau Hook nommé hookModuleRoutes voici un petit tuto : http://blog.dev-net.fr/2013/01/utiliser-des-urls-rewrite-personnalisees-dans-vos-modules/ A+ 1 Link to comment Share on other sites More sharing options...
gaius57 Posted February 11, 2014 Author Share Posted February 11, 2014 Désolé pour le retard je reviens tout juste d'un grand week-end au ski .Déjà merci à vous deux pour vos réponses, c'est d'une grande aide !Pour le 1 vue = 1 controller je crois que je me suis emmêlé les pinceaux dans ma réflection. Pour faire ça de manière propre, j'aimerai que les URLs ressemble à ça :- nom-du-site/blog/ -> acceuil du blog listant les articles.- nom-du-site/blog/slug-de-l'article -> page de l'article avec ses commentaires- nom-du-site/blog/category/info -> liste d'article de la categorie "info" (categories non géré pour le moment, je verrai par la suite).Il faut donc que je trouve les bons controller a faire puis gérer l'URL rewriting comme tu me l'a suggéré Matt75.En tous cas merci a vous deux ! Link to comment Share on other sites More sharing options...
aschaeffer Posted February 11, 2014 Share Posted February 11, 2014 Content que cela ait pu t'aider ! J'aurais pas su comment faire l'URL Rewriting et je vais me garder l'article de Matt au chaud pour la prochaine fois que je développe un module Prestashop. L'article a l'air vraiment sympa Link to comment Share on other sites More sharing options...
Prestaspirit Posted February 11, 2014 Share Posted February 11, 2014 Salut, Je t'invite aussi a consulter la classe link tu verra qu'il est possible de passez tes paramètres dans la méthodes et ainsi avoir un résultat plus propre. Link to comment Share on other sites More sharing options...
gaius57 Posted February 12, 2014 Author Share Posted February 12, 2014 J'en prends note, merci pour l'info .Une autre petite question, savez vous comment enregistrer une entrée dans la BDD qui ne fait pas partie du formulaire?Je m'explique : J'enregistre un nouvel article dont l'id sera 6 et le titre "Coucou l'article". Au moment de l'enregistrement j'aimerai enregistrer dans le champ "name" "6-coucou-l-article" automatiquement. J'ai essayé en bidouillant mais en vain . Le fait que le "name" ça ne soit pas un champ de texte du formulaire me bloque. Link to comment Share on other sites More sharing options...
Matt75 Posted February 12, 2014 Share Posted February 12, 2014 (edited) Salut, Je te conseil de laisser un champs texte pour saisir le slug car parfois c'est mieux de l'optimiser manuellement pour retirer des caractères ou mots inutiles. De faire un contrôle de saisie dessus pour t'assurer qu'il est valide et de le remplir automatiquement lorsqu'il est laissé vide. Pour le contrôle de saisie : Validate::isLinkRewrite($link) Sinon je ne vois pas le problème pour enregistrer un champs dans la base qui n'est pas dans le formulaire.Si tu utilises ObjectModel, suffit de surcharger la méthode pour y ajouter un traitement. Exemple: public function add($autodate = true, $null_values = false) { $this->slug = Tools::link_rewrite($this->title); return parent::add($autodate, true); } Ensuite ne mets pas l'ID dans ton slug, Prestashop le fera tout seul lorsque tu lui demanderas de génerer un lien $this->context->link->getModuleLink('blogmodule', 'display', array('id_article' => $id_article, 'rewrite' => $slug)) Remplace blogmodule par le nom de ton module, display par le nom de ton controller. A+ Edited February 12, 2014 by Matt75 (see edit history) 1 Link to comment Share on other sites More sharing options...
gaius57 Posted February 13, 2014 Author Share Posted February 13, 2014 Alors là Matt75 merci beaucoup, tout fonctionne à merveille ! Pour la méthode "add" dans le model, je n'était tout simplement pas au courant ^^ ! Je débute dans Prestashop et je n'ai pas beaucoup de repère, mais ça commence à venir, grâce à vos réponses en partie !Bref, c'est génial, MERCI ! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now