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