IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Bonnes pratiques pour une vue partagée


Sujet :

MVC PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Bonnes pratiques pour une vue partagée
    Bonjour,

    J'ai réalisé un système de news avec une vue partagée et je me demande si l'organisation que j'ai utilisé est "correcte" (ie dans l'esprit du framework, propre, facilement maintenable).
    Le système en lui même est simple : des news visible par tous le monde et une interface de gestion pour l'admin.


    J'ai opté pour l'organisation suivante :
    - Controller index avec les actions index, add, modify et delete qui permettent respectivement d'afficher les news, d'ajouter une news, de modifier une news et enfin de supprimer une news.

    - Controller admin avec les actions index, news et newslist.
    L'index contient un lien qui pointe vers l'action news. L'action news contient deux liens : un vers ajouter news qui pointe vers index/add et un vers newslist. Newslist affiche les news (tout comme index/index) en ajoutant deux liens supplémentaires Modifier la news (index/modify) et Supprimer la news (index/delete).

    En résumé, on accède aux news de la façon suivante :
    - index/index pour les utilisateurs normaux.
    - admin/index pour l'admin -> Clic -> admin/news -> Clic -> admin/newslist.


    Pour ceux qui ont suivi, le script de vue qui affiche les news est appelé deux fois. J'ai donc gérer ça de la façon suivante :
    - Dans l'action index du controller index : Récupération des news par le modèle et affichage dans la vue

    - Dans l'action newslist du controlleur admin : Récupération du nom du controlleur et nom de l'action et passage de ces valeurs dans la vue. Ces variables servent ensuite à modifier la vue pour afficher les liens modifier news et supprimer news.

    - Dans la vue de newslist : appel à l'action index du controlleur index.

    - Dans la vue de l'action index du controlleur index : l'affichage des news :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <h1>News</h1>
     
    <?php foreach($this->news as $news) : 
    	/* Formatage de la date pour son affichage */
    	$dateString = $this->escape($news->date); // Récupération de la date en BDD sous forme de string 
    	$dateObject = new Zend_Date($dateString); // Création d'un objet Zend_Date
    	$date = $dateObject->toString("dd MMM YYYY"); // Formatage de la date selon le format désiré 
    ?>
     
    <div class="news">
         <?php echo $this->escape($news->title); ?>
         <?php echo $date ?>
     
         <?php if($this->controller == 'admin' AND $this->action == 'newslist') { ?>
              <a href="<?php echo $this->url(array('controller'=>'index','action'=>'modify', 'id'=>$news->id));?>">Modifier news</a>
              <a href="<?php echo $this->url(array('controller'=>'index','action'=>'delete', 'id'=>$news->id));?>">Supprimer news</a>
     
         <?php } ?>
     
         <?php echo $this->escape($news->content); ?>
    </div>
     
    <?php endforeach; ?>

    Je trouve que la vue n'est pas très lisible notamment à cause des instructions conditionnelles ce qui m'amène à me demander si j'ai fait les bons choix de conception.
    - Est ce que j'ai bien géré la vue partagée ou existe-t-il de meilleures méthodes ?

    - Est ce qu'il ne serait pas plus simple de faire pointer le lien de admin/news directement vers index/index ?

    En bref, comment gérer vous ce type de problème dans vos projets ? J'aimerais que le code soit facilement maintenable.

    Merci à vous

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour,

    Plusieurs réflexions me vienne et ce ne sont que des pistes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        <?php if($this->controller == 'admin' AND $this->action == 'newslist') { ?>
              <a href="<?php echo $this->url(array('controller'=>'index','action'=>'modify', 'id'=>$news->id));?>">Modifier news</a>
              <a href="<?php echo $this->url(array('controller'=>'index','action'=>'delete', 'id'=>$news->id));?>">Supprimer news</a>
     
         <?php } ?>
    J'imagine (vu qu'on a pas le controller), que dans le controller vous faites une boucle pour ajouter les conditions.

    Vous pourriez dans ce cas juste créer une variable booléenne et mettre un partial ou une aide de vue pour la gestion des liens .

    de même que ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Formatage de la date pour son affichage */
    	$dateString = $this->escape($news->date); // Récupération de la date en BDD sous forme de string 
    	$dateObject = new Zend_Date($dateString); // Création d'un objet Zend_Date
    	$date = $dateObject->toString("dd MMM YYYY"); // Formatage de la date selon le format désiré
    Devrais être traité dans le controller, et comme si j'ai bien compris les dates viennent d'une DB, vous pourriez les extraire directement dans le bon format, vous y gagneriez en performance (si bien sûr l'objectif n'est que d'afficher la date).

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Pour la date, ça devrait effectivement être géré dans le controlleur, je modifie ça.

    Pour la vue partagée, j'ai l'impression qu'utiliser un partial ne changerait rien puisqu'il faudrait toujours l'inclure dans la vue de index (ce qui est déjà le cas avec la condition sur le controlleur).

    Si ca peut aider, voici mes controlleurs :
    Index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class IndexController extends Zend_Controller_Action
    {
        public function indexAction() // Index : Affichage de toutes les news
        {
    		$this->view->title = "News";
    		$this->view->headTitle($this->view->title, 'APPEND'); 
     
    		$news = new Model_DbTable_News(); // Création d'un objet Db_Table
    		$this->view->news = $news->fetchAll(); // Récupération de toutes les données de la table désignée par Model_DbTable_News (ie la table news) + Passage des données à la vue	
    	}
     
        public function addAction()
        {	
    	// Code controlleur action
        }
     
        public function modifyAction() 
        {
    	// Code controlleur action
        }
     
        public function deleteAction()
        {
    	// Code controlleur action
        }
    }
    Admin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    class AdminController extends Zend_Controller_Action
    {
     
        public function init()
        {
            /* Initialize action controller here */
        }
     
        public function indexAction()
        {
            // action body
        }
     
        public function newsAction()
        {
     
        }
     
        public function newslistAction()
        {
            // On récupère le nom du controller et de l'action en cours pour modifier la vue en fonction de leur valeur (ie on affiche les liens modifier et supprimer si on accède aux news depuis la zone admin)
            $this->view->controller = $this->getRequest()->getControllerName(); 
            $this->view->action = $this->getRequest()->getActionName();
        }
     
     
    }
    Les vues correspondantes :

    admin/index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h1>Zone d'administration</h1>
     
    <a href="<?php echo $this->url(array('controller'=>'admin','action'=>'news'));?>">Gérer les News</a><br /><br />
    admin/news :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <h1>Gestion des actualités</h1>
     
    <a href="<?php echo $this->url(array('controller'=>'index','action'=>'add'));?>">Ajouter une Actualité</a>
     
    <a href="<?php echo $this->url(array('controller'=>'admin','action'=>'newslist'));?>">Modifier ou Supprimer une Actualité</a>
    admin/newslist :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $this->action('index', 'index'); ?>
    Je me demande s'il ne serait pas plus simple de supprimer l'action newslist de admin et de modifier le lien de admin/news. Faire pointer ce dernier vers index/index et passer une variable user qui vaut admin. Il ne resterait alors qu'à modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     "if($this->controller == 'admin' AND $this->action == 'newslist') {" en if($user == 'admin').

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Citation Envoyé par HaloKard Voir le message
    s. Faire pointer ce dernier vers index/index et passer une variable user qui vaut admin. Il ne resterait alors qu'à modifier "if($this->controller == 'admin' AND $this->action == 'newslist') {" en if($user == 'admin').
    C'est en substance ce que je vous dis plus haut

    Par contre vous avez deux actions, vous n'avez alors qu'a travailler sur deux vues....non?

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/01/2015, 11h22
  2. Bonne pratique pour une ListView
    Par p4ndore dans le forum Composants graphiques
    Réponses: 8
    Dernier message: 13/02/2012, 16h03
  3. Réponses: 13
    Dernier message: 07/04/2010, 20h22
  4. Bonne pratique pour une table de décision
    Par Nalfeim dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2009, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo