Просмотр исходного кода

[DOCUMENTATION] Russian:
- Sync

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17793 44c647ce-9c0f-0410-b52a-842ac1e357ba

irina 16 лет назад
Родитель
Сommit
8b06ceede5

+ 74 - 127
documentation/manual/ru/module_specs/Zend_Mime_Message.xml

@@ -1,163 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.mime.message">
     <title>Zend_Mime_Message</title>
 
     <sect2 id="zend.mime.message.introduction">
-      <title>Введение</title>
-
-      <para>
-        <code>Zend_Mime_Message</code> представляет сообщения, составленные в
-        соответствии со спецификациями MIME, которые могут содержать одну или более
-        отдельных частей (представленные как объекты класса
-      <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>).
-      С помощью <code>Zend_Mime_Message</code> из объектов <code>Zend_Mime_Part</code>
-      могут быть сгенерированы сообщения MIME с типом multipart. Посредством этого класса
-      управление кодированием и разделителями производится явным образом.
-      Объекты <code>Zend_Mime_Message</code> могут быть восстановлены из данных
-      строк (экспериментальная возможность). Используется
-      <link linkend="zend.mail"><code>Zend_Mail</code></link>-ом.
-<!--
-      <code>Zend_Mime_Message</code> represents a MIME compliant message
-      that can contain one or more seperate Parts (Represented as <link
-      linkend="zend.mime.part"><code>Zend_Mime_Part</code></link> objects). With
-      <code>Zend_Mime_Message</code>, MIME compliant multipart messages can be generated from
-      <code>Zend_Mime_Part</code> objects. Encoding and Boundary handling are handled transparently
-      by the class. <code>Zend_Mime_Message</code> objects can also be reconstructed from given
-      strings (experimental). Used by <link linkend="zend.mail"><code>Zend_Mail</code></link>.
--->
-      </para>
+        <title>Введение</title>
+        <para>
+            <classname>Zend_Mime_Message</classname> представляет сообщения,
+            составленные в соответствии со спецификациями
+            <acronym>MIME</acronym>, такие сообщения могут содержать одну или
+            более отдельных частей, представляемых как объекты класса
+            <link linkend="zend.mime.part"><classname>Zend_Mime_Part</classname></link>).
+            С помощью <classname>Zend_Mime_Message</classname> из объектов
+            <classname>Zend_Mime_Part</classname> могут быть сгенерированы
+            сообщения MIME multipart. Также с помощью этого класса
+            производится прозрачное управление кодированием и разделителями.
+            Объекты <classname>Zend_Mime_Message</classname> могут быть
+            восстановлены из данных строк (экспериментальная возможность).
+            Используется
+            <link linkend="zend.mail"><classname>Zend_Mail</classname></link>-ом.
+        </para>
     </sect2>
 
     <sect2 id="zend.mime.message.instantiation">
-        <title>Инстанцирование<!--Instantiation--></title>
+        <title>Инстанцирование</title>
         <para>
-          Нет явного конструктора для <code>Zend_Mime_Message</code>.
-<!--
-            There is no explicit constructor for <code>Zend_Mime_Message</code>.
--->
+            Нет явного конструктора для <classname>Zend_Mime_Message</classname>.
         </para>
     </sect2>
 
     <sect2 id="zend.mime.message.addparts">
-        <title>Добавление частей MIME<!--Adding MIME Parts--></title>
+        <title>Добавление частей MIME</title>
 
         <para>
-          Объекты <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-          могут быть добавлены в данный объект <code>Zend_Mime_Message</code>
-          посредством вызова <code>-&gt;addPart($part)</code>.
-<!--
-      <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-          Objects can be added to a given <code>Zend_Mime_Message</code> object by calling
-          <code>-&gt;addPart($part)</code>
--->
-    </para>
+            Объекты <link linkend="zend.mime.part"><classname>Zend_Mime_Part</classname></link>
+            могут быть добавлены в конкретный объект
+            <classname>Zend_Mime_Message</classname> путем вызова
+            <code>-&gt;addPart($part)</code>.
+        </para>
 
-    <para>
-      Массив со всеми объектами <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-      в <code>Zend_Mime_Message</code> возвращается методом <code>-&gt;getParts()</code>.
-      Объекты <code>Zend_Mime_Part</code> могут быть изменяться, поскольку
-      хранятся в массиве в виде ссылок. Если в массив были добавлены части или
-      последовательность изменилась, массив нужно вернуть объекту
-      <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-      посредством вызова метода <code>-&gt;setParts($partsArray)</code>.
-<!--
-      An array with all <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-      objects in the <code>Zend_Mime_Message</code> is returned
-          from the method <code>-&gt;getParts()</code>.  The Zend_Mime_Part objects
-          can then be changed since they are stored in the array as references. If
-          parts are added to the array or the sequence is changed, the array needs
-          to be given back to the <link linkend="zend.mime.part"><code>Zend_Mime_Part</code></link>
-          object by calling <code>-&gt;setParts($partsArray)</code>.
--->
-    </para>
+        <para>
+            Массив со всеми объектами частей
+            <link linkend="zend.mime.part"><classname>Zend_Mime_Part</classname></link>
+            в <classname>Zend_Mime_Message</classname> возвращается методом
+            <code>-&gt;getParts()</code>. Через этот массив можно вносить
+            изменения в объекты частей, поскольку они хранятся в
+            виде ссылок. Если в массив были добавлены новые части или
+            последовательность изменилась, то массив нужно заново
+            передать объекту
+            <link linkend="zend.mime.part"><classname>Zend_Mime_Part</classname></link>
+            через вызов метода <code>-&gt;setParts($partsArray)</code>.
+        </para>
 
         <para>
-          Функция <code>-&gt;isMultiPart()</code> вернет <constant>TRUE</constant>, если
-          была зарегистрирована более чем одна часть в объекте <code>Zend_Mime_Message</code>
-          и, следовательно, объект должен сгенерировать сообщение MIME типа multipart.
-<!--
-      The function <code>-&gt;isMultiPart()</code> will return true if
-          more than one part is registered with the <code>Zend_Mime_Message</code> object and thus
-          the object would generate a Multipart-Mime-Message when generating the
-      actual output.
--->
-    </para>
+            Функция <code>-&gt;isMultiPart()</code> вернет
+            <constant>TRUE</constant>, если была зарегистрирована более чем
+            одна часть в объекте <classname>Zend_Mime_Message</classname>
+            и, следовательно, объект должен сгенерировать сообщение MIME multipart.
+        </para>
     </sect2>
 
     <sect2 id="zend.mime.message.bondary">
-        <title>Управление разделителями<!--Boundary handling--></title>
+        <title>Управление разделителями</title>
 
         <para>
-          <code>Zend_Mime_Message</code> обычно создает и использует свой
-          объект <code>Zend_Mime</code> для генерации разделителей.
-      Если нужно самостоятельно установить разделители или изменить поведение
-      объекта <code>Zend_Mime</code>, используемого <code>Zend_Mime_Message</code>,
-      то можно самостоятельно создать экземпляр <code>Zend_Mime</code>
-      и зарегистрировать его в <code>Zend_Mime_Message</code>
-      (но обычно вам не нужно делать это). Метод <code>-&gt;setMime(Zend_Mime
-          $mime)</code> устанавливает специальный экземпляр <code>Zend_Mime</code>,
-          который будет использоваться данным объектом <code>Zend_Mime_Message</code>.
-<!--
-      <code>Zend_Mime_Message</code> usually creates and uses its own
-          <code>Zend_Mime</code> Object to generate a boundary. If you need to
-          define the boundary or want to change the behaviour of the <code>Zend_Mime</code> object
-          used by <code>Zend_Mime_Message</code>, you can instantiate the <code>Zend_Mime</code>
-          object yourself and then register it to <code>Zend_Mime_Message</code>.
-          Usually you will not need to do this. <code>-&gt;setMime(Zend_Mime
-          $mime)</code> sets a special instance of <code>Zend_Mime</code> to be used
-          by this <code>Zend_Mime_Message</code>
--->
-    </para>
+            <classname>Zend_Mime_Message</classname> обычно создает и использует свой
+            объект <classname>Zend_Mime</classname> для генерации разделителей.
+            Если нужно самостоятельно установить разделители или изменить поведение
+            объекта <classname>Zend_Mime</classname>, используемого <classname>Zend_Mime_Message</classname>,
+            то можно самостоятельно создать экземпляр <classname>Zend_Mime</classname>
+            и зарегистрировать его в <classname>Zend_Mime_Message</classname>
+            (но обычно вам не нужно делать это). Метод <code>-&gt;setMime(Zend_Mime
+            $mime)</code> устанавливает специальный экземпляр <code>Zend_Mime</code>,
+            который будет использоваться данным объектом <classname>Zend_Mime_Message</classname>.
+        </para>
 
         <para>
-          <code>-&gt;getMime()</code> возвращает экземпляр класса <code>Zend_Mime</code>,
-      который будет использоваться для формирования сообщения при вызове метода
-      <code>generateMessage()</code>.
-<!--
-      <code>-&gt;getMime()</code> returns the instance of
-          <code>Zend_Mime</code> that will be used to render the message when
-          <code>generateMessage()</code> is called.
--->
-    </para>
+            <code>-&gt;getMime()</code> возвращает экземпляр класса <classname>Zend_Mime</classname>,
+            который будет использоваться для формирования сообщения при вызове метода
+            <methodname>generateMessage()</methodname>.
+        </para>
 
         <para>
-          <code>-&gt;generateMessage()</code> формирует содержимое
-      <code>Zend_Mime_Message</code> в строке.
-<!--
-      <code>-&gt;generateMessage()</code> renders the <code>Zend_Mime_Message</code>
-          content to a string.
--->
-    </para>
+            <code>-&gt;generateMessage()</code> формирует содержимое
+            <classname>Zend_Mime_Message</classname> в строке.
+        </para>
     </sect2>
 
     <sect2 id="zend.mime.message.parse">
-        <title>
-          Разбор строки для создания объекта Zend_Mime_Message (экспериментальная возможность)
-      <!--parsing a string to create a Zend_Mime_Message object (experimental)-->
-    </title>
+        <title>Создание объекта Zend_Mime_Message из строки (экспериментальная возможность)</title>
 
         <para>
-          Данное в виде строки сообщение MIME может использоваться для
-      восстановления объекта <code>Zend_Mime_Message</code> из него.
-      <code>Zend_Mime_Message</code> имеет статический factory метод для
-      разбора этой стоки и возвращения объекта <code>Zend_Mime_Message</code>.
-<!--
-      A given MIME compliant message in string form can be used to
-          reconstruct a <code>Zend_Mime_Message</code> Object from it.
-          <code>Zend_Mime_Message</code> has a static factory Method to parse this
-          String and return a <code>Zend_Mime_Message</code> Object.
--->
-    </para>
+            Если имеется сообщение MIME в виде строки, то оно может
+            использоваться для получения объекта
+            <classname>Zend_Mime_Message</classname>.
+            <classname>Zend_Mime_Message</classname> имеет фабричный метод,
+            который принимает строку и возвращает объект
+            <classname>Zend_Mime_Message</classname>.
+        </para>
 
         <para>
-          <code>Zend_Mime_Message::createFromMessage($str, $boundary)</code>
-          раскодировывает данную строку и возвращает объект <code>Zend_Mime_Message</code>,
-          который затем может быть исследован с помощью <code>-&gt;getParts()</code>.
-<!--
-      <code>Zend_Mime_Message::createFromMessage($str, $boundary)</code>
-          decodes the given string and returns a <code>Zend_Mime_Message</code>
-          Object that can then be examined using <code>-&gt;getParts()</code>
--->
-    </para>
+            <methodname>Zend_Mime_Message::createFromMessage($str, $boundary)</methodname>
+            декодирует переданную строку и возвращает объект
+            <classname>Zend_Mime_Message</classname>,
+            который затем может быть исследован с помощью <code>-&gt;getParts()</code>.
+        </para>
     </sect2>
 </sect1>
 <!--

+ 98 - 116
documentation/manual/ru/module_specs/Zend_Mime_Part.xml

@@ -1,143 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.mime.part">
     <title>Zend_Mime_Part</title>
 
     <sect2 id="zend.mime.part.introduction">
-      <title>Введение</title>
+    <title>Введение</title>
 
-      <para>
-        Этот класс представляет отдельную часть сообщения MIME. он содержит
-        фактическое содержимое части сообщения и информацию об его кодировке,
-        типе содержимого и имени файла оригинала. Он предоставляет методы для
-        генерации строки из сохраненных данных. Объекты <code>Zend_Mime_Part</code>
-        могут быть добавлены в <link
-        linkend="zend.mime.message"><code>Zend_Mime_Message</code></link>
-        для компоновки целого сообщения с типом multipart.
-<!--
-      This class represents a single part of a MIME message. It contains the
-        actual content of the message part plus information about its encoding,
-        content type and original filename. It provides a method for generating a
-        string from the stored data. <code>Zend_Mime_Part</code> objects can be
-        added to <link
-        linkend="zend.mime.message"><code>Zend_Mime_Message</code></link> to
-        assemble a complete multipart message.
--->
-    </para>
+    <para>
+        Класс <classname>Zend_Mime_Part</classname> представляет отдельную
+        часть сообщения <acronym>MIME</acronym>. В объекте такого класса
+        хранится действительное содержимое части сообщения, а также информация
+        об его кодировке, типе содержимого и имени файла оригинала. Также этот
+        класс предоставляет методы для генерации строки из сохраненных данных.
+        Объекты <classname>Zend_Mime_Part</classname> могут быть добавлены в
+        <link linkend="zend.mime.message"><classname>Zend_Mime_Message</classname></link>
+        для получения сообщения multipart.
+        </para>
     </sect2>
 
-  <sect2 id="zend.mime.part.instantiation">
-    <title>Инстанцирование<!--Instantiation--></title>
+    <sect2 id="zend.mime.part.instantiation">
+    <title>Инстанцирование</title>
 
     <para>
-      Экземпляр класса <code>Zend_Mime_Part</code> создается с помощью строки,
-      которая представляет собой содержимое новой части сообщения. Предполагается
-      тип OCTET-STREAM, кодировка 8Bit. После инстанцирования
-      <code>Zend_Mime_Part</code> метаданные могут быть установлены посредством
-      прямого доступа к атрибутам:
-<!--
-      <code>Zend_Mime_Part</code> is instantiated with a string that
-      represents the content of the new part. The type is assumed to be
-      OCTET-STREAM, encoding is 8Bit. After instantiating a
-      <code>Zend_Mime_Part</code>, meta information can be set by accessing its
-      attributes directly:
--->
+        Экземпляр класса <classname>Zend_Mime_Part</classname> создается с
+        передачей строки, которая представляет собой содержимое новой части
+        сообщения. По умолчанию используются тип OCTET-STREAM и кодировка 8Bit.
+        После инстанцирования <classname>Zend_Mime_Part</classname> метаданные
+        могут быть установлены путем прямого доступа к атрибутам:
     </para>
 
-    <programlisting language="php"><![CDATA[<?php
-public $type = ZMime::TYPE_OCTETSTREAM;
-public $encoding = ZMime::ENCODING_8BIT;
+    <programlisting language="php"><![CDATA[
+public $type = Zend_Mime::TYPE_OCTETSTREAM;
+public $encoding = Zend_Mime::ENCODING_8BIT;
 public $id;
 public $disposition;
 public $filename;
 public $description;
 public $charset;
-?>]]></programlisting>
+public $boundary;
+public $location;
+public $language;
+]]></programlisting>
     </sect2>
 
-  <sect2 id="zend.mime.part.methods">
-    <title>
-      Методы для перевода части сообщения в строку
-      <!--Methods for rendering the message part to a string-->
-    </title>
+    <sect2 id="zend.mime.part.methods">
+        <title>Методы для рендеринга строк из объекта части сообщения</title>
 
-    <para>
-      <code>-&gt;getContent()</code> возвращает закодированное содержимое части
-      сообщения MIME в виде строки с применением кодировки, указанной в атрибуте
-      $encoding. Корректными значениями являются ZMime::ENCODING_*. Преобразование
-      по таблице символов не производится.
-<!--
-      <code>-&gt;getContent()</code> returns the encoded content of the
-      MimePart as a string using the encoding specified in the attribute
-      $encoding. Valid values are ZMime::ENCODING_* Characterset conversions are
-      not performed.
--->
-    </para>
+        <para>
+            <methodname>getContent()</methodname> возвращает содержимое части
+            сообщения, закодированное с применением кодировки, указанной в
+            атрибуте $encoding. Корректными значениями являются
+            ZMime::ENCODING_*. Преобразования по таблице символов не
+            производятся.
+        </para>
 
-    <para>
-      <code>-&gt;getHeaders()</code> возвращает заголовки MIME для части сообщения
-       такими, какими они были сгенерированы из информации в открытых
-       атрибутах. Нужно правильно установить атрибуты объекта, прежде чем
-       будет вызван метод.
-<!--
-      <code>-&gt;getHeaders()</code> returns the Mime-Headers for the
-      MimePart as generated from the information in the publicly accessable
-      attributes. The attributes of the object need to be set correctly before
-      this method is called.
--->
-      <itemizedlist>
-        <listitem>
-            <para>
-                <varname>$charset</varname>
-                должен соответствовать текущему набору символов содержимого, если это
-                содержимое имеет текстовый тип (простой текст или HTML).
-<!--
-                has to be set to the actual charset of the content if it is a text type (Text or HTML).
--->
-            </para>
-        </listitem>
+        <para>
+            <methodname>getHeaders()</methodname> возвращает MIME-заголовки для
+            части сообщения, они генерируются с учетом значений, установленных
+            в открытых свойствах. Необходимо правильно установить свойства
+            объекта до того, как будет вызван метод.
 
-        <listitem>
-            <para>
-                <varname>$id</varname>
-                может быть установлен для идентификации содержимого для включенных
-                изображений в сообщении HTML.
-<!--
-                may be set to identify a content-id for inline images in a HTML mail.
--->
-            </para>
-        </listitem>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <varname>$charset</varname>
+                        должен соответствовать используемому в содержимом набору
+                        символов, если это содержимое имеет текстовый тип (простой
+                        текст или HTML).
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <varname>$id</varname>
+                        устанавливается в качестве идентификатора
+                        включенных изображений в сообщении HTML.
+                    </para>
+                </listitem>
 
-        <listitem>
-            <para>
-                <varname>$filename</varname>
-                содержит имя файла, которое будет получено при загрузке.
-<!--
-                contains the name the file will get when downloading it.
--->
-            </para>
-        </listitem>
+                <listitem>
+                    <para>
+                        <varname>$filename</varname>
+                        содержит имя, которое должно присваиваться файлу после
+                        загрузки.
+                    </para>
+                </listitem>
 
-        <listitem>
-            <para>
-                <varname>$disposition</varname>
-                определяет, должен ли фал быть приложен в качестве вложения или
-                использоваться внутри сообщения HTML.
-<!--
-                defines if the file should be treated as an attachment or if it is used inside the (HTML-) mail (inline).
--->
-            </para>
-        </listitem>
+                <listitem>
+                    <para>
+                        <varname>$disposition</varname>
+                        определяет, должен ли файл обрабатываться как вложение
+                        или использоваться внутри сообщения.
+                    </para>
+                </listitem>
 
-        <listitem>
-            <para>
-                <varname>$description</varname>
-                используется только для информационных целей.
-<!--
-                is only used for informational purposes.
--->
-            </para>
-        </listitem>
-      </itemizedlist></para>
-  </sect2>
+                <listitem>
+                    <para>
+                        <varname>$description</varname>
+                        используется только для информационных целей.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <varname>$boundary</varname>
+                        используется как граница MIME.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <varname>$location</varname>
+                        содержит <acronym>URI</acronym> ресурса.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <varname>$language</varname>
+                        определяет язык содержимого.
+                    </para>
+                </listitem>
+            </itemizedlist>
+        </para>
+    </sect2>
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 202 - 47
documentation/manual/ru/module_specs/Zend_Paginator-Advanced.xml

@@ -1,19 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.paginator.advanced">
-    <title>Продвинутое использование</title>
+    <title>Расширенное использование</title>
 
     <sect2 id="zend.paginator.advanced.adapters">
         <title>Создание собственных адаптеров к источникам данных</title>
 
         <para>
-            Вы можете столкнуться с таким типом данных, для которого
-            не предусмотрено адаптера. В этом случае нужно создать
-            собственный адаптер.
+            Вы можете столкнуться с таким типом источника данных, для которого
+            в Zend Framework-е не предусмотрено адаптера. В этом случае
+            нужно создать собственный адаптер.
         </para>
 
         <para>
             Для этого нужно реализовать интерфейс
-            <code>Zend_Paginator_Adapter_Interface</code>. Он включает в себя
-            два метода:
+            <classname>Zend_Paginator_Adapter_Interface</classname>. Он включает
+            в себя два метода:
         </para>
 
         <itemizedlist>
@@ -28,34 +30,39 @@
         <para>
             Кроме того, нужно реализовать конструктор, который принимает
             источник данных в качестве параметра и сохраняет его в
-            защищенном или закрытом свойстве. Как его обрабатывать - решать вам.
+            защищенном или закрытом свойстве. Как его обрабатывать -
+            зависит от вас.
         </para>
 
         <para>
             Если вы когда-либо использовали SPL-интерфейс
-            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html"><code>Countable</code></ulink>,
-            то знаете, для чего используется метод <code>count()</code>. В
-            <code>Zend_Paginator</code> он возвращает общее количество
+            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceCountable.html"><classname>Countable</classname></ulink>,
+            то вам должно быть известно о назначении метода
+            <methodname>count()</methodname>. В
+            <classname>Zend_Paginator</classname> он возвращает общее количество
             элементов в наборе данных.
+            Кроме того, объект <classname>Zend_Paginator</classname>
+            предоставляет метод <methodname>countAllItems()</methodname>
+            который служит посредником к методу адаптера
+            <methodname>count()</methodname>.
         </para>
 
         <para>
-            Метод <code>getItems()</code> ненамного сложнее. Он должен принимать
-            смещение и количество элементов на странице и возвращать
-            соответствующий кусок данных. В случае массива он мог бы выглядеть
-            следующим образом:
+            Метод <methodname>getItems()</methodname> ненамного сложнее.
+            Он должен принимать смещение и количество элементов на странице
+            и возвращать соответствующий кусок данных. В случае массива он
+            мог бы выглядеть следующим образом:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[return array_slice($this->_array, $offset, $itemCountPerPage);]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+return array_slice($this->_array, $offset, $itemCountPerPage);
+]]></programlisting>
 
         <para>
-            Посмотрите, как реализованы адаптеры, входящие в поставку
+            Посмотрите исходники адаптеров, входящих в поставку
             Zend Framework (все они реализуют
-            <code>Zend_Paginator_Adapter_Interface</code>), чтобы понять, как
-            реализовать свой адаптер.
+            <classname>Zend_Paginator_Adapter_Interface</classname>), чтобы
+            получить представление о том, как можно реализовать свой адаптер.
         </para>
     </sect2>
 
@@ -63,19 +70,18 @@
         <title>Создание своих стилей прокрутки</title>
 
         <para>
-            При создании своего стиля прокрутки требуется, чтобы он
-            реализовывал интерфейс
-            <code>Zend_Paginator_ScrollingStyle_Interface</code>, который
-            определяет единственный метод, <code>getPages()</code>:
+            При создании своего стиля прокрутки реализуйте интерфейс
+            <classname>Zend_Paginator_ScrollingStyle_Interface</classname>,
+            который определяет единственный метод,
+            <methodname>getPages()</methodname>:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[public function getPages(Zend_Paginator $paginator, $pageRange = null);]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+public function getPages(Zend_Paginator $paginator, $pageRange = null);
+]]></programlisting>
 
         <para>
-            Этот метод должен вычислять верхний и нижний пределы номеров
+            Этот метод должен определять номера пограничных
             страниц в ряде так называемых "локальных" страниц (т.е. страниц,
             которые находятся рядом с текущей страницей).
         </para>
@@ -83,39 +89,188 @@
         <para>
             Если только ваш стиль прокрутки не наследует от уже существующего
             (для примера смотрите
-            <code>Zend_Paginator_ScrollingStyle_Elastic</code>), то этот метод
-            должен заканчиваться чем-то вроде следующего кода:
+            <classname>Zend_Paginator_ScrollingStyle_Elastic</classname>), то
+            этот метод должен иметь в конце что-то вроде следующего:
         </para>
 
+        <programlisting language="php"><![CDATA[
+return $paginator->getPagesInRange($lowerBound, $upperBound);
+]]></programlisting>
+
         <para>
-            <programlisting language="php"><![CDATA[return $paginator->getPagesInRange($lowerBound, $upperBound);]]>
-            </programlisting>
+            Этим вызовом не делается ничего особенного. Этот метод просто
+            для удобства - он проверяет на корректность верхний и нижний
+            пределы и возвращает массив номеров страниц для постраничной
+            навигации.
         </para>
 
         <para>
-            Этим вызовом не делается ничего специального, данный метод просто
-            для удобства. Он проверяет на корректность верхний и нижний пределы
-            и возвращает массив номеров страниц для постраничной навигации.
+            Для того, чтобы использовать новый стиль прокрутки,
+            следует указать <classname>Zend_Paginator</classname>-у, в какой
+            директории этот стиль находится. Для этого сделайте следующее:
         </para>
 
+        <programlisting language="php"><![CDATA[
+$prefix = 'My_Paginator_ScrollingStyle';
+$path   = 'My/Paginator/ScrollingStyle/';
+Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.paginator.advanced.caching">
+        <title>Возможности кэширования</title>
+
         <para>
-            Для того, чтобы использовать новый стиль прокрутки,
-            следует указать <code>Zend_Paginator</code>-у, в какой директории
-            он находится. Для этого сделайте следующее:
+            Можно указать <classname>Zend_Paginator</classname>-у, чтобы он
+            кэшировал получаемые данные, чтобы они не извлекались через
+            адаптер всякий раз, когда будет в них нужда.
+            Для этого просто передайте его методу
+            <methodname>setCache()</methodname> экземпляр
+            <classname>Zend_Cache_Core</classname>.
         </para>
 
         <para>
-            <programlisting language="php"><![CDATA[// Префикс нового класса стиля прокрутки
-$prefix = 'My_Paginator_ScrollingStyle';
+            <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($someData);
+$fO = array('lifetime' => 3600, 'automatic_serialization' => true);
+$bO = array('cache_dir'=>'/tmp');
+$cache = Zend_cache::factory('Core', 'File', $fO, $bO);
+Zend_Paginator::setCache($cache);
+]]></programlisting>
+        </para>
 
-// Путь к новому стилю прокрутки
-$path   = 'My/Paginator/ScrollingStyle/';
+        <para>
+            После того, как <classname>Zend_Paginator</classname> получит
+            экземпляр <classname>Zend_Cache_Core</classname>, все данные будут
+            кэшироваться. Иногда возникает необходимость отключать кэширование
+            данных даже после того, как вы передали эекземпляр
+            <classname>Zend_Cache_Core</classname>. Для этого вы можете
+            использовать метод <methodname>setCacheEnable()</methodname>.
+        </para>
 
-// Установка префикса и пути для нового стиля прокрутки
-Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);]]>
-            </programlisting>
+        <para>
+            <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($someData);
+// $cache является экземпляром
+Zend_Paginator::setCache($cache);
+// ... ниже в коде
+$paginator->setCacheEnable(false);
+// теперь кэширование отключено
+]]></programlisting>
+        </para>
+
+        <para>
+            После того, как был установлен объект для кэширования, данные будут
+            сохраняться и извлекаться через него. Иногда бывает нужно очищать
+            кэш вручную.
+            Вы можете делать это через вызов метода
+            <methodname>clearPageItemCache($pageNumber)</methodname>.
+            В качестве аргумента метод принимает номер страницы, кэш
+            которой следует очистить.
+            Если вызов производится без передачи параметра, то весь кэш будет
+            очищен:
+        </para>
+
+        <para>
+            <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($someData);
+Zend_Paginator::setCache($cache);
+$items = $paginator->getCurrentItems();
+// теперь страница 1 в кэше
+$page3Items = $paginator->getItemsByPage(3);
+// теперь и страница 3 в кэше
+
+// очищение кэша результатов для страницы 3
+$paginator->clearPageItemCache(3);
+
+// очищение всего кэша
+$paginator->clearPageItemCache();
+]]></programlisting>
+        </para>
+
+        <para>
+            Изменение количества элементов на странице приведет к очищению
+            всего кэша, поскольку после этого он должен потерять актуальность:
+        </para>
+
+        <para>
+            <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($someData);
+Zend_Paginator::setCache($cache);
+// извлечение некоторых элементов
+$items = $paginator->getCurrentItems();
+
+// весь кэш будет очищен:
+$paginator->setItemCountPerPage(2);
+]]></programlisting>
+        </para>
+
+        <para>
+            Можно также видеть данные в кэше и запрашивать их напрямую.
+            Для этого может использоваться
+            метод <methodname>getPageItemCache()</methodname>:
+        </para>
+
+        <para>
+            <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($someData);
+$paginator->setItemCountPerPage(3);
+Zend_Paginator::setCache($cache);
+
+// извлечение некоторых элементов
+$items = $paginator->getCurrentItems();
+$otherItems = $paginator->getItemsPerPage(4);
+
+// просмотр сохраненных в кэше элементов в виде двухмерного массива:
+var_dump($paginator->getPageItemCache());
+]]></programlisting>
         </para>
     </sect2>
+
+    <sect2 id="zend.paginator.advanced.aggregator">
+        <title>Интерфейс Zend_Paginator_AdapterAggregate</title>
+
+        <para>
+            В зависимости от разрабатываемого приложения может возникнуть
+            потребность разбивать на страницы объекты, у которых внутренняя
+            структура данных эквивалентна существующим адаптерам,
+            но при этом вы не хотите нарушать инкапсуляцию для
+            того, что предоставлять доступ к этим данным.
+            В других случаях объект может участвовать в связи
+            "имеет-адаптер" вместо связи "является-адаптером", которую
+            предлагает <classname>Zend_Paginator_Adapter_Abstract</classname>.
+            В этих случаях вы можете использовать интерфейс
+            <classname>Zend_Paginator_AdapterAggregate</classname>,
+            который по поведению значительно похож на интерфейс
+            <classname>IteratorAggregate</classname> из расширения SPL.
+        </para>
+
+        <para>
+            <programlisting language="php"><![CDATA[
+interface Zend_Paginator_AdapterAggregate
+{
+    /**
+     * Возвращайте из этого метода полностью сконфигурированный адаптер.
+     *
+     * @return Zend_Paginator_Adapter_Abstract
+     */
+    public function getPaginatorAdapter();
+}
+]]></programlisting>
+        </para>
+
+        <para>
+            Как видно из кода, интерфейс довольно небольшой и от вас ожидается
+            только возврат экземпляра
+            <classname>Zend_Paginator_Adapter_Abstract</classname>.
+            Фабричный метод
+            <methodname>Zend_Paginator::factory</methodname> и конструктор
+            класса <classname>Zend_Paginator</classname> после этого распознают
+            экземпляр <classname>Zend_Paginator_AdapterAggregate</classname>
+            и обрабатывают его должным образом.
+        </para>
+    </sect2>
+
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 7 - 4
documentation/manual/ru/module_specs/Zend_Paginator-Configuration.xml

@@ -1,12 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.paginator.configuration">
     <title>Конфигурация</title>
 
     <para>
-        <code>Zend_Paginator</code> имеет несколько методов для настройки:
+        <classname>Zend_Paginator</classname> имеет несколько методов для
+        настройки:
     </para>
 
     <table id="zend.paginator.configuration.table">
-        <title>Методы для настройки <code>Zend_Paginator</code></title>
+        <title>Методы для настройки Zend_Paginator</title>
 
         <tgroup cols="2">
             <thead>
@@ -38,13 +41,13 @@
                         Как правило, этого значения придерживаются
                         в точности, но некоторые стили прокрутки могут
                         использовать его только как ориентировочное или
-                        стартовое значение (например, стиль "Elastic")
+                        стартовое значение (например, стиль Elastic)
                     </entry>
                 </row>
                 <row>
                     <entry>setView</entry>
                     <entry>
-                        Устанавливает экземпляр вида для удобства визуализации.
+                        Устанавливает экземпляр вида для удобства рендеринга.
                     </entry>
                 </row>
             </tbody>

+ 10 - 6
documentation/manual/ru/module_specs/Zend_Paginator-Introduction.xml

@@ -1,13 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.paginator.introduction">
     <title>Введение</title>
 
     <para>
-        <code>Zend_Paginator</code> - гибкая компонента для разбиения на
-        страницы наборов данных и представления их пользователям.
+        <classname>Zend_Paginator</classname> - гибкая компонента для разбиения
+        наборов данных на страницы и их последующего отображения пользователю.
     </para>
 
     <para>
-        Основные цели, преследуемые при разработке данной компоненты:
+        Основные цели, преследовавшиеся при разработке данной компоненты:
 
         <itemizedlist>
             <listitem>
@@ -25,15 +27,17 @@
                 <para>
                     Не заставлять пользователя придерживаться одного
                     способа отображения данных или визуализации постраничной
-                    навигации.
+                    навигации
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    Нежесткая связь <code>Zend_Paginator</code> с другими
+                    Отсутствие жесткой связи
+                    <classname>Zend_Paginator</classname> с другими
                     компонентами Zend Framework-а для того, чтобы пользователи
                     могли при желании использовать эту компоненту без
-                    <code>Zend_View</code>, <code>Zend_Db</code> и т.д.
+                    <classname>Zend_View</classname>,
+                    <classname>Zend_Db</classname> и т.д.
                 </para>
             </listitem>
         </itemizedlist>

+ 275 - 115
documentation/manual/ru/module_specs/Zend_Paginator-Usage.xml

@@ -1,3 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.paginator.usage">
     <title>Использование</title>
 
@@ -5,15 +7,15 @@
         <title>Разбиение наборов данных на страницы </title>
 
         <para>
-            Для разбиения элементов данных на страницы
-            <code>Zend_Paginator</code> должен иметь обобщенный доступ к этим
-            данным. Поэтому доступ к данным осуществляется через адаптеры к
-            источникам данных. В поставку Zend Framework входят несколько
-            адаптеров:
+            Для разбиения наборов данных на страницы
+            <classname>Zend_Paginator</classname> должен иметь обобщенный
+            доступ к этим данным. Поэтому доступ к данным осуществляется
+            через адаптеры к источникам данных. В поставку Zend Framework
+            по умолчанию входят несколько адаптеров:
         </para>
 
         <table id="zend.paginator.usage.paginating.adapters">
-            <title>Адаптеры для <code>Zend_Paginator</code></title>
+            <title>Адаптеры для Zend_Paginator</title>
 
             <tgroup cols="2">
                 <thead>
@@ -30,22 +32,35 @@
                     <row>
                         <entry>DbSelect</entry>
                         <entry>
-                            Использует экземпляр
-                            <link linkend="zend.db.select"><code>Zend_Db_Select</code></link>
+                            Использует экземпляр <link
+                                linkend="zend.db.select"><classname>Zend_Db_Select</classname></link>,
+                            который будет возвращать массив
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>DbTableSelect</entry>
+                        <entry>
+                            Использует экземпляр <link
+                                linkend="zend.db.table.fetch-all"><classname>Zend_Db_Table_Select</classname></link>,
+                            который будет возвращать объект
+                            <classname>Zend_Db_Table_Rowset_Abstract</classname>.
+                            Это дает возможность получить такую дополнительную
+                            информацию, как, например, имена столбцов.
                         </entry>
                     </row>
                     <row>
                         <entry>Iterator</entry>
                         <entry>
                             Использует экземпляр
-                            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIterator.html"><code>Iterator</code></ulink>
+                            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIterator.html"><classname>Iterator</classname></ulink>
                         </entry>
                     </row>
                     <row>
                         <entry>Null</entry>
                         <entry>
-                            Не использовать <code>Zend_Paginator</code>
-                            для разбиения на страницы.
+                            Не использовать
+                            <classname>Zend_Paginator</classname> для разбиения
+                            на страницы.
                             Но и в этом случае вы можете воспользоваться
                             возможностями постраничной навигации.
                         </entry>
@@ -54,75 +69,92 @@
             </tgroup>
         </table>
 
-        <para>
-            При создании экземпляра класса <code>Zend_Paginator</code>, следует
-            передать адаптер его конструктору:
-        </para>
+        <note>
+            <para>
+                Вместо извлечения всех строк, соответствующих данному
+                запросу, адаптеры DbSelect and DbTableSelect извлекают
+                только тот объем данных, который необходим для отображения
+                текущей страницы.
+            </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_array($array));]]>
-            </programlisting>
-        </para>
+            <para>
+                Поэтому для определения общего количества соответствующих
+                запросу строк динамически генерируется второй запрос.
+                Но вы можете сами предоставить
+                адаптеру количество строк либо запрос для его определения.
+                См. метод <methodname>setRowCount()</methodname>
+                в адаптере DbSelect для получения более подробной информации.
+            </para>
+        </note>
 
         <para>
-            Для удобства вы можете воспользоваться статическим методом
-            <code>factory()</code> для адаптеров, входящих в поставку Zend
-            Framework:
+            При создании экземпляра класса
+            <classname>Zend_Paginator</classname> следует передавать адаптер его
+            конструктору:
         </para>
 
+        <programlisting language="php"><![CDATA[
+$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
+]]></programlisting>
+
         <para>
-            <programlisting language="php"><![CDATA[$paginator = Zend_Paginator::factory($array);]]>
-            </programlisting>
+            Для удобства вы можете воспользоваться фабричным методом
+            <methodname>factory()</methodname> для получения адаптеров,
+            входящих в поставку Zend Framework:
         </para>
 
+        <programlisting language="php"><![CDATA[
+$paginator = Zend_Paginator::factory($array);
+]]></programlisting>
+
         <note>
-            <para>В случае использования адаптера Null вы должны передавать
-            его конструктору количество элементов вместо набора данных.</para>
+            <para>
+                В случае использования адаптера Null вы должны передавать
+                его конструктору количество элементов вместо набора данных.
+            </para>
         </note>
 
         <para>
-            Несмотря на то, что экземпляр технически можно
-            использовать и в таком состоянии, вы должны
-            будете указывать, какой номер страницы запросил пользователь,
-            чтобы он мог просматривать данные:
+            Несмотря на то, что на этом этапе экземпляр формально уже пригоден к
+            использованию, на практике вы должны будете еще
+            передавать номер страницы, запрошенный пользователем, чтобы он мог
+            просматривать данные:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[$paginator->setCurrentPageNumber($pageNumber);]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+$paginator->setCurrentPageNumber($page);
+]]></programlisting>
 
         <para>
             Наиболее простым способом отслеживания номера страницы является
-            использование URL. Мы рекомендуем использовать для этого
-            совместимый с <code>Zend_Controller_Router_Interface</code>
-            маршрутизатор, но это не обязательно.
+            использование <acronym>URL</acronym>. Мы рекомендуем использовать
+            для этого совместимый с
+            <classname>Zend_Controller_Router_Interface</classname>
+            маршрутизатор, но это не является обязательным требованием.
         </para>
 
         <para>
             Ниже приведен пример маршрута, который можно использовать в
-            конфигурационном файле INI:
+            конфигурационном файле <acronym>INI</acronym>:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[routes.example.route = articles/:articleName/:pageNumber
+        <programlisting language="php"><![CDATA[
+routes.example.route = articles/:articleName/:page
 routes.example.defaults.controller = articles
 routes.example.defaults.action = view
-routes.example.defaults.pageNumber = 1
+routes.example.defaults.page = 1
 routes.example.reqs.articleName = \w+
-routes.example.reqs.pageNumber = \d+]]>
-            </programlisting>
-        </para>
+routes.example.reqs.page = \d+
+]]></programlisting>
 
         <para>
-            Используя этот маршрут и компоненты MVC Zend Framework-а,
+            Используя этот маршрут и MVC-компоненты Zend Framework-а,
             вы можете устанавливать номер текущей страницы следующим образом:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[$paginator->setCurrentPageNumber($this->_getParam('pageNumber'));]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+$paginator->setCurrentPageNumber($this->_getParam('page'));
+]]></programlisting>
 
         <para>
             Есть также другие опции, о них читайте в разделе
@@ -131,59 +163,127 @@ routes.example.reqs.pageNumber = \d+]]>
 
         <para>
             После этого нужно присвоить экземпляр
-            <code>Zend_Paginator</code> переменной вида. Если используется
-            <code>Zend_View</code> с помощником действий ViewRenderer, то
-            для этого подходит следующий код:
+            <classname>Zend_Paginator</classname> переменной вида. Если
+            используется <classname>Zend_View</classname> с помощником
+            действий ViewRenderer, то для этого подходит следующий код:
         </para>
 
+        <programlisting language="php"><![CDATA[
+$this->view->paginator = $paginator;
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.paginator.usage.dbselect">
+        <title>Адаптеры DbSelect и DbTableSelect</title>
         <para>
-            <programlisting language="php"><![CDATA[$this->view->paginator = $paginator;]]>
-            </programlisting>
+            Хотя большинство адаптеров довольно просто в использовании, адаптеры
+            баз данных требуют дополнительных пояснений насчет извлечения
+            данных и подсчета количества строк.
+        </para>
+
+        <para>
+            При использовании адаптеры DbSelect и DbTableSelect
+            нет необходимости самостоятельно извлекать данные. Оба адаптера
+            сами выполняют извлечение данных и подсчет общего количества
+            страниц. Если полученные результаты выборки требуют дополнительной
+            обработки, то адаптер может быть расширен с переопределением
+            метода <methodname>getItems()</methodname>.
+        </para>
+
+        <para>
+            Эти адаптеры
+            <emphasis>не</emphasis> извлекают все записи из базы данных для
+            того, чтобы посчитать их. Вместо этого адаптеры используют
+            исходный запрос для получения соответствующего COUNT-запроса,
+            этот запрос выполняется для получения общего количества строк.
+            Таким образом, производится еще один дополнительный запрос к базе
+            данных, но это во много раз быстрее, чем извлечение всего результата
+            и использование <methodname>count()</methodname>, особенно в случае
+            больших объемов данных.
+        </para>
+
+        <para>
+            Адаптеры баз данных будут пытаться строить наиболее эффективный
+            запрос, который будет выполняться практически на всех современных
+            СУРБД. Но в зависимости от используемой базы данных или даже
+            выбранной структуры могут быть более эффективные пути получения
+            количества строк.
+            На этот случай адаптеры баз данных дают возможность
+            устанавливать свой COUNT-запрос.
+            Например, если вы фиксируете количество постов в блоге в отдельной
+            таблице, то можете достичь более быстрого получения их
+            количества, написав следующий код:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$adapter = new Zend_Paginator_Adapter_DbSelect($db->select()->from('posts'));
+$adapter->setRowCount(
+    $db->select()
+       ->from(
+            'item_counts',
+            array(
+               Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
+            )
+         )
+);
+
+$paginator = new Zend_Paginator($adapter);
+]]></programlisting>
+
+        <para>
+            Этот подход может не дать большого выигрыша в производительности
+            в случае небольшого объема данных или простых запросов на
+            извлечение.
+            Однако в случае сложных запросов и больших объемов данных
+            подобный подход может дать значительный выигрыш
+            в производительности.
         </para>
     </sect2>
 
     <sect2 id="zend.paginator.rendering">
-        <title>Визуализация страниц через скрипты видов</title>
+        <title>Рендеринг страниц через скрипты видов</title>
 
         <para>
             Для визуализации элементов страницы (если
-            вы используете для этого <code>Zend_Paginator</code>)
+            вы используете для этого <classname>Zend_Paginator</classname>)
             и отображения постраничной навигации используется скрипт вида.
         </para>
 
         <para>
-            Поскольку <code>Zend_Paginator</code> реализует SPL-интерфейс
-            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html"><code>IteratorAggregate</code></ulink>,
-            то обход элементов и их отображение производится просто.
+            Поскольку <classname>Zend_Paginator</classname> реализует
+            SPL-интерфейс
+            <ulink url="http://www.php.net/~helly/php/ext/spl/interfaceIteratorAggregate.html"><classname>IteratorAggregate</classname></ulink>,
+            то обход элементов и их отображение производится элементарно.
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[<html>
+        <programlisting language="php"><![CDATA[
+<html>
 <body>
 <h1>Example</h1>
 <?php if (count($this->paginator)): ?>
 <ul>
 <?php foreach ($this->paginator as $item): ?>
-  <li><?= $item; ?></li>
+  <li><?php echo $item; ?></li>
 <?php endforeach; ?>
 </ul>
 <?php endif; ?>
 
-<?= $this->paginationControl($this->paginator, 'Sliding', 'my_pagination_control.phtml'); ?>
+<?php echo $this->paginationControl($this->paginator,
+                                    'Sliding',
+                                    'my_pagination_control.phtml'); ?>
 </body>
-</html>]]>
-            </programlisting>
-        </para>
+</html>
+]]></programlisting>
 
         <para>
             Обратите внимание, что в конце вызывается помощник вида.
-            <code>PaginationControl</code> принимает экземпляр
-            <code>Zend_Paginator</code>, стиль прокрутки и скрипт вида.
-            Последние два аргумента являются необязательными.
+            PaginationControl принимает экземпляр
+            <classname>Zend_Paginator</classname>, стиль прокрутки, скрипт
+            вида и массив дополнительных параметров.
         </para>
 
         <para>
-            Но несмотря на это, они очень важны. В то время как скрипт вида
+            Второй и третий параметры очень важны. В то время как скрипт вида
             используется для определения <emphasis>внешнего вида</emphasis>
             постраничной навигации, стиль прокрутки определяет ее
             <emphasis>поведение</emphasis>.
@@ -199,7 +299,7 @@ routes.example.reqs.pageNumber = \d+]]>
 
         <para>
             Что должно происходить, если пользователь нажимает на ссылку "next"
-            несколько раз? Правильно, тут может быть сколько угодно
+            несколько раз? Действительно, тут может быть сколько угодно
             вариантов. Номер текущей страницы может оставаться в середине
             (как это реализовано, например, в Yahoo!) или перемещаться к концу
             ряда при каждом нажатии "next" и затем показываться снова с другого
@@ -213,7 +313,7 @@ routes.example.reqs.pageNumber = \d+]]>
         </para>
 
         <table id="zend.paginator.usage.rendering.scrolling-styles">
-            <title>Стили прокрутки для <code>Zend_Paginator</code></title>
+            <title>Стили прокрутки для Zend_Paginator</title>
 
             <tgroup cols="2">
                 <thead>
@@ -264,49 +364,84 @@ routes.example.reqs.pageNumber = \d+]]>
         </table>
 
         <para>
+            Четвертый и последний параметр предназначается для ассоциативного
+            массива дополнительных переменных, которые должны быть доступны в
+            вашем скрипте вида (через <varname>$this</varname>).
+            Например, эти значения могут включать в себя дополнительные
+            параметры <acronym>URL</acronym> для подстановки в ссылки
+            постраничной навигации.
+        </para>
+
+        <para>
             Установив используемые по умолчанию скрипт вида, стиль прокрутки и
             экземпляр вида, вы можете полностью исключить вызовы
             PaginationControl:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[Zend_Paginator::setDefaultScrollingStyle('Sliding');
-Zend_View_Helper_PaginationControl::setDefaultViewPartial('my_pagination_control.phtml');
-$paginator->setView($view);]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+Zend_Paginator::setDefaultScrollingStyle('Sliding');
+Zend_View_Helper_PaginationControl::setDefaultViewPartial(
+    'my_pagination_control.phtml'
+);
+$paginator->setView($view);
+]]></programlisting>
 
         <para>
             Если все эти значения установлены, то вы можете вывести
             постраничную навигацию в своем скрипте вида с помощью обычной
-            конструкции <code>echo</code>:
+            конструкции echo:
         </para>
 
-        <para>
-            <programlisting language="php"><![CDATA[<?= $this->paginator; ?>]]>
-            </programlisting>
-        </para>
+        <programlisting language="php"><![CDATA[
+<?php echo $this->paginator; ?>
+]]></programlisting>
+
+        <note>
+            <para>
+                Разумеется, можно использовать
+                <classname>Zend_Paginator</classname> с другими
+                шаблонизаторами. Например, со Smarty вы можете делать
+                следующее:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$smarty->assign('pages', $paginator->getPages());
+]]></programlisting>
+
+            <para>
+                Вы можете затем обращаться к установленным значениям из
+                шаблона, как в коде ниже:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+{$pages->pageCount}
+]]></programlisting>
+        </note>
 
         <sect3 id="zend.paginator.usage.rendering.example-controls">
             <title>Примеры постраничной навигации</title>
 
             <para>
-                Надеемся, следующие примеры помогут вам с созданием постраничной
-                навигации:
+                Надеемся, следующие примеры помогут начать работать с
+                <classname>Zend_Paginator</classname>:
             </para>
 
             <para>
-                Постраничная навигация для результатов поиска
+                Постраничная навигация для результатов поиска:
+            </para>
 
-                <programlisting language="php"><![CDATA[<!--
+            <programlisting language="php"><![CDATA[
+<!--
 См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
 -->
 
 <?php if ($this->pageCount): ?>
-<div id="paginationControl">
+<div class="paginationControl">
 <!-- Ссылка на предыдущую страницу -->
 <?php if (isset($this->previous)): ?>
-  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
+  <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
+    &lt; Previous
+  </a> |
 <?php else: ?>
   <span class="disabled">&lt; Previous</span> |
 <?php endif; ?>
@@ -314,89 +449,106 @@ $paginator->setView($view);]]>
 <!-- Нумерованные ссылки на страницы -->
 <?php foreach ($this->pagesInRange as $page): ?>
   <?php if ($page != $this->current): ?>
-    <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> |
+    <a href="<?php echo $this->url(array('page' => $page)); ?>">
+        <?php echo $page; ?>
+    </a> |
   <?php else: ?>
-    <?= $page; ?> |
+    <?php echo $page; ?> |
   <?php endif; ?>
 <?php endforeach; ?>
 
 <!-- Ссылка на следующую страницу -->
 <?php if (isset($this->next)): ?>
-  <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
+  <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
+    Next &gt;
+  </a>
 <?php else: ?>
   <span class="disabled">Next &gt;</span>
 <?php endif; ?>
 </div>
-<?php endif; ?>]]>
-                </programlisting>
-            </para>
+<?php endif; ?>
+]]></programlisting>
 
             <para>
-                Постраничная навигация для элементов
+                Постраничная навигация для элементов:
+            </para>
 
-                <programlisting language="php"><![CDATA[<!--
+            <programlisting language="php"><![CDATA[
+<!--
 См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
 -->
 
 <?php if ($this->pageCount): ?>
-<div id="paginationControl">
-<?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
-of <?= $this->totalItemCount; ?>
+<div class="paginationControl">
+<?php echo $this->firstItemNumber; ?> - <?php echo $this->lastItemNumber; ?>
+of <?php echo $this->totalItemCount; ?>
 
 <!-- Ссылка на первую страницу -->
 <?php if (isset($this->previous)): ?>
-  <a href="<?= $this->url(array('page' => $this->first)); ?>">First</a> |
+  <a href="<?php echo $this->url(array('page' => $this->first)); ?>">
+    First
+  </a> |
 <?php else: ?>
   <span class="disabled">First</span> |
 <?php endif; ?>
 
 <!-- Ссылка на предыдущую страницу -->
 <?php if (isset($this->previous)): ?>
-  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> |
+  <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
+    &lt; Previous
+  </a> |
 <?php else: ?>
   <span class="disabled">&lt; Previous</span> |
 <?php endif; ?>
 
 <!-- Ссылка на следующую страницу -->
 <?php if (isset($this->next)): ?>
-  <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a> |
+  <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
+    Next &gt;
+  </a> |
 <?php else: ?>
   <span class="disabled">Next &gt;</span> |
 <?php endif; ?>
 
 <!-- Ссылка на последнюю страницу -->
 <?php if (isset($this->next)): ?>
-  <a href="<?= $this->url(array('page' => $this->last)); ?>">Last</a>
+  <a href="<?php echo $this->url(array('page' => $this->last)); ?>">
+    Last
+  </a>
 <?php else: ?>
   <span class="disabled">Last</span>
 <?php endif; ?>
 
 </div>
-<?php endif; ?>]]>
-                </programlisting>
-            </para>
+<?php endif; ?>
+]]></programlisting>
 
             <para>
-                Постраничная навигация в виде выпадающего списка
+                Постраничная навигация в виде выпадающего списка:
+            </para>
 
-                <programlisting language="php"><![CDATA[
+            <programlisting language="php"><![CDATA[
 <?php if ($this->pageCount): ?>
 <select id="paginationControl" size="1">
 <?php foreach ($this->pagesInRange as $page): ?>
   <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
-  <option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>><?= $page; ?></option>
+  <option value="<?php
+        echo $this->url(array('page' => $page));?>"<?php echo $selected ?>>
+    <?php echo $page; ?>
+  </option>
 <?php endforeach; ?>
 </select>
 <?php endif; ?>
 
-<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
+<script type="text/javascript"
+     src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js">
+</script>
 <script type="text/javascript">
 $('paginationControl').observe('change', function() {
     window.location = this.options[this.selectedIndex].value;
 })
-</script>]]>
-                </programlisting>
-            </para>
+</script>
+]]></programlisting>
         </sect3>
 
         <sect3 id="zend.paginator.usage.rendering.properties">
@@ -408,7 +560,7 @@ $('paginationControl').observe('change', function() {
             </para>
 
             <table id="zend.paginator.usage.rendering.properties.table">
-                <title>Свойства, доступные внутри скрипта вида</title>
+                <title>Свойства, доступные в скрипте вида</title>
 
                 <tgroup cols="3">
                     <thead>
@@ -451,6 +603,14 @@ $('paginationControl').observe('change', function() {
                             <entry>Количество элементов на текущей странице</entry>
                         </row>
                         <row>
+                            <entry>itemCountPerPage</entry>
+                            <entry>integer</entry>
+                            <entry>
+                                Максимальное количество отображаемых
+                                на странице элементов
+                            </entry>
+                        </row>
+                        <row>
                             <entry>last</entry>
                             <entry>integer</entry>
                             <entry>Номер последней страницы</entry>