plugins-usage.xml 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.plugins.usage">
  5. <title>Verwenden von Plugins</title>
  6. <para>
  7. Komponenten die Plugins verwenden, verwenden typischerweise
  8. <classname>Zend_Loader_PluginLoader</classname> um Ihre Arbeit zu tun. Diese Klasse
  9. registriert Plugins indem ein oder mehrere "Präfix Pfade" spezifiziert werden. Diese
  10. Komponente ruft anschließend die <methodname>load()</methodname> Methode des PluginLoader's
  11. auf, und übergibt Ihm den Kurznamen des Plugins. Der PluginLoader wird anschließend jeden
  12. Präfix Pfad abfragen um zu sehen ob eine Klasse passt die dem Kurznamen entspricht.
  13. Präfix Pfade werden also LIFO Reihenfolge (Last In, First Out) durchsucht, deshalb werden
  14. jene Präfix Pfade abgeglichen die zuletzt registriert wurden -- was es erlaubt existierende
  15. Plugins zu überladen.
  16. </para>
  17. <para>
  18. Einige Beispiele werden das alles etwas aufklären.
  19. </para>
  20. <example id="learning.plugins.usage.basic">
  21. <title>Grundsätzliches Plugin Beispiel: Hinzufügen eines einzelnen Präfix Pfades</title>
  22. <para>
  23. In diesem Beispiel nehmen wir an das einige Prüfungen geschrieben und im Verzeichnis
  24. <filename>foo/plugins/validators/</filename> wurden, und das alle Klassen den
  25. Klassenpräfix "Foo_Validate_" teilen; diese zwei Teile von Information formen unseren
  26. "Präfix Pfad". Weiters nehmen wir an das wir zwei Prüfungen haben, einen der "Even"
  27. genannt wird (und sicherstellt das eine Zahl die geprüft wird gerade ist), und eine
  28. andere die "Dozens" genannt wird (und sicherstellt das eine Zahl ein Vielfaches von 12
  29. ist). Die drei könnten wie folgt anschauen:
  30. </para>
  31. <programlisting language="text"><![CDATA[
  32. foo/
  33. |-- plugins/
  34. | |-- validators/
  35. | | |-- Even.php
  36. | | |-- Dozens.php
  37. ]]></programlisting>
  38. <para>
  39. Jetzt informieren wir eine <classname>Zend_Form_Element</classname> Instanz über diesen
  40. Präfix Pfad. <classname>Zend_Form_Element</classname>'s
  41. <methodname>addPrefixPath()</methodname> Methode erwartet ein drittes Argument welches
  42. den Typ des Plugins zeigt für den der Pfad registriert wird; in diesem Fall ist es ein
  43. "validate" Plugin.
  44. </para>
  45. <programlisting language="php"><![CDATA[
  46. $element->addPrefixPath('Foo_Validate', 'foo/plugins/validators/', 'validate');
  47. ]]></programlisting>
  48. <para>
  49. Jetzt können wir dem Element einfach den kurzen Namen der Prüfung angeben die wir
  50. verwenden wollen. Im folgenden Beispiel verwenden wir einen Mix aus Standardprüfungen
  51. ("NotEmpty", "Int") und eigenen Prüfungen ("Even", "Dozens").
  52. </para>
  53. <programlisting language="php"><![CDATA[
  54. $element->addValidator('NotEmpty')
  55. ->addValidator('Int')
  56. ->addValidator('Even')
  57. ->addValidator('Dozens');
  58. ]]></programlisting>
  59. <para>
  60. Wenn das Element geprüft werden soll, ruft es die Plugin Klasse vom PluginLoader ab.
  61. Die ersten zwei Prüfungen werden zu <classname>Zend_Validate_NotEmpty</classname> und
  62. <classname>Zend_Validate_Int</classname> aufgelöst; die nächsten zwei werden zu
  63. <classname>Foo_Validate_Even</classname> und <classname>Foo_Validate_Dozens</classname>
  64. aufgelöst.
  65. </para>
  66. </example>
  67. <note>
  68. <title>Was passiert wenn ein Plugin nicht gefunden wird?</title>
  69. <para>
  70. Was passiert wenn ein Plugin angefragt wird, aber der PluginLoader nicht in der Lage ist
  71. eine zu Ihm passende Klasse zu finden? Im obigen Beispiel, zum Beispiel, wenn wir das
  72. Plugin "Bar" mit dem Element registrieren, was würde dann passieren?
  73. </para>
  74. <para>
  75. Der Plugin Loader durchsucht jeden Präfix Pfad, prüft ob eine Datei gefunden wird die
  76. in diesem Pfad auf den Plugin Namen passt. Wenn die Datei nicht gefunden wird, geht er
  77. auf den nächsten Präfix Pfad weiter.
  78. </para>
  79. <para>
  80. Sobald der Stack von Präfix Pfaden erschöpft ist, und keine passende Datei gefunden
  81. wurde, wirft es eine <exceptionname>Zend_Loader_PluginLoader_Exception</exceptionname>.
  82. </para>
  83. </note>
  84. <example id="learning.plugins.usage.override">
  85. <title>Fortgeschrittene Plugin Verwendung: Überladen existierender Plugins</title>
  86. <para>
  87. Eine Stärke des PluginLoaders ist dessen Verwendung eines LIFO Stacks welche es erlaubt
  88. existierende Plugins zu überladen indem eine eigene Version lokal mit einem anderen
  89. Präfix Pfad erstellt wird, und der Präfix Pfad später im Stack registriert wird.
  90. </para>
  91. <para>
  92. Nehmen wir zum Beispiel <classname>Zend_View_Helper_FormButton</classname> an (View
  93. Helfer sind eine Form von Plugins). Dieser View Helfer akzeptiert drei Argumente, ein
  94. Elementname (der auch als DOM Identifikator des Elements verwendet wird), einen Wert
  95. (der als Button Label verwendet wird), und ein optionales Array an Attributen. Der
  96. Helfer erzeugt dann das <acronym>HTML</acronym> Markup für ein Formular Eingabeelement.
  97. </para>
  98. <para>
  99. Sagen wir, dass der Helfer stattdessen ein echtes <acronym>HTML</acronym>
  100. <constant>button</constant> Element erzeugen soll; dass wir nicht wollen das der Helfer
  101. einen DOM Identifikator erzeugt, sondern statt dessen den Wert für einen CSS Klassen
  102. Selektor; und das wir kein Interesse an der behandling eigener Attribute haben. Man
  103. könnte dies auf verschiedenen wegen erreichen. In beiden Fällen erstellen wir eine
  104. eigene View Helfer Klasse die das Verhalten implementiert welches wir wollen; der
  105. Unterschied liegt darin wie wir Sie benennen und aufrufen wollen.
  106. </para>
  107. <para>
  108. Unser erstes Beispiel wird der Name des Elements mit einem eindeutigen Namen sein:
  109. <classname>Foo_View_Helper_CssButton</classname> welcher den Plugin Namen "CssButton"
  110. impliziert. Wärend das ein recht brauchbarer Ansatz ist, wirft es einige Probleme auf:
  111. Wenn man bereits einen Button View Helfer im eigenen Code verwendet, muss man jetzt
  112. einges umarbeiten; alternativ, wenn ein anderer Entwickler damit beginnt Code für diese
  113. Anwendung zu schreiben, mus er unbeabsichtlicher Weise den Button View Helfer verwenden
  114. statt den neuen View Helfer.
  115. </para>
  116. <para>
  117. Deshalb ist es better den Plugin Namen "Button" zu verwenden was uns den Klassennamen
  118. <classname>Foo_View_Helper_Button</classname> gibt. Wir registrieren den Präfix Pfad in
  119. der View:
  120. </para>
  121. <programlisting language="php"><![CDATA[
  122. // Zend_View::addHelperPath() verwendet den PluginLoader; Trotzdem invertiert
  123. // er die Argumente, da er den Standardwert "Zend_View_Helper" für den Plugin
  124. // Präfix anbietet.
  125. //
  126. // Anbei nehmen wir an das die eigene Klasse im Verzeichnis
  127. // 'foo/view/helpers/' ist.
  128. $view->addHelperPath('foo/view/helpers', 'Foo_View_Helper');
  129. ]]></programlisting>
  130. <para>
  131. Sobald das getan wurde, wird überall wo wir den "Button" Helfer verwenden auf die
  132. eigene <classname>Foo_View_Helper_Button</classname> Klasse verwiesen!
  133. </para>
  134. </example>
  135. </sect1>