Jump to content

Action par l'URL via MVC (changement de pages)


Recommended Posts

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

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

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');
  • Like 1
Link to comment
Share on other sites

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+

  • Like 1
Link to comment
Share on other sites

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

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

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 by Matt75 (see edit history)
  • Like 1
Link to comment
Share on other sites

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

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...