Zend_ProgressBar_Adapter_JsPush.xml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 15157 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.progressbar.adapter.jspush">
  5. <title>Zend_ProgressBar_Adapter_JsPush</title>
  6. <para>
  7. <classname>Zend_ProgressBar_Adapter_JsPush</classname> ist ein Adapter der es erlaubt den Fortschrittsbalken
  8. in einem Browser über Javascript Push zu aktualisieren. Das bedeutet das keine zweite
  9. Verbindung benötigt wird um den Status über den aktuell laufenden Prozess zu erhalten, sondern das
  10. der Prozess selbst seinen Status direkt an den Browser schickt.
  11. </para>
  12. <para>
  13. Man kann auch die Optionen des Adapters entweder über die <code>set*</code> Methoden oder durch die
  14. Übergabe eines Arrays, oder einer Instanz von <classname>Zend_Config</classname>, an den Constructor mit dem Optionen als
  15. ersten Parameter. Die möglichen Optionen sind:
  16. </para>
  17. <itemizedlist>
  18. <listitem>
  19. <para>
  20. <code>updateMethodName</code>: Die Javascript Methode die bei jeder Aktualisierung
  21. aufgerufen werden soll. Standardwert ist <classname>Zend_ProgressBar_Update</classname>.
  22. </para>
  23. </listitem>
  24. <listitem>
  25. <para>
  26. <code>finishMethodName</code>: Die Javascript Methode die aufgerufen werden soll wenn
  27. der Beendet-Status gesetzt wurde. Der Standardwert ist <code>NULL</code>, was bedeutet
  28. das nichts passiert.
  29. </para>
  30. </listitem>
  31. </itemizedlist>
  32. <para>
  33. Die Verwendung dieses Adapters ist recht einfach. Zuerst wird ein Fortschrittsbalken im Browser
  34. erstellt, entweder mit JavaScript oder mit vorher erstelltem reinen HTML. Dann definiert man die
  35. Update Methode und optional die Finish Methode in JavaScript, die beide ein Json Objekt als
  36. einziges Argument nehmen. Das wird die Webseite mit einem lange laufenden Prozess, in einem
  37. versteckten <code>iframe</code> oder <code>object</code> Tag, aufgerufen. Wärend der Prozess
  38. läuft wird der Adapter die Update Methode bei jedem Update mit einem Json Objekt aufgerufen,
  39. das die folgenden Parameter enthält:
  40. </para>
  41. <itemizedlist>
  42. <listitem>
  43. <para>
  44. <code>current</code>: Der aktuelle absolute Wert
  45. </para>
  46. </listitem>
  47. <listitem>
  48. <para>
  49. <code>max</code>: Der maximale absolute Wert
  50. </para>
  51. </listitem>
  52. <listitem>
  53. <para>
  54. <code>percent</code>: Der berechnete Prozentwert
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. <code>timeTaken</code>: Die Zeit die der Prozess bis jetzt gelaufen ist
  60. </para>
  61. </listitem>
  62. <listitem>
  63. <para>
  64. <code>timeRemaining</code>: Die erwartete Zeit bis der Prozess beendet ist
  65. </para>
  66. </listitem>
  67. <listitem>
  68. <para>
  69. <code>text</code>: Die optionale Statusmeldung, wenn angegeben
  70. </para>
  71. </listitem>
  72. </itemizedlist>
  73. <example id="zend.progressbar-adapter.jspush.example">
  74. <title>Grundsätzliches Beispiel für den Client-seitigen Teil</title>
  75. <para>
  76. Dieses Beispiel zeigt ein grundsätzliches Setup von HTML, CSS und JavaScript für den JsPush
  77. Adapter
  78. </para>
  79. <programlisting role="html"><![CDATA[
  80. <div id="zend-progressbar-container">
  81. <div id="zend-progressbar-done"></div>
  82. </div>
  83. <iframe src="long-running-process.php" id="long-running-process"></iframe>
  84. ]]></programlisting>
  85. <programlisting role="css"><![CDATA[
  86. #long-running-process {
  87. position: absolute;
  88. left: -100px;
  89. top: -100px;
  90. width: 1px;
  91. height: 1px;
  92. }
  93. #zend-progressbar-container {
  94. width: 100px;
  95. height: 30px;
  96. border: 1px solid #000000;
  97. background-color: #ffffff;
  98. }
  99. #zend-progressbar-done {
  100. width: 0;
  101. height: 30px;
  102. background-color: #000000;
  103. }
  104. ]]></programlisting>
  105. <programlisting role="javascript"><![CDATA[
  106. function Zend_ProgressBar_Update(data)
  107. {
  108. document.getElementById('zend-progressbar-done').style.width = data.percent + '%';
  109. }
  110. ]]></programlisting>
  111. <para>
  112. Das erstellt einen einfachen Container mit einem schwarzen Rand und einem Block der den aktuellen
  113. Prozess anzeigt. Man sollte den <code>iframe</code> oder <code>object</code> nicht mit
  114. <code>display: none;</code> verstecken, da einige Browser wie Safari 2 den aktuellen Inhalt dann
  115. nicht laden.
  116. </para>
  117. <para>
  118. Statt einen eigenen Fortschrittsbalken zu erstellen, kann es gewünscht sein einen von einer
  119. vorhandenen Bibliothek wir Dojo, jQuery usw zu verwenden. Es gibt zum Beispiel:
  120. </para>
  121. <itemizedlist>
  122. <listitem>
  123. <para>Dojo: <ulink url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/user-assistance-and-feedback/progress-bar" /></para>
  124. </listitem>
  125. <listitem>
  126. <para>jQuery: <ulink url="http://t.wits.sg/2008/06/20/jquery-progress-bar-11/" /></para>
  127. </listitem>
  128. <listitem>
  129. <para>MooTools: <ulink url="http://davidwalsh.name/dw-content/progress-bar.php" /></para>
  130. </listitem>
  131. <listitem>
  132. <para>Prototype: <ulink url="http://livepipe.net/control/progressbar" /></para>
  133. </listitem>
  134. </itemizedlist>
  135. </example>
  136. <note>
  137. <title>Intervall der Updates</title>
  138. <para>
  139. Man sollte davon Abstand nehmen zuviele Updates zu senden, da jedes Update eine Mindestgröße
  140. von 1kb hat. Das ist eine Notwendigkeit für den Safari Browser um den Funktionsaufruf
  141. darzustellen und auszuführen. Der Internet Explorer hat eine ähnliche Einschränkung von 256 Bytes.
  142. </para>
  143. </note>
  144. </sect3>
  145. <!--
  146. vim:se ts=4 sw=4 et:
  147. -->