13.Zend Framework 2 et 3

13.6.Modèle MVC

13.6.4.MVC: La vue

13.6.4.5.Personnalisation de la vue retournée par action

13.6.4.5.1.Introduction

Il est possible faire en sorte que la vue retournée par l'action ne soit pas directement dictée par le nom du contrôleur et celui de l'action. Il est en effet possible de pointer directement vers l'identifiant de vue désiré. Cela permet, notamment, d'utiliser une même vue pour des actions différentes (sans avoir à passer par le fichier de configuration).
De même, il est possible d'indiquer si l'on souhaite que la vue retournée soit intégrée dans un script de mise en page ou pas.
Pour cela, vous devrez nécessairement faire en sorte que la méthode du contrôleur ne retourne pas directement un tableau (associant les clés et valeurs attendues dans la vue, comme nous l'avons fait par soucis de simplification dans le chapitre précédent) mais retourne plutôt un objet Zend\View\Model\ViewModel. Rassurez-vous la modification n'est pas grande, il suffit de passer le tableau dans le constructeur de l'objet ViewModel.
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        // Tableau des données à passer à la vue
        $vue = new ViewModel(array('variable' => 'valeur'));
        return $vue;
    }
}

13.6.4.5.2.Définir la vue à utiliser au retour d'une action

Pour définir la vue à utiliser au retour d'une action vous pouvez faire appel à la méthode setTemplate(). Cette méthode prend pour paramètre le chemin vers le script de vue (ou un alias). Ce chemin est (par défaut) relatif au dossier view/. Il n'est pas nécessaire de préciser l'extension du fichier lorsque celle-ci est l'extension par défaut (typiquement '.phtml').
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        // Tableau des données à passer à la vue
        $vue = new ViewModel(array('variable' => 'valeur'));
        $vue->setTemplate('chemin/vers/vue');
        return $vue;
    }
}
  • config
  • module
    • PHPFacile
      • config
        • module.config.php
      • src
      • view
        • chemin
          • vers
            • vue.phtml c'est vers ce fichier que pointe 'chemin/vers/vue'
rem
  • Plutôt que d'indiquer un "vrai" chemin il est possible d'indiquer un chemin alias qui sera configuré dans la partie template_map de la section view_manager du fichier de configuration module.config.php, comme on l'a vu dans le paragraphe précédent. Notez que ceci permet aussi de pointer sur un fichier en dehors du dossier view/.
  • Vous pouvez également configurer Zend Framework MVC pour que le script de vue soit recherché dans un autre dossier que view/ ou dans une liste de dossiers candidats, pour cela vous devez préciser la liste des dossiers dans la clé template_path_stack dans la section view_manager de module.config.php
  • L'extension par défaut des scripts de vue est configurable via la clé default_template_suffix dans la section view_manager de module.config.php. Par défaut, la valeur est "phtml" et nous vous invitons à ne pas le modifier

13.6.4.5.3.Désactivation de la mise en page

La désactivation de la mise en page, permet d'afficher la vue telle quelle, sans l'insérer dans une mise en page (contrairement à ce qu'il se fait par défaut avec le squelette d'application Zend). Pour cela, il suffit de faire appel à la méthode setTerminal(true) de l'objet ViewModel.
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        $view = new ViewModel(array('variable' => 'valeur'));
        $view->setTerminal(true);
        return $view;
    }
}

13.6.4.6.Mise en page (layout) personnalisé par action

13.6.4.6.1.Introduction

Si vous le souhaitez, vous pouvez, pour des vues différentes (voire pour différents retours de vues), faire appel à des mises en pages distinctes .
La première opération à réaliser consiste à récupérer l'objet "mise en page". Pour cela, au sein de la classe du contrôleur, dans la méthode implémentant l'action vous pouvez faire appel à
<?php
$layout = this->layout();
?>

13.6.4.6.2.Sélection du script de mise en page

Une fois, l'objet "mise en page" récupéré, vous pouvez faire appel à sa méthode setTemplate tout à fait similaire à celle que l'on vient de voir pour l'objet ViewModel.
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        $this->layout->setTemplate('chemin/vers/mise_en_page');

        return new ViewModel(array('variable' => 'valeur'));
    }
}
On n'oubliera pas, évidemment, d'insérer le code
<?php echo $this->content;?>
au coeur du script de mise en page afin de préciser l'endroit où doit être inséré le retour de vue.