11.Zend Framework 2 et 3

11.6.Modèle MVC

11.6.4.MVC: La vue

11.6.4.1.Introduction

La vue c'est la partie affichage de l'application. Elle se construit à partir des éléments retournés par le contrôleur[c'est quoi?].

11.6.4.2.Fichier vue

Par défaut, à chaque action de chaque contrôleur est associé un fichier décrivant le contenu de la vue. Dans le cadre d'une application web, même s'il s'agit d'un script PHP, le contenu de ce fichier est en majorité composée de code HTML et le traitement des données (en PHP) y est réduit au maximum (sachant que tout est censé avoir déjà été préparé du côté du contrôleur).
Coté contrôleur, comme on l'a vu dans le chapitre précédent [où?], l'action retourne (dans bon nombre de cas) un tableau (ou un objet contenant un tableau) associant un nom de variable à une valeur. Ces variables, il est alors possible d'y faire appel au sein du script de vue. Dans notre exemple l'action "monTest" retourne array('monparametre' => 'mavaleur'), on peut donc avoir une vue comme suit:
Je suis la <b>vue</b> et le contrôleur m'a dit que "monparametre" vaut <b><?php echo $monparametre?></b>
qui affichera, vous l'aurez compris, "Je suis la vue et le contrôleur m'a dit que "monparametre" vaut mavaleur".
rem
  • En vérité vous constaterez, notamment si vous repartez de squelette d'application MVC proposé par Zend Framework (comme suggéré dans le chapitre "installation de ZF"[où?]), que l'application ne se contente pas d'afficher la phrase indiquée ci-dessus mais propose également tout une mise en page avec menu en bandeau supérieur, etc. En effet, "par défaut", le code (HTML) retourné par la vue est inséré dans une mise en page
  • Si on préfère, à la place d'une vue qui retourne une page HTML, on pourra avoir une vue qui retourne un contenu JSON par exemple.
  • Il ne sera pas forcément nécessaire de créer une vue pour l'ensemble des actions de l'ensemble des contrôleurs. S'il y a besoin, plusieurs méthodes distinctes pourront faire appel à la même vue.
Tout cela, nous le verrons plus tard.
Reste que, pour que cela fonctionne, il faut déposer ce script au bon endroit dans l'arboresence du projet. C'est l'objet du chapitre suivant.

11.6.4.3.Arborescence fichiers (par défaut)

Si nous reprenons l'exemple que nous suivons depuis le chapitre sur le routage[où?], nous avons:
  • Un module nommé "PHPFacile"
  • Un contrôleur "TestController"
  • Une action "monTest"
Dans ce cas, par défaut, le nom attendu pour le fichier décrivant la vue est mon-test.phtml et devra se trouver dans le répertoire view/php-facile/test comme montré dans l'arborescence ci-dessous:
  • config
  • module
    • PHPFacile
      • config
      • src
        • Controller
          • TestController.php
        • Model
      • view
        • php-facile (du nom du module)
          • test (du nom du contrôleur)
            • mon-test.phtml (du nom de l'action)
  • config
  • module
    • PHPFacile
      • config
      • src
        • PHPFacile
          • Controller
            • TestController.php
          • Model
      • view
        • php-facile (du nom du module)
          • test (du nom du contrôleur)
            • mon-test.phtml (du nom de l'action)
En effet, le nom du fichier doit (par défaut) prendre l'extension .phtml et prendre pour nom celui de l'action (i.e. le nom de la méthode du contrôleur sans le suffixe Action) en minuscules. Ce fichier doit être déposé dans un dossier portant le nom du contrôleur (sans le suffixe Controller si jamais le nom du contrôleur se termine ainsi - comme c'est d'ailleurs l'usage) en minuscules. Enfin, ce dossier doit être (toujours par défaut) dans un dossier portant le nom du module, là encore, en minuscules.
Si le nom du module, du contrôleur ou de l'action contient des majuscules alors, lors du passage en minuscules, il convient d'insérer des tirets (ainsi monTest devient mon-test et PHPFacile devient php-facile).
rem
  • Si besoin la localisation et le nom du fichier de vue associé à une action d'un contrôleur peut être personnalisé dans la partie configuration du framework comme nous le verrons

11.6.4.4.Mise en page (layout)

11.6.4.4.1.Le fichier de mise en page (par défaut)

Comme nous l'avons évoqué précédemment, si vous mettez en oeuvre ce que nous venons de voir (en repartant par exemple du squelette d'application MVC proposé par Zend et évoqué dans le chapitre "installation de ZF"[où?]), vous constaterez que la page retournée ne contient pas uniquement ce qui est décrit dans le script de vue. Vous noterez que le code généré par la vue est intégré au sein d'une mise en page (classiquement avec menu dans le bandeau supérieur et pied de page).
Cette mise en page est décrite (par défaut) dans un fichier layout.phtml que l'on retrouve dans le dossier view/layout du module principal.
  • config
  • module
    • PHPFacile
      • config
        • module.config.php
      • src
        • Controller
        • Model
      • view
        • layout
          • layout.phtml
        • php-facile (du nom du module)
  • config
  • module
    • PHPFacile
      • config
        • module.config.php
      • src
        • PHPFacile
          • Controller
          • Model
      • view
        • layout
          • layout.phtml
        • php-facile (du nom du module)
Ce script layout.phtml est, tout comme le script de la vue, un script PHP essentiellement constitué de code HTML. Typiquement, c'est au niveau de ce script que l'on retrouve les balises <html>, <body>, etc. Ce qui explique pourquoi nous ne les avions pas précisées dans le script de la vue. Et c'est au milieu de ce code que l'on introduit l'instruction
<?php echo $this->content;?>
afin de préciser l'endroit où doit être inséré le code généré par la vue.
Nous pouvons donc avoir un fichier de mise en page (très) basique semblable à:
<html>
<head>
<title>Mise en page basique</title>
</head>
<body>
Cette petite phrase de présentation, en entête, je la retrouve sur toutes les pages.
<?php echo $this->content;?>
Il en est de même de cette petite phrase en pied de page
</body>
</html>

11.6.4.4.2.Personnalisation de la localisation du fichier de mise en page

La localisation et le nom du fichier de mise en page (layout) peuvent-être personnalisés dans le fichier de configuration du module principal module.config.php. Pour cela, il suffit de modifier la valeur associée à la clé layout/layout du tableau associé à la clé template_map de view_manager où par défaut nous avons:
<?php
    return [
         // Je passe sous silence le début de la configuration
         // et ne montre que la partie qui nous interesse dans view_manager
        'view_manager' => [
            'template_map' => [
                'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
            ],
        ],
        // Je passe sous silence le reste de la configuration
    );
<?php
    return array(
         // Je passe sous silence le début de la configuration
         // et ne montre que la partie qui nous interesse dans view_manager
        'view_manager' => array(
            'template_map' => array(
                'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
            ),
        ),
        // Je passe sous silence le reste de la configuration
    );