PageRenderTime 49ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/quick_tour/the_view.rst

https://github.com/Gregwar/symfony-docs-fr
ReStructuredText | 299 lines | 210 code | 89 blank | 0 comment | 0 complexity | 3741a465503b0ace77b872179bd834ff MD5 | raw file
  1. La vue
  2. ======
  3. Après avoir lu la première partie de ce tutoriel, vous avez décidé que Symfony2
  4. méritait 10 minutes de plus. Excellent choix ! Dans cette seconde partie, vous
  5. en apprendrez plus sur le moteur de template de Symfony2, `Twig`_. Twig est un
  6. moteur de template PHP flexible, rapide et sécurisé. Il rend vos templates plus
  7. concis et lisibles; il les rend également plus accessibles aux web designers.
  8. .. note::
  9. Plutôt que Twig, vous pouvez tout aussi bien utiliser :doc:`PHP </cookbook/templating/PHP>`
  10. pour vos templates. Les deux moteurs sont supportés par Symfony2.
  11. Découvrir Twig
  12. --------------
  13. .. tip::
  14. Si vous voulez maîtriser Twig, il est fortement recommandé de lire la
  15. `documentation`_ officielle. Cette section est juste un rapide aperçu des
  16. concepts de base.
  17. Un template Twig est un fichier texte qui peut générer n'importe quel type de
  18. contenu (HTML, XML, CSV, LaTeX, ...). Twig définit deux sortes de délimiteurs :
  19. * ``{{ ... }}``: Affiche une variable ou le résultat d'une expression.
  20. * ``{% ... %}``: Contrôle la logique du template; il est utilisé pour éxécuter des
  21. boucles ``for`` et des conditions ``if``, entre autres.
  22. Ci-dessous un template minimal qui illustre quelques bases; en utilisant deux
  23. variables ``page_title`` et ``navigation``, qui ont été passées au template :
  24. .. code-block:: html+jinja
  25. <!DOCTYPE html>
  26. <html>
  27. <head>
  28. <title>My Webpage</title>
  29. </head>
  30. <body>
  31. <h1>{{ page_title }}</h1>
  32. <ul id="navigation">
  33. {% for item in navigation %}
  34. <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
  35. {% endfor %}
  36. </ul>
  37. </body>
  38. </html>
  39. .. tip::
  40. Des commentaires peuvent être inclus dans le template en utilisant le
  41. délimiteur ``{# ... #}``.
  42. Pour rendre un template dans Symfony, utilisez la méthode ``render`` depuis un
  43. contrôleur et passez toutes les variables requises par le template :
  44. .. code-block:: php
  45. $this->render('AcmeDemoBundle:Demo:hello.html.twig', array(
  46. 'name' => $name,
  47. ));
  48. Les variables passées à un template peuvent être des chaînes de caractères, des
  49. tableaux ou même des objets. Twig les gère de la même manière et vous permet
  50. d'accéder aux « attributs » d'une variable grâce à la notation (``.``) :
  51. .. code-block:: jinja
  52. {# array('name' => 'Fabien') #}
  53. {{ name }}
  54. {# array('user' => array('name' => 'Fabien')) #}
  55. {{ user.name }}
  56. {# force array lookup #}
  57. {{ user['name'] }}
  58. {# array('user' => new User('Fabien')) #}
  59. {{ user.name }}
  60. {{ user.getName }}
  61. {# force method name lookup #}
  62. {{ user.name() }}
  63. {{ user.getName() }}
  64. {# pass arguments to a method #}
  65. {{ user.date('Y-m-d') }}
  66. .. note::
  67. Il est important de savoir que les accolades ne font pas partie de la variable
  68. mais de son affichage. Si vous accéder à une variable dans un tag, ne mettez
  69. pas d'accolades autour.
  70. Templates de décoration
  71. -----------------------
  72. Bien souvent, les templates d'un projet partagent des éléments communs, comme les
  73. célèbres entête et pied de page. Dans Symfony2, ce problème est vu différemment :
  74. un template peut être décoré par un autre. Cela fonctionne exactement
  75. comme les classes PHP : l'héritage de template vous permet de bâtir un template
  76. « layout » de base qui contient tous les éléments communs de votre site et de définir
  77. des « blocks » que les templates enfants pourront surcharger.
  78. Le template ``hello.html.twig`` hérite du template ``layout.html.twig``, grâce au
  79. tag ``extends`` :
  80. .. code-block:: html+jinja
  81. {# src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig #}
  82. {% extends "AcmeDemoBundle::layout.html.twig" %}
  83. {% block title "Hello " ~ name %}
  84. {% block content %}
  85. <h1>Hello {{ name }}!</h1>
  86. {% endblock %}
  87. La notation ``AcmeDemoBundle::layout.html.twig`` vous semble familière, n'est-ce pas ?
  88. C'est la même notation utilisée pour référencer un template classique. La partie
  89. ``::`` signifie simplement que le contrôleur est vide, et donc que le fichier
  90. correspondant est directement stocké dans le répertoire ``Resources/views/``.
  91. Maintenant, jettons à un oeil à un exemple simple du template ``layout.html.twig`` :
  92. .. code-block:: jinja
  93. {# src/Acme/DemoBundle/Resources/views/layout.html.twig #}
  94. <div class="symfony-content">
  95. {% block content %}
  96. {% endblock %}
  97. </div>
  98. Le tag ``{% block %}`` définit des blocs que les templates enfants vont pouvoir remplir.
  99. Tout ce que le tag block fait est de spécifier au moteur de template qu'un template
  100. enfant va surcharger cette partie du template.
  101. Dans cet exemple, le template ``hello.html.twig`` surcharge le block ``content``,
  102. ce qui signifie que le texte « Hello Fabien » sera affiché dans l'élément ``div.symfony-content``.
  103. Utiliser les tags, les filtres et les fonctions
  104. -----------------------------------------------
  105. L'une des meilleurs fonctionnalités de Twig est son extensibilité via les tags,
  106. les filtres et les fonctions. Symfony2 est fourni avec beaucoup de fonctions
  107. préconstruites pour faciliter le travail des designers.
  108. Inclure d'autres templates
  109. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  110. La meilleure manière de partager un morceau de code entre plusieurs templates
  111. distincts est de créer un nouveau template qui sera inclus dans les autres.
  112. Créez un template ``embedded.html.twig`` :
  113. .. code-block:: jinja
  114. {# src/Acme/DemoBundle/Resources/views/Demo/embedded.html.twig #}
  115. Hello {{ name }}
  116. Et changez le template ``index.html.twig`` pour l'inclure:
  117. .. code-block:: jinja
  118. {# src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig #}
  119. {% extends "AcmeDemoBundle::layout.html.twig" %}
  120. {# override the body block from embedded.html.twig #}
  121. {% block content %}
  122. {% include "AcmeDemoBundle:Demo:embedded.html.twig" %}
  123. {% endblock %}
  124. Imbriquer d'autres contrôleurs
  125. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  126. Et si vous vouliez inclure le résultat d'un autre contrôleur dans votre template ?
  127. C'est très utile en travaillant avec Ajax, ou quand les templates inclus
  128. ont besoin de variables qui ne sont pas disponibles dans le template principal.
  129. Supposez que vous avez créé une action ``fancy`` et que vous voulez l'inclure
  130. à l'interieur du template ``index``. Pour faire cela, utilisez le tag ``render`` :
  131. .. code-block:: jinja
  132. {# src/Acme/DemoBundle/Resources/views/Demo/index.html.twig #}
  133. {% render "AcmeDemoBundle:Demo:fancy" with {'name': name, 'color': 'green'} %}
  134. Ici, la chaîne de caractères ``AcmeDemoBundle:Demo:fancy`` fait référence à l'action
  135. ``fancy`` du contrôleur ``Demo``. Les arguments (``name`` et ``color``) agissent
  136. comme des variables de requête simulée (comme si l'action ``fancyAction``
  137. était gérée comme une toute nouvelle requête) et sont mis à disposition du contrôleur :
  138. .. code-block:: php
  139. // src/Acme/DemoBundle/Controller/DemoController.php
  140. class DemoController extends Controller
  141. {
  142. public function fancyAction($name, $color)
  143. {
  144. // create some object, based on the $color variable
  145. $object = ...;
  146. return $this->render('AcmeDemoBundle:Demo:fancy.html.twig', array('name' => $name, 'object' => $object));
  147. }
  148. // ...
  149. }
  150. Créer des liens entre les pages
  151. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  152. Créer des liens entre les pages d'une application web est incontournable. Au
  153. lieu de coder en dur les URLs dans les templates, la fonction ``path`` peut
  154. générer des URLs en se basant sur la configuration du routing. De cette manière,
  155. toutes vos URLs peuvent être facilement mise à jour en changeant juste le fichier
  156. de configuration :
  157. .. code-block:: html+jinja
  158. <a href="{{ path('_demo_hello', { 'name': 'Fabien' }) }}">Hello Fabien!</a>
  159. La fonction ``path`` prend le nom de la route et un tableau de paramètres comme
  160. arguments. Le nom de la route est la clé principale sous laquelle les
  161. routes sont référencées et les paramètres sont les valeurs définies dans le
  162. masque (pattern) de chaque route :
  163. .. code-block:: php
  164. // src/Acme/DemoBundle/Controller/DemoController.php
  165. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  166. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  167. // ...
  168. /**
  169. * @Route("/hello/{name}", name="_demo_hello")
  170. * @Template()
  171. */
  172. public function helloAction($name)
  173. {
  174. return array('name' => $name);
  175. }
  176. .. tip::
  177. La fonction ``url`` génère des URLs *absolues* : ``{{ url('_demo_hello', {
  178. 'name': 'Thomas'}) }}``.
  179. Inclure les assets: images, javascripts, et feuilles de style
  180. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  181. Que serait Internet sans images, javascripts, et feuilles de style ?
  182. Symfony2 fournit la fonction ``asset`` pour les gérer très facilement :
  183. .. code-block:: jinja
  184. <link href="{{ asset('css/blog.css') }}" rel="stylesheet" type="text/css" />
  185. <img src="{{ asset('images/logo.png') }}" />
  186. Le but principal de la fonction ``asset`` est de rendre votre application plus
  187. portable. Grâce à cette fonction, vous pouvez déplacer le répertoire racine
  188. de votre application n'importe où sous le répertoire racine web sans changer le
  189. moindre code dans vos templates.
  190. Echapper les variables
  191. ----------------------
  192. Twig est configuré par défaut pour échapper automatiquement le flux de sortie.
  193. Lisez la `documentation`_ de Twig pour en apprendre plus sur l'échappement et
  194. l'extension Escaper.
  195. Le mot de la fin
  196. ----------------
  197. Twig est simple mais puissant. Grâce aux layouts, aux blocks, aux templates et
  198. aux inclusions d'actions, il est très facile d'organiser vos templates de façon
  199. logique et extensible. Pourtant, si vous n'êtes pas à l'aise avec
  200. Twig, vous pouvez toujours utiliser PHP dans les templates de Symfony sans aucun
  201. soucis.
  202. Vous avez travaillé à peine 20 minutes avec Symfony2, mais vous pouvez déjà faire
  203. des choses incroyables avec. C'est la puissance de Symfony2. Apprendre les concepts de base
  204. est très simple, et vous apprendrez bientôt que cette simplicité est cachée derrière
  205. une architecture flexible.
  206. Mais il ne faut pas aller trop vite. D'abord, vous devez en apprendre plus sur le
  207. contrôleur et c'est justement le sujet de la :doc:`prochaine partie de ce tutoriel<the_controller>`.
  208. Prêt pour 10 nouvelles minutes avec Symfony2 ?
  209. .. _Twig: http://twig.sensiolabs.org/
  210. .. _documentation: http://twig.sensiolabs.org/documentation