| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?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:
- -->
|