plugins-usage.xml 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.plugins.usage">
  5. <title>Utiliser des Plugins</title>
  6. <para>
  7. Les composants utilisant des plugins se servent de
  8. <classname>Zend_Loader_PluginLoader</classname> pour fonctionner. Cette classe vous
  9. propose d'enregistrer des "chemins de préfixes". Le composant va alors utiliser la méthode
  10. <methodname>load()</methodname> du PluginLoader en lui passant le nom court du plugin
  11. à charger. Le PluginLoader va ensuite tester chaque chemin de préfixe pour trouver une
  12. classe qui corresponde au nom court passé. Les chemins de préfixes sont testés en ordre
  13. LIFO (last in, first out) et il trouvera d'abord les chemins de préfixes enregistrés
  14. en dernier, ce qui permet de surcharger des plugins existants.
  15. </para>
  16. <para>
  17. Voici quelques exemples pour éclaircir tout ça.
  18. </para>
  19. <example id="learning.plugins.usage.basic">
  20. <title>Exemple de base: ajouter un chemin de préfixes simple</title>
  21. <para>
  22. Dans cet exemple, nous supposerons que des validateurs ont été écrits et enregistrés
  23. sous <filename>foo/plugins/validators/</filename>, puis que toutes ces classes
  24. partagent le même préfixe "Foo_Validate_"; ces deux informations forment le
  25. "chemin de préfixes". Imaginons maintenant deux validateurs, un s'appelle "Even" (impaire)
  26. il validera donc un chiffre impaire, et l'autre "Dozens"(multiples) qui vérifiera
  27. un chiffre multiple de 12. L'arbre ressemble à ceci:
  28. </para>
  29. <programlisting language="text"><![CDATA[
  30. foo/
  31. |-- plugins/
  32. | |-- validators/
  33. | | |-- Even.php
  34. | | |-- Dozens.php
  35. ]]></programlisting>
  36. <para>
  37. Maintenant, nous allons informer un <classname>Zend_Form_Element</classname> de ce
  38. chemin de préfixes. La méthode <methodname>addPrefixPath()</methodname> de
  39. <classname>Zend_Form_Element</classname> prend comme troisième paramètre le type de
  40. plugin pour lequel on spécifie un chemin, dans notre cas il s'agit d'un plugin de
  41. validation , "validate".
  42. </para>
  43. <programlisting language="php"><![CDATA[
  44. $element->addPrefixPath('Foo_Validate', 'foo/plugins/validators/', 'validate');
  45. ]]></programlisting>
  46. <para>
  47. Dès lors il devient possible de passer à l'élément le nom court du validateur. Dans l'exemple
  48. qui suit, nous mixons des validateurs standards ("NotEmpty", "Int") et personnalisés
  49. ("Even", "Dozens"):
  50. </para>
  51. <programlisting language="php"><![CDATA[
  52. $element->addValidator('NotEmpty')
  53. ->addValidator('Int')
  54. ->addValidator('Even')
  55. ->addValidator('Dozens');
  56. ]]></programlisting>
  57. <para>
  58. Lorsque l'élément devra utiliser la validation, il appellera le plugin via le
  59. PluginLoader. Les deux premiers validateurs vont correspondre à
  60. <classname>Zend_Validate_NotEmpty</classname> et
  61. <classname>Zend_Validate_Int</classname>, puis les deux suivants à
  62. <classname>Foo_Validate_Even</classname> et <classname>Foo_Validate_Dozens</classname>,
  63. respectivement.
  64. </para>
  65. </example>
  66. <note>
  67. <title>Que se passe-t-il si un plugin n'est pas trouvé?</title>
  68. <para>
  69. Que se passe-t-il si un plugin est demandé mais que le PluginLoader ne peut pas trouver
  70. de classe qui y corresponde? Dans notre exemple ci-dessus, la question devient
  71. "que se passe-t-il si j'enregistre le validateur "Bar" dans l'élément?"
  72. </para>
  73. <para>
  74. Le PluginLoader va chercher dans tous les chemins de prefixes pour trouver un fichier qui
  75. corresponde au nom du plugin. Si le fichier n'est pas trouvé, il passe au prochain
  76. chemin.
  77. </para>
  78. <para>
  79. Une fois que la pile de chemins est épuisée, si aucun fichier n'a été trouvé, il enverra
  80. une <exceptionname>Zend_Loader_PluginLoader_Exception</exceptionname>.
  81. </para>
  82. </note>
  83. <example id="learning.plugins.usage.override">
  84. <title>Exemple intermédiaire: Surcharger un plugin existant</title>
  85. <para>
  86. Une des forces du PluginLoader est qu'il utilise une pile LIFO, ceci vous permet
  87. de surcharger des plugins existants par les votres stockés dans des chemins
  88. différents en enregistrant ce chemin dans la pile.
  89. </para>
  90. <para>
  91. Par exemple, considérons <classname>Zend_View_Helper_FormButton</classname> (les aides
  92. de vue sont une forme de plugin). Cette aide de vue accepte trois paramètres, un nom
  93. DOM, une valeur (utilisée comme libéllé de bouton), et un tableau optionnel d'options.
  94. L'aide génère du HTML concernant un élément de formulaire.
  95. </para>
  96. <para>
  97. Imaginons que vous vouliez que cette aide génère un vrai bouton HTML
  98. <constant>button</constant>; vous ne voulez pas que cette aide génère un identifiant DOM
  99. mais plutôt une classe CSS; et que vous ne souhaitez pas utiliser d'options
  100. supplémentaires. Vous pourriez faire cela de plusieurs manières. Dans tous les cas vous
  101. allez créer votre aide de vue en y écrivant le comportement mais comment allez-vous
  102. nommer votre aide de vue et comment l'instancier?
  103. </para>
  104. <para>
  105. Nous allons d'abord nommer notre classe avec un nom unique non existant,
  106. <classname>Foo_View_Helper_CssButton</classname>, ceci donne immédiatement un nom de plugin:
  107. "CssButton". Pourquoi pas, mais ceci pose quelques problèmes: si vous utilisiez déja
  108. "FormButton" dans votre code vous allez devoir changer le nom partout, et si un autre
  109. développeur rejoind vos rangs, il pourrait être troublé par "CssButton" et intuitivement
  110. penser à l'aide standard "FormButton".
  111. </para>
  112. <para>
  113. Le mieux reste encore de nommer notre aide de vue "Button", en lui donnant comme nom de classe
  114. <classname>Foo_View_Helper_Button</classname>. Nous enregistrons aussi le chemin de préfixes
  115. dans la vue:
  116. </para>
  117. <programlisting language="php"><![CDATA[
  118. // Zend_View::addHelperPath() utilise PluginLoader; attention par contre
  119. // sa signature inverse les arguments par rapport à PluginLoader, ceci car il
  120. // propose une valeur par défaut au préfixe : "Zend_View_Helper"
  121. //
  122. // La ligne ci-dessous suppose que la classe soit logée dans 'foo/view/helpers/'.
  123. $view->addHelperPath('foo/view/helpers', 'Foo_View_Helper');
  124. ]]></programlisting>
  125. <para>
  126. A partir de ce moment, utiliser l'aide "Button" mènera vers votre propre classe
  127. <classname>Foo_View_Helper_Button</classname>!
  128. </para>
  129. </example>
  130. </sect1>