[MANUAL] English:
[zend.git] / documentation / manual / ru / module_specs / Zend_Paginator-Advanced.xml
blobf24eda37bb813a42a92061a82c70f87117fac102
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.paginator.advanced">
4     <title>Расширенное использование</title>
6     <sect2 id="zend.paginator.advanced.adapters">
7         <title>Создание собственных адаптеров к источникам данных</title>
9         <para>
10             Вы можете столкнуться с таким типом источника данных, для которого
11             в Zend Framework-е не предусмотрено адаптера. В этом случае
12             нужно создать собственный адаптер.
13         </para>
15         <para>
16             Для этого нужно реализовать интерфейс
17             <classname>Zend_Paginator_Adapter_Interface</classname>. Он включает
18             в себя два метода:
19         </para>
21         <itemizedlist>
22             <listitem>
23                 <para>count()</para>
24             </listitem>
25             <listitem>
26                 <para>getItems($offset, $itemCountPerPage)</para>
27             </listitem>
28         </itemizedlist>
30         <para>
31             Кроме того, нужно реализовать конструктор, который принимает
32             источник данных в качестве параметра и сохраняет его в
33             защищенном или закрытом свойстве. Как его обрабатывать -
34             зависит от вас.
35         </para>
37         <para>
38             Если вы когда-либо использовали SPL-интерфейс
39             <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html"><classname>Countable</classname></ulink>,
40             то вам должно быть известно о назначении метода
41             <methodname>count()</methodname>. В
42             <classname>Zend_Paginator</classname> он возвращает общее количество
43             элементов в наборе данных.
44             Кроме того, объект <classname>Zend_Paginator</classname>
45             предоставляет метод <methodname>countAllItems()</methodname>
46             который служит посредником к методу адаптера
47             <methodname>count()</methodname>.
48         </para>
50         <para>
51             Метод <methodname>getItems()</methodname> ненамного сложнее.
52             Он должен принимать смещение и количество элементов на странице
53             и возвращать соответствующий кусок данных. В случае массива он
54             мог бы выглядеть следующим образом:
55         </para>
57         <programlisting language="php"><![CDATA[
58 return array_slice($this->_array, $offset, $itemCountPerPage);
59 ]]></programlisting>
61         <para>
62             Посмотрите исходники адаптеров, входящих в поставку
63             Zend Framework (все они реализуют
64             <classname>Zend_Paginator_Adapter_Interface</classname>), чтобы
65             получить представление о том, как можно реализовать свой адаптер.
66         </para>
67     </sect2>
69     <sect2 id="zend.paginator.advanced.scrolling-styles">
70         <title>Создание своих стилей прокрутки</title>
72         <para>
73             При создании своего стиля прокрутки реализуйте интерфейс
74             <classname>Zend_Paginator_ScrollingStyle_Interface</classname>,
75             который определяет единственный метод,
76             <methodname>getPages()</methodname>:
77         </para>
79         <programlisting language="php"><![CDATA[
80 public function getPages(Zend_Paginator $paginator, $pageRange = null);
81 ]]></programlisting>
83         <para>
84             Этот метод должен определять номера пограничных
85             страниц в ряде так называемых "локальных" страниц (т.е. страниц,
86             которые находятся рядом с текущей страницей).
87         </para>
89         <para>
90             Если только ваш стиль прокрутки не наследует от уже существующего
91             (для примера смотрите
92             <classname>Zend_Paginator_ScrollingStyle_Elastic</classname>), то
93             этот метод должен иметь в конце что-то вроде следующего:
94         </para>
96         <programlisting language="php"><![CDATA[
97 return $paginator->getPagesInRange($lowerBound, $upperBound);
98 ]]></programlisting>
100         <para>
101             Этим вызовом не делается ничего особенного. Этот метод просто
102             для удобства - он проверяет на корректность верхний и нижний
103             пределы и возвращает массив номеров страниц для постраничной
104             навигации.
105         </para>
107         <para>
108             Для того, чтобы использовать новый стиль прокрутки,
109             следует указать <classname>Zend_Paginator</classname>-у, в какой
110             директории этот стиль находится. Для этого сделайте следующее:
111         </para>
113         <programlisting language="php"><![CDATA[
114 $prefix = 'My_Paginator_ScrollingStyle';
115 $path   = 'My/Paginator/ScrollingStyle/';
116 Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
117 ]]></programlisting>
118     </sect2>
120     <sect2 id="zend.paginator.advanced.caching">
121         <title>Возможности кэширования</title>
123         <para>
124             Можно указать <classname>Zend_Paginator</classname>-у, чтобы он
125             кэшировал получаемые данные, чтобы они не извлекались через
126             адаптер всякий раз, когда будет в них нужда.
127             Для этого просто передайте его методу
128             <methodname>setCache()</methodname> экземпляр
129             <classname>Zend_Cache_Core</classname>.
130         </para>
132         <para>
133             <programlisting language="php"><![CDATA[
134 $paginator = Zend_Paginator::factory($someData);
135 $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
136 $bO = array('cache_dir'=>'/tmp');
137 $cache = Zend_cache::factory('Core', 'File', $fO, $bO);
138 Zend_Paginator::setCache($cache);
139 ]]></programlisting>
140         </para>
142         <para>
143             После того, как <classname>Zend_Paginator</classname> получит
144             экземпляр <classname>Zend_Cache_Core</classname>, все данные будут
145             кэшироваться. Иногда возникает необходимость отключать кэширование
146             данных даже после того, как вы передали эекземпляр
147             <classname>Zend_Cache_Core</classname>. Для этого вы можете
148             использовать метод <methodname>setCacheEnable()</methodname>.
149         </para>
151         <para>
152             <programlisting language="php"><![CDATA[
153 $paginator = Zend_Paginator::factory($someData);
154 // $cache является экземпляром
155 Zend_Paginator::setCache($cache);
156 // ... ниже в коде
157 $paginator->setCacheEnable(false);
158 // теперь кэширование отключено
159 ]]></programlisting>
160         </para>
162         <para>
163             После того, как был установлен объект для кэширования, данные будут
164             сохраняться и извлекаться через него. Иногда бывает нужно очищать
165             кэш вручную.
166             Вы можете делать это через вызов метода
167             <methodname>clearPageItemCache($pageNumber)</methodname>.
168             В качестве аргумента метод принимает номер страницы, кэш
169             которой следует очистить.
170             Если вызов производится без передачи параметра, то весь кэш будет
171             очищен:
172         </para>
174         <para>
175             <programlisting language="php"><![CDATA[
176 $paginator = Zend_Paginator::factory($someData);
177 Zend_Paginator::setCache($cache);
178 $items = $paginator->getCurrentItems();
179 // теперь страница 1 в кэше
180 $page3Items = $paginator->getItemsByPage(3);
181 // теперь и страница 3 в кэше
183 // очищение кэша результатов для страницы 3
184 $paginator->clearPageItemCache(3);
186 // очищение всего кэша
187 $paginator->clearPageItemCache();
188 ]]></programlisting>
189         </para>
191         <para>
192             Изменение количества элементов на странице приведет к очищению
193             всего кэша, поскольку после этого он должен потерять актуальность:
194         </para>
196         <para>
197             <programlisting language="php"><![CDATA[
198 $paginator = Zend_Paginator::factory($someData);
199 Zend_Paginator::setCache($cache);
200 // извлечение некоторых элементов
201 $items = $paginator->getCurrentItems();
203 // весь кэш будет очищен:
204 $paginator->setItemCountPerPage(2);
205 ]]></programlisting>
206         </para>
208         <para>
209             Можно также видеть данные в кэше и запрашивать их напрямую.
210             Для этого может использоваться
211             метод <methodname>getPageItemCache()</methodname>:
212         </para>
214         <para>
215             <programlisting language="php"><![CDATA[
216 $paginator = Zend_Paginator::factory($someData);
217 $paginator->setItemCountPerPage(3);
218 Zend_Paginator::setCache($cache);
220 // извлечение некоторых элементов
221 $items = $paginator->getCurrentItems();
222 $otherItems = $paginator->getItemsPerPage(4);
224 // просмотр сохраненных в кэше элементов в виде двухмерного массива:
225 var_dump($paginator->getPageItemCache());
226 ]]></programlisting>
227         </para>
228     </sect2>
230     <sect2 id="zend.paginator.advanced.aggregator">
231         <title>Интерфейс Zend_Paginator_AdapterAggregate</title>
233         <para>
234             В зависимости от разрабатываемого приложения может возникнуть
235             потребность разбивать на страницы объекты, у которых внутренняя
236             структура данных эквивалентна существующим адаптерам,
237             но при этом вы не хотите нарушать инкапсуляцию для
238             того, что предоставлять доступ к этим данным.
239             В других случаях объект может участвовать в связи
240             "имеет-адаптер" вместо связи "является-адаптером", которую
241             предлагает <classname>Zend_Paginator_Adapter_Abstract</classname>.
242             В этих случаях вы можете использовать интерфейс
243             <classname>Zend_Paginator_AdapterAggregate</classname>,
244             который по поведению значительно похож на интерфейс
245             <classname>IteratorAggregate</classname> из расширения SPL.
246         </para>
248         <para>
249             <programlisting language="php"><![CDATA[
250 interface Zend_Paginator_AdapterAggregate
252     /**
253      * Возвращайте из этого метода полностью сконфигурированный адаптер.
254      *
255      * @return Zend_Paginator_Adapter_Abstract
256      */
257     public function getPaginatorAdapter();
259 ]]></programlisting>
260         </para>
262         <para>
263             Как видно из кода, интерфейс довольно небольшой и от вас ожидается
264             только возврат экземпляра
265             <classname>Zend_Paginator_Adapter_Abstract</classname>.
266             Фабричный метод
267             <methodname>Zend_Paginator::factory</methodname> и конструктор
268             класса <classname>Zend_Paginator</classname> после этого распознают
269             экземпляр <classname>Zend_Paginator_AdapterAggregate</classname>
270             и обрабатывают его должным образом.
271         </para>
272     </sect2>
274 </sect1>
275 <!--
276 vim:se ts=4 sw=4 et: