Scripts de contrôleur

Scripts de vue

Une fois que le contrôleur a assigné les variables et appelé render(), Zend_View inclue le script de vue requis et l'exécute "à l'intérieur" de la portée de l'instance Zend_View. Donc dans vos scripts de vue, les références à $this pointent en fait sur l'instance Zend_View elle-même.

Les variables assignées à la vue depuis le contrôleur lui sont référées comme des propriétés de l'instance. Par exemple, si le contrôleur a assigné une variable "quelquechose", vous vous référerez à cette variable par $this->quelquechose dans le script de vue. (Cela vous permet de garder une trace pour savoir quelles valeurs ont été assignées au script, et lesquelles sont internes au script lui même.)

Pour rappel, voici l'exemple de script issu de l'introduction de ce chapitre sur Zend_View.

  1. span style="color: #ff0000;">'auteur''titre'

Échapper la sortie

Une des tâches les plus importantes à effectuer dans un script de vue est de s'assurer que la sortie est correctement échappée ; de plus ceci permet d'éviter les attaques de type cross-site scripting (XSS). A moins que vous n'utilisiez une fonction, une méthode, ou une aide qui gère l'échappement, vous devriez toujours échapper les variables lors de l'affichage.

Zend_View a une méthode appelée escape() qui se charge de l'échappement.

  1. // mauvaise pratique d'affichage
  2. // bonne pratique d'affichage

Par défaut, la méthode escape() utilise la fonction PHP htmlspecialchar() pour l'échappement. Cependant, en fonction de votre environnement, vous souhaitez peut-être un échappement différent. Utilisez la méthode setEscape() au niveau du contrôleur pour dire à Zend_View quelle méthode de rappel ("callback") elle doit utiliser.

  1. // crée une instance Zend_View
  2. // spécifie qu'il faut utiliser htmlentities
  3. // comme rappel d'échappement
  4. $view->setEscape('htmlentities');
  5.  
  6. // ou spécifie qu'il faut utiliser une méthode statique
  7. // comme rappel d'échappement
  8. 'UneClasse', 'nomDeMethode'));
  9.  
  10. // ou alors une méthode d'instance
  11. 'nomDeMethode'));
  12.  
  13. // et ensuite effectue le rendu de la vue

La fonction ou méthode de rappel doit prendre la valeur à échapper dans le premier paramètre, et tous les autres paramètres devraient être optionnels.

Utiliser des systèmes de gabarit (template) alternatifs

Bien que PHP lui-même un moteur de gabarit puissant, beaucoup de développeurs pensent que c'est beaucoup trop puissant ou complexe pour les graphistes/intégrateurs et veulent utiliser un moteur de template alternatif. Zend_View fournit deux mécanismes pour faire cela, le premier à travers les scripts de vues, le second en implémentant Zend_View_Interface.

Système de gabarit utilisant les scripts de vues

Un script de vue peut être utilisé pour instancier et manipuler un objet de gabarit séparé, comme un gabarit de type PHPLIB. Le script de vue pour ce type d'activité pourrait ressembler à ceci :

  1. span style="color: #ff0000;">'template.inc'"listelivre" => "listelivre.tpl",
  2.         "chaquelivre" => "chaquelivre.tpl"'auteur', $this->escape($livre['auteur''titre', $this->escape($livre['titre']);
  3.         $tpl->parse("livre", "chaquelivre""output", "listelivre""nobooks", "pasdelivres.tpl")
  4.     $tpl->pparse("output", "pasdelivres");
  5. }

Et ceci pourrait être les fichiers de gabarits correspondants :

  1. <!-- listelivre.tpl -->
  2. <table>
  3.     <tr>
  4.         <th>Auteur</th>
  5.         <th>Titre</th>
  6.     </tr>
  7.     {livres}
  8. </table>
  9.  
  10. <!-- chaquelivre.tpl -->
  11.     <tr>
  12.         <td>{auteur}</td>
  13.         <td>{title}</td>
  14.     </tr>
  15.  
  16. <!-- pasdelivres.tpl -->
  17. <p>Aucun livre à afficher</p>

Système de gabarit utilisant Zend_View_Interface

Certains peuvent trouver plus facile de simplement fournir un moteur de gabarit compatible avec Zend_View. Zend_View_Interface définit l'interface de compatibilité minimale nécessaire :

  1. /**
  2. * Retourne l'objet moteur de gabarit actuel
  3. *//**
  4. * Affecte le dossier des scripts de gabarits
  5. *//**
  6. * Règle un chemin de base pour toutes les ressources de vue
  7. */'Zend_View');
  8.  
  9. /**
  10. * Ajoute un chemin de base supplémentaire pour les ressources de vue
  11. */'Zend_View');
  12.  
  13. /**
  14. * Récupère les chemins actuels vers les ressources de vue
  15. *//**
  16. * Méthode à surcharger pour affecter les variables des gabarits
  17. * en tant que propriétés de l'objet
  18. *//**
  19. * Affectation manuelle de variable de gabarit, ou possibilité
  20. * d'affecter des variables en masse.
  21. *//**
  22. * Efface toutes les variables du gabarit déjà affectées
  23. *//**
  24. * Effectue le rendu du gabarit nommé $name
  25. */

En utilisant cette interface, il devient relativement facile d'encapsuler un moteur de gabarit tiers comme une classe compatible Zend_View. Comme par exemple, le code suivant est une encapsulation potentielle de Smarty :

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Objet Smarty
  3.      * @var Smarty
  4.      *//**
  5.      * Constructeur
  6.      *
  7.      * @param string $tmplPath
  8.      * @param array $extraParams
  9.      * @return void
  10.      *//**
  11.      * Retourne l'objet moteur de gabarit
  12.      *
  13.      * @return Smarty
  14.      *//**
  15.      * Affecte le dossier des scripts de gabarits
  16.      *
  17.      * @param string $path Le répertoire à affecter au path
  18.      * @return void
  19.      */'Répertoire fourni invalide');
  20.     }
  21.  
  22.     /**
  23.      * Récupère le dossier courant des gabarits
  24.      *
  25.      * @return string
  26.      *//**
  27.      * Alias pour setScriptPath
  28.      *
  29.      * @param string $path
  30.      * @param string $prefix Unused
  31.      * @return void
  32.      */'Zend_View'/**
  33.      * Alias pour setScriptPath
  34.      *
  35.      * @param string $path
  36.      * @param string $prefix Unused
  37.      * @return void
  38.      */'Zend_View'/**
  39.      * Affectation une variable au gabarit
  40.      *
  41.      * @param string $key Le nom de la variable
  42.      * @param mixed $val La valeur de la variable
  43.      * @return void
  44.      *//**
  45.      * Autorise le fonctionnement du test avec empty() and isset()
  46.      *
  47.      * @param string $key
  48.      * @return boolean
  49.      *//**
  50.      * Autorise l'effacement de toutes les variables du gabarit
  51.      *
  52.      * @param string $key
  53.      * @return void
  54.      *//**
  55.      * Affectation de variables au gabarit
  56.      *
  57.      * Autorise une affectation simple (une clé => une valeur)
  58.      * OU
  59.      * le passage d'un tableau (paire de clé => valeur)
  60.      * à affecter en masse
  61.      *
  62.      * @see __set()
  63.      * @param string|array $spec Le type d'affectation à utiliser
  64.                                 (clé ou tableau de paires clé => valeur)
  65.      * @param mixed $value (Optionel) Si vous assignez une variable nommée,
  66.                                       utilisé ceci comme valeur
  67.      * @return void
  68.      *//**
  69.      * Effacement de toutes les variables affectées
  70.      *
  71.      * Efface toutes les variables affectées à Zend_View
  72.      * via {@link assign()} ou surcharge de propriété
  73.      * ({@link __get()}/{@link __set()}).
  74.      *
  75.      * @return void
  76.      *//**
  77.      * Exécute le gabarit et retourne l'affichage
  78.      *
  79.      * @param string $name Le gabarit à exécuter
  80.      * @return string L'affichage
  81.      */

Dans cet exemple, vous instanciez la classe Zend_View_Smarty au lieu de Zend_View, et vous l'utilisez de la même façon :

  1. //Exemple 1a. Dans l'initView() de l'initializer.
  2. '/chemin/vers/les/templates''ViewRenderer'':controller/:action.:suffix')
  3.              ->setViewScriptPathNoControllerSpec(':action.:suffix')
  4.              ->setViewSuffix('tpl');
  5.  
  6. //Exemple 1b. L'utilisation dans le contrôleur d'action reste la même
  7. 'Zend PHP 5 Certification Study Guide';
  8.         $this->view->author = 'Davey Shafik and Ben Ramsey'
  9.     }
  10. }
  11.  
  12. //Example 2. Initialisation de la vue dans le contrôleur d'action
  13. '/path/to/templates''viewRenderer'':controller/:action.:suffix')
  14.                      ->setViewScriptPathNoControllerSpec(':action.:suffix')
  15.                      ->setViewSuffix('tpl');
  16.     }
  17. }

Scripts de contrôleur