Zend_ProgressBar_Adapter_JsPush.xml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 21825 -->
  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> to adapter pozwalający na
  8. aktualizację paska postępu w przeglądarce poprzez JavaScript Push. To oznacza, że
  9. nie jest potrzebne nowe połączenie na potrzeby przesyłu danych o postępie operacji.
  10. Proces pracujący po stronie serwera komunikuje się bezpośrednio z przeglądarką
  11. użytkownika.
  12. </para>
  13. <para>
  14. Opcje adaptera można ustawiać za pomocą metod <code>set*</code> albo przez podanie
  15. tablicy asocjacyjnej lub obiektu <classname>Zend_Config</classname> w pierwszym parametrze
  16. konstruktora. Dostępne opcje to:
  17. </para>
  18. <itemizedlist>
  19. <listitem>
  20. <para>
  21. <code>updateMethodName</code>: Metoda JavaScript, która zostanie wywołana
  22. przy każdej aktualizacji paska postępu. Domyślnie jest to
  23. <classname>Zend_ProgressBar_Update</classname>.
  24. </para>
  25. </listitem>
  26. <listitem>
  27. <para>
  28. <code>finishMethodName</code>: Metoda JavaScript, która zostanie wywołana
  29. po zakończeniu prowadzonej operacji. Domyślna wartość to
  30. <constant>NULL</constant>, co oznacza brak reakcji.
  31. </para>
  32. </listitem>
  33. </itemizedlist>
  34. <para>
  35. Użycie tego adaptera jest dość proste. Na początku należy utworzyć pasek postępu w
  36. przeglądarce za pomocą poleceń JavaScript lub <acronym>HTML</acronym>. Następnie należy
  37. zdefiniować metodę JavaScript wywoływaną przy aktualizacji oraz (opcjonalnie)
  38. po skończeniu działania. Obie powinny przyjmować pojedynczy argument - obiekt
  39. <acronym>JSON</acronym>. Aby otworzyć połączenie należy wywołać długo trwającą akcję
  40. w ukrytym obiekcie <code>iframe</code> lub <code>object</code>. Podczas wykonywania
  41. tego procesu przy każdej aktualizacji adapter będzie wywoływał odpowiednią metodę
  42. przekazując do niej obiekt <acronym>JSON</acronym> o następujących parametrach:
  43. </para>
  44. <itemizedlist>
  45. <listitem>
  46. <para>
  47. <code>current</code>: Obecna wartość absolutna
  48. </para>
  49. </listitem>
  50. <listitem>
  51. <para>
  52. <code>max</code>: Maksymalna wartość absolutna
  53. </para>
  54. </listitem>
  55. <listitem>
  56. <para>
  57. <code>percent</code>: Obliczony procent postępu
  58. </para>
  59. </listitem>
  60. <listitem>
  61. <para>
  62. <code>timeTaken</code>: Czas trwania procesu (do obecnej chwili)
  63. </para>
  64. </listitem>
  65. <listitem>
  66. <para>
  67. <code>timeRemaining</code>: Oszacowanie czasu pozostałego do końca
  68. </para>
  69. </listitem>
  70. <listitem>
  71. <para>
  72. <code>text</code>: Opcjonalna wiadomość dotycząca stanu postępu
  73. </para>
  74. </listitem>
  75. </itemizedlist>
  76. <example id="zend.progressbar-adapter.jspush.example">
  77. <title>Podstawowy przykład kodu po stronie klienta</title>
  78. <para>
  79. Ten przykład ilustruje prosty kod <acronym>HTML</acronym>, <acronym>CSS</acronym>
  80. oraz JavaScript do użytku z adapterem JsPush
  81. </para>
  82. <programlisting language="html"><![CDATA[
  83. <div id="zend-progressbar-container">
  84. <div id="zend-progressbar-done"></div>
  85. </div>
  86. <iframe src="long-running-process.php" id="long-running-process"></iframe>
  87. ]]></programlisting>
  88. <programlisting language="css"><![CDATA[
  89. #long-running-process {
  90. position: absolute;
  91. left: -100px;
  92. top: -100px;
  93. width: 1px;
  94. height: 1px;
  95. }
  96. #zend-progressbar-container {
  97. width: 100px;
  98. height: 30px;
  99. border: 1px solid #000000;
  100. background-color: #ffffff;
  101. }
  102. #zend-progressbar-done {
  103. width: 0;
  104. height: 30px;
  105. background-color: #000000;
  106. }
  107. ]]></programlisting>
  108. <programlisting language="javascript"><![CDATA[
  109. function Zend_ProgressBar_Update(data)
  110. {
  111. document.getElementById('zend-progressbar-done').style.width = data.percent + '%';
  112. }
  113. ]]></programlisting>
  114. <para>
  115. Powyższy kod tworzy prosty pojemnik z czarną granicą oraz blok wskazujący
  116. zaawansowanie procesu. Należy pamiętać by nie ukrywać elementów
  117. <code>iframe</code> lub <code>object</code> poprzez <code>display: none;</code>
  118. ponieważ w takiej sytuacji niektóre przeglądarki jak Safari 2 w ogóle nie pobiorą
  119. tych elementów.
  120. </para>
  121. <para>
  122. Zamiast własnoręcznie tworzyć pasek postępu, można skorzystać z jednej z wielu
  123. dostępnych bibliotek JavaScript, takich jak Dojo czy jQuery. Np.:
  124. </para>
  125. <itemizedlist>
  126. <listitem>
  127. <para>
  128. Dojo: <ulink
  129. url="http://dojotoolkit.org/book/dojo-book-0-9/part-2-dijit/user-assistance-and-feedback/progress-bar" />
  130. </para>
  131. </listitem>
  132. <listitem>
  133. <para>
  134. jQuery: <ulink url="http://t.wits.sg/2008/06/20/jquery-progress-bar-11/" />
  135. </para>
  136. </listitem>
  137. <listitem>
  138. <para>
  139. MooTools: <ulink url="http://davidwalsh.name/dw-content/progress-bar.php" />
  140. </para>
  141. </listitem>
  142. <listitem>
  143. <para>
  144. Prototype: <ulink url="http://livepipe.net/control/progressbar" />
  145. </para>
  146. </listitem>
  147. </itemizedlist>
  148. </example>
  149. <note>
  150. <title>Odstęp czasowy pomiędzy aktualizacjami</title>
  151. <para>
  152. Należy upewnić się, że nie jest tworzona zbyt duża ilość aktualizacji. Każda z nich
  153. powinna przesyłać dane o wielkości co najmniej 1kB. Dla przeglądarki Safari jest to
  154. niezbędny warunek do wykonania polecenia wywołania funkcji. Internet Explorer ma
  155. podobne ograniczenie - w jego przypadku jest to 256 Bajtów.
  156. </para>
  157. </note>
  158. </sect3>
  159. <!--
  160. vim:se ts=4 sw=4 et:
  161. -->