Zend Framework Reference

Document Sample
Zend Framework Reference Powered By Docstoc
					                                                                                                                            Zend Framework Reference 1.11                               1


Zend Framework Reference 1.11




Zend_Acl ........................................................................................................................................................ 19
   Введение ....................................................................................................................................................................... 19
      Ресурсы ...................................................................................................................................................................... 19
      Роли ........................................................................................................................................................................... 19
      Создание списка контроля доступа (ACL) ................................................................................................................. 21
      Регистрация ролей .................................................................................................................................................... 21
      Определение контроля доступа ............................................................................................................................... 22
      Запросы к ACL ............................................................................................................................................................ 23
   Настройка управления доступом ................................................................................................................................. 24
      Точное управление доступом ................................................................................................................................... 24
      Удаление правил доступа ......................................................................................................................................... 25
Zend_Application ........................................................................................................................................... 27
   Введение ....................................................................................................................................................................... 27
   Zend_Application - Быстрый старт ................................................................................................................................. 27
      Использование вместе с Zend_Tool .......................................................................................................................... 27
      Добавление Zend_Application в приложение ........................................................................................................... 29
      Добавление и создание ресурсов ............................................................................................................................ 30
      Следующие шаги с Zend_Application ........................................................................................................................ 32
   Расширенное использование ....................................................................................................................................... 33
      Постоянное хранение данных ACL............................................................................................................................ 33
      Написание условных правил ACL с утверждениями ................................................................................................ 33
   Теоретические основы работы с Zend_Application ...................................................................................................... 35
      Начальная загрузка ................................................................................................................................................... 36
      Методы ресурсов ...................................................................................................................................................... 36
      Загрузки, использующие плагины ресурсов............................................................................................................. 37
      Реестр ресурсов......................................................................................................................................................... 39
      Отслеживание зависимостей.................................................................................................................................... 41
                                                                                                                                                                                     2

      Плагины ресурсов ..................................................................................................................................................... 41
Zend_Cache ................................................................................................................................................... 44
   Введение ....................................................................................................................................................................... 44
   Теория кэширования .................................................................................................................................................... 46
      Фабричный метод Zend_Cache ................................................................................................................................. 46
      Добавление тегов к записям..................................................................................................................................... 47
      Очистка кэша ............................................................................................................................................................. 47
Фронтэнды Zend_Cache ................................................................................................................................ 48
   Zend_Cache_Core ........................................................................................................................................................... 48
   Введение ....................................................................................................................................................................... 48
      Доступные опции ...................................................................................................................................................... 48
      Примеры.................................................................................................................................................................... 49
   Zend_Cache_Frontend_Output ....................................................................................................................................... 51
   Введение ....................................................................................................................................................................... 51
      Доступные опции ...................................................................................................................................................... 51
      Примеры.................................................................................................................................................................... 51
   Zend_Cache_Frontend_Function .................................................................................................................................... 51
   Введение ....................................................................................................................................................................... 51
      Доступные опции ...................................................................................................................................................... 51
      Примеры.................................................................................................................................................................... 52
   Zend_Cache_Frontend_Class .......................................................................................................................................... 52
   Введение ....................................................................................................................................................................... 52
      Доступные опции ...................................................................................................................................................... 52
      Примеры.................................................................................................................................................................... 53
   Zend_Cache_Frontend_File ............................................................................................................................................ 53
   Введение ....................................................................................................................................................................... 53
      Доступные опции ...................................................................................................................................................... 54
      Примеры.................................................................................................................................................................... 54
   Zend_Cache_Frontend_Page .......................................................................................................................................... 54
   Введение ....................................................................................................................................................................... 54
      Доступные опции ...................................................................................................................................................... 55
      Примеры.................................................................................................................................................................... 56
   Отмена кэширования .................................................................................................................................................... 57
Бэкэнды Zend_Cache .................................................................................................................................... 59
                                                                                                                                                                                       3

   Zend_Cache_Backend_File ............................................................................................................................................. 59
      Доступные опции: ..................................................................................................................................................... 59
   Zend_Cache_Backend_Sqlite .......................................................................................................................................... 60
      Доступные опции: ..................................................................................................................................................... 60
   Zend_Cache_Backend_Memcached ................................................................................................................................ 60
      Доступные опции: ..................................................................................................................................................... 60
   Zend_Cache_Backend_Apc ............................................................................................................................................. 61
   Zend_Cache_Backend_Xcache ........................................................................................................................................ 61
      Доступные опции: ..................................................................................................................................................... 61
   Zend_Cache_Backend_ZendPlatform.............................................................................................................................. 61
   Zend_Cache_Backend_TwoLevels ................................................................................................................................... 61
      Доступные опции: ..................................................................................................................................................... 62
   Zend_Cache_Backend_ZendServer_Disk и Zend_Cache_Backend_ZendServer_ShMem.................................................. 62
Zend_Config................................................................................................................................................... 63
   Введение ....................................................................................................................................................................... 63
   Теоретические основы работы с Zend_Config .............................................................................................................. 64
   Zend_Config_Ini.............................................................................................................................................................. 65
   Zend_Config_Xml............................................................................................................................................................ 67
Zend_Config_Writer ....................................................................................................................................... 70
Zend_Controller ............................................................................................................................................. 72
   Zend_Controller - Быстрый старт ................................................................................................................................... 72
   Введение ....................................................................................................................................................................... 72
      Быстрый старт ........................................................................................................................................................... 72
      Создайте файловую структуру .................................................................................................................................. 72
      Установите корневую директорию для документов ................................................................................................ 72
      Создайте свои правила перезаписи ......................................................................................................................... 72
      Создайте файл загрузки ............................................................................................................................................ 73
      Создайте свой контроллер действий, используемый по умолчанию ..................................................................... 74
      Создайте скрипт вида ............................................................................................................................................... 74
      Создайте контроллер ошибок .................................................................................................................................. 75
      Смотрим сайт! ........................................................................................................................................................... 75
   Основы Zend_Controller ................................................................................................................................................ 76
   Фронт-контроллер ........................................................................................................................................................ 79
      Обзор ......................................................................................................................................................................... 79
                                                                                                                                                                                      4

   Ключевые методы ..................................................................................................................................................... 79
   getInstance() ............................................................................................................................................................... 79
   setControllerDirectory() и addControllerDirectory() .................................................................................................... 80
   addModuleDirectory() и getModuleDirectory() ........................................................................................................... 80
   dispatch().................................................................................................................................................................... 80
   run() ........................................................................................................................................................................... 81
   Методы-аксессоры для конфигурирования ............................................................................................................. 81
   Параметры фронт-контроллера................................................................................................................................ 83
   Расширение фронт-контроллера .............................................................................................................................. 83
Объект запроса ............................................................................................................................................................. 85
   Введение ................................................................................................................................................................... 85
HTTP-запросы ................................................................................................................................................................ 85
   Доступ к данным запроса ......................................................................................................................................... 85
   Базовый URL и поддиректории ................................................................................................................................. 86
   Определение HTTP-метода запроса ......................................................................................................................... 87
   Определение запросов AJAX .................................................................................................................................... 87
   Создание подклассов объекта запроса .................................................................................................................... 88
Стандартный маршрутизатор ....................................................................................................................................... 89
   Введение ................................................................................................................................................................... 89
   Использование маршрутизатора .............................................................................................................................. 91
   Базовые операции Rewrite Router ............................................................................................................................ 91
   Маршруты, используемые по умолчанию ............................................................................................................... 92
   Базовый URL и поддиректории ................................................................................................................................. 93
   Глобальные параметры ............................................................................................................................................ 94
Типы маршрутов ........................................................................................................................................................... 94
   Zend_Controller_Router_Route .................................................................................................................................. 94
   Значения переменных по умолчанию ...................................................................................................................... 95
   Требования к переменным ....................................................................................................................................... 96
   Переводимые сегменты............................................................................................................................................ 96
   Zend_Controller_Router_Route_Static........................................................................................................................ 98
   Zend_Controller_Router_Route_Regex ....................................................................................................................... 99
   Zend_Controller_Router_Route_Hostname .............................................................................................................. 102
   Zend_Controller_Router_Route_Chain ..................................................................................................................... 103
   Объединение маршрутов через Zend_Config ......................................................................................................... 104
                                                                                                                                                                                   5

Использование Zend_Config вместе с RewriteRouter ................................................................................................. 105
Создание подклассов маршрутизатора ..................................................................................................................... 106
Диспетчер.................................................................................................................................................................... 107
   Обзор ....................................................................................................................................................................... 107
   Создание подклассов диспетчера .......................................................................................................................... 108
Контроллеры действий ............................................................................................................................................... 111
   Введение ................................................................................................................................................................. 111
   Инициализация объекта ......................................................................................................................................... 112
   Перехватчики Pre- и Post-Dispatch .......................................................................................................................... 113
   Аксессоры ................................................................................................................................................................ 113
   Интеграция вида ..................................................................................................................................................... 113
   Инициализация вида .............................................................................................................................................. 114
   Рендеринг видов ..................................................................................................................................................... 114
   Сервисные методы.................................................................................................................................................. 115
   Создание подклассов контроллера действий ........................................................................................................ 116
Помощники действий ................................................................................................................................................. 118
   Введение ................................................................................................................................................................. 118
   Инициализация помощника ................................................................................................................................... 118
   Брокер помощников ............................................................................................................................................... 118
   Встроенные помощники действий ......................................................................................................................... 120
   ActionStack ............................................................................................................................................................... 120
   AutoComplete .......................................................................................................................................................... 121
   Автодополнение c Dojo ........................................................................................................................................... 122
   Автодополнение с Scriptaculous ............................................................................................................................. 125
   ContextSwitch и AjaxContext .................................................................................................................................... 125
   Доступные по умолчанию контексты ..................................................................................................................... 127
   Создание своего контекста ..................................................................................................................................... 127
   Установка контекстов для действий ....................................................................................................................... 128
   Инициализация переключения контекста.............................................................................................................. 130
   Дополнительный функционал ................................................................................................................................ 130
   Функционал AjaxContext ......................................................................................................................................... 132
   FlashMessenger ........................................................................................................................................................ 133
   Введение ................................................................................................................................................................. 133
   Базовый пример использования ............................................................................................................................ 133
                                                                                                                                                                                      6

   JSON ......................................................................................................................................................................... 134
   Redirector ................................................................................................................................................................. 135
   Введение ................................................................................................................................................................. 135
   Базовые примеры использования .......................................................................................................................... 136
   ViewRenderer ........................................................................................................................................................... 139
   Введение ................................................................................................................................................................. 139
   API ............................................................................................................................................................................ 139
   Примеры базового использования......................................................................................................................... 144
   Примеры продвинутого использования................................................................................................................. 146
   Написание собственных помощников.................................................................................................................... 147
Объект ответа.............................................................................................................................................................. 149
   Использование ........................................................................................................................................................ 149
   Управление заголовками ........................................................................................................................................ 150
   Именованные сегменты .......................................................................................................................................... 151
   Проверка на исключения в объекте ответа ............................................................................................................ 152
   Создание подклассов объекта ответа .................................................................................................................... 153
Плагины ....................................................................................................................................................................... 154
   Введение ................................................................................................................................................................. 154
   Написание плагинов ............................................................................................................................................... 154
   Использование плагинов ........................................................................................................................................ 155
   Извлечение и работа с плагинами.......................................................................................................................... 156
   Плагины, включенные в стандартную поставку ..................................................................................................... 156
   ActionStack ............................................................................................................................................................... 156
   Zend_Controller_Plugins_ErrorHandler ..................................................................................................................... 157
   Использование ErrorHandler в качестве обработчика ошибки 404 ....................................................................... 157
   Управление сгенерированным ранее выводом..................................................................................................... 159
   Примеры использования плагина .......................................................................................................................... 159
   Пример контроллера ошибок ................................................................................................................................. 160
Использование модульной структуры директорий ................................................................................................... 161
   Введение ................................................................................................................................................................. 161
   Определение директорий контроллеров в модулях ............................................................................................. 162
   Маршрутизация применительно к модулям ......................................................................................................... 163
   Модуль или глобальный контроллер по умолчанию ............................................................................................ 163
Исключения................................................................................................................................................................. 164
                                                                                                                                                                                   7

      Введение ................................................................................................................................................................. 164
      Обработка исключений........................................................................................................................................... 164
      Исключения в MVC, с которыми вы можете встретиться....................................................................................... 165
Zend_Db ...................................................................................................................................................... 168
   Zend_Db_Adapter ........................................................................................................................................................ 168
      Соединение с БД с использованием адаптера....................................................................................................... 168
      Использование конструктора адаптера Zend_Db................................................................................................... 168
      Использование фабрики Zend_Db .......................................................................................................................... 169
      Использование Zend_Config с фабрикой Zend_Db ................................................................................................. 170
      Параметры адаптера............................................................................................................................................... 170
      Управление отложенными соединениями ............................................................................................................ 172
      Пример базы данных .............................................................................................................................................. 172
      Чтение результатов запроса ................................................................................................................................... 174
      Извлечение полного набора результатов .............................................................................................................. 174
      Изменение режима извлечения ............................................................................................................................. 174
      Извлечение результатов выборки в виде ассоциативного массива...................................................................... 175
      Извлечение единственного столбца из результатов выборки .............................................................................. 176
      Извлечение пар ключ-значение из результатов выборки ..................................................................................... 176
      Извлечение единственной строки из результатов выборки.................................................................................. 176
      Извлечение единственного скалярного значения из результатов выборки ......................................................... 177
      Изменение данных в БД ......................................................................................................................................... 177
      Добавление данных ................................................................................................................................................ 177
      Получение сгенерированного значения................................................................................................................. 178
      Обновление данных................................................................................................................................................ 179
      Удаление данных .................................................................................................................................................... 180
      Заключение в кавычки значений и идентификаторов ........................................................................................... 180
      Использование quote() ....................................................................................................................................... 181
      Использование quoteInto() .............................................................................................................................. 182
      Использование quoteIdentifier() ................................................................................................................ 182
      Управление транзакциями ..................................................................................................................................... 183
      Листинг и описание таблиц..................................................................................................................................... 184
      Закрытие соединения ............................................................................................................................................. 185
      Запуск других операторов БД ................................................................................................................................. 186
      Примечания к отдельным адаптерам .................................................................................................................... 186
                                                                                                                                                                                   8

        IBM DB2 ..................................................................................................................................................... 186
        MySQLi ....................................................................................................................................................... 187
        Oracle .......................................................................................................................................................... 187
        PDO            IBM DB2             Informix Dynamic Server (IDS).............................................................................. 187
        PDO Microsoft SQL Server ........................................................................................................................ 187
        PDO MySQL ............................................................................................................................................... 187
        PDO Oracle ................................................................................................................................................. 188
        PDO PostgreSQL......................................................................................................................................... 188
        PDO SQLite................................................................................................................................................. 188
        Firebird/Interbase ........................................................................................................................................ 188
Zend_Db_Statement ..................................................................................................................................................... 189
   Создание оператора ............................................................................................................................................... 189
   Выполнение оператора........................................................................................................................................... 189
   Извлечение результатов выполнения оператора SELECT.................................................................................... 190
   Извлечение одной строки из набора результатов ................................................................................................. 190
   Извлечение всего набора результатов ................................................................................................................... 191
   Изменение формата извлечения ............................................................................................................................ 191
   Извлечение одного столбца из набора результатов .............................................................................................. 192
   Извлечение строки в виде объекта ........................................................................................................................ 192
Zend_Db_Profiler.......................................................................................................................................................... 193
   Введение ................................................................................................................................................................. 193
   Использование профилировщика .......................................................................................................................... 194
   Расширенное использование профилировщика.................................................................................................... 195
   Фильтрация по времени выполнения запроса ...................................................................................................... 195
   Фильтрация по типу запроса................................................................................................................................... 196
   Получение профилей по типу запроса ................................................................................................................... 196
   Специализированные профилировщики ............................................................................................................... 197
   Profiling with Firebug ................................................................................................................................................ 197
Zend_Db_Select............................................................................................................................................................ 199
   Обзор ....................................................................................................................................................................... 199
   Создание объекта Select ......................................................................................................................................... 199
   Построение запросов Select .................................................................................................................................... 199
   Добавление предложения FROM ........................................................................................................................... 200
   Добавление колонок............................................................................................................................................... 201
   Добавление столбцов выражений ......................................................................................................................... 202
                                                                                                                                                                             9

   Добавление столбцов в существующую таблицу FROM или JOIN ......................................................................... 203
   Добавление в запрос другой таблицы c помощью JOIN ........................................................................................ 204
   Добавление предложения WHERE ......................................................................................................................... 206
   Добавление предложения GROUP BY..................................................................................................................... 208
   Добавление предложения HAVING ........................................................................................................................ 209
   Добавление предложения ORDER BY ..................................................................................................................... 209
   Добавление предложения LIMIT ............................................................................................................................ 210
   Добавление модификатора DISTINCT ..................................................................................................................... 211
   Добавление модификатора FOR UPDATE ............................................................................................................... 211
   Произведение запросов на выборку ...................................................................................................................... 212
   Произведение запросов на выборку из адаптера БД ............................................................................................ 212
   Произведение запросов на выборку через объект Select...................................................................................... 212
   Преобразование объекта Select в SQL-строку ........................................................................................................ 212
   Другие методы ........................................................................................................................................................ 213
   Получение частей объекта Select ............................................................................................................................ 213
   Сброс частей запроса в объекте Select ................................................................................................................... 214
Zend_Db_Table............................................................................................................................................................. 215
   Класс таблицы - введение....................................................................................................................................... 215
   Определение класса таблицы ................................................................................................................................ 215
   Определение имени и схемы таблицы .................................................................................................................. 215
   Определение первичного ключа таблицы ............................................................................................................. 216
   Переопределение методов установки таблицы .................................................................................................... 217
   Инициализация таблицы ........................................................................................................................................ 217
   Создание экземпляра класса таблицы ................................................................................................................... 218
   Установка адаптера БД ........................................................................................................................................... 218
   Установка используемого по умолчанию адаптера БД ......................................................................................... 218
   Хранение адаптера БД в реестре ............................................................................................................................ 219
   Добавление строк в таблицу................................................................................................................................... 219
   Использование таблицы с автоинкрементным ключом ........................................................................................ 220
   Использование таблицы с последовательностью .................................................................................................. 220
   Использование таблицы с естественным ключом ................................................................................................. 221
   Обновление строк в таблице .................................................................................................................................. 221
   Удаление строк из таблицы .................................................................................................................................... 222
   Извлечение строк по первичному ключу ............................................................................................................... 222
                                                                                                                                                                                10

   Извлечение наборов строк ..................................................................................................................................... 223
       API                                                  ................................................................................................................ 223
                                                  .......................................................................................................................... 224
                                                        .................................................................................................................... 225
   Извлечение одной строки ....................................................................................................................................... 226
   Получение метаданных таблицы............................................................................................................................ 227
   Кэширование метаданных таблицы ....................................................................................................................... 227
   Расширение класса таблицы................................................................................................................................... 229
                                                                                                            ............................................................... 229
                                                                                           ,                                                  ............................ 230
                                                                                      ..................................................................................... 231
                                                     Zend_Db_Table............................................................................................. 231
Zend_Db_Table_Row .................................................................................................................................................... 233
   Введение ................................................................................................................................................................. 233
   Извлечение строки .................................................................................................................................................. 233
   Чтение значений столбцов из строки ..................................................................................................................... 233
   Получение данных строки в виде массива............................................................................................................. 234
   Извлечение данных из связанных таблиц .............................................................................................................. 234
   Редактирование строк в БД .................................................................................................................................... 234
                                                                          .................................................................................................. 234
                                            ................................................................................................................................ 235
   Изменение значений в нескольких столбцах ......................................................................................................... 235
   Удаление строки ..................................................................................................................................................... 236
   Сериализация и десериализация строк ................................................................................................................. 236
   Сериализация объекта строки ................................................................................................................................ 236
   Десериализация данных строки ............................................................................................................................. 236
   Восстановление соединения для объекта строки .................................................................................................. 237
   Расширение класса строки...................................................................................................................................... 237
   Инициализация строки ........................................................................................................................................... 238
   Определение собственной логики для добавления, обновления и удаления в Zend_Db_Table_Row................. 238
   Определение инфлекции в Zend_Db_Table_Row ................................................................................................... 239
Zend_Db_Table_Rowset ............................................................................................................................................... 241
   Введение ................................................................................................................................................................. 241
   Получение набора строк ......................................................................................................................................... 241
                                                                                                                                                                                     11

      Получение строк из набора .................................................................................................................................... 241
      Получение набора строк в виде массива ............................................................................................................... 242
      Сериализация и десериализация наборов строк ................................................................................................... 243
      Расширение класса набора строк ........................................................................................................................... 244
   Связи между таблицами Zend_Db_Table.................................................................................................................... 246
      Введение ................................................................................................................................................................. 246
      Определение связей ............................................................................................................................................... 246
      Извлечение зависимых строк ................................................................................................................................. 248
      Извлечение родительской строки .......................................................................................................................... 250
      Извлечение строк через связи "многие-ко-многим" ............................................................................................. 251
      Каскадные операции записи .................................................................................................................................. 253
      Примечания относительно каскадных операций .................................................................................................. 254
Zend_Debug ................................................................................................................................................ 256
   Дамп переменных....................................................................................................................................................... 256
      Отладка с применением Zend_Log ......................................................................................................................... 256
Zend_Dom ................................................................................................................................................... 257
   Введение ..................................................................................................................................................................... 257
   Zend_Dom_Query ........................................................................................................................................................ 257
      Теория работы......................................................................................................................................................... 257
      Доступные методы .................................................................................................................................................. 258
      Zend_Dom_Query..................................................................................................................................................... 258
      Zend_Dom_Query_Result ......................................................................................................................................... 259
Zend_Exception ........................................................................................................................................... 260
   Использование исключений ....................................................................................................................................... 260
   Basic usage ................................................................................................................................................................... 260
   Previous Exceptions ...................................................................................................................................................... 260
Zend_Filter .................................................................................................................................................. 262
   Введение ..................................................................................................................................................................... 262
      Что есть фильтр? ..................................................................................................................................................... 262
      Основы использования фильтров........................................................................................................................... 262
      Использование статического метода get() ............................................................................................................. 262
   Цепочки фильтров ...................................................................................................................................................... 263
   Написание фильтров ................................................................................................................................................... 264
                                                                                                                                                                                    12

Zend_Form .................................................................................................................................................. 265
   Zend_Form ................................................................................................................................................................... 265
   Zend_Form - Быстрый старт......................................................................................................................................... 265
      Создание объекта формы ....................................................................................................................................... 265
      Добавление элементов в форму............................................................................................................................. 266
      Визуализация формы .............................................................................................................................................. 268
      Проверка корректности данных формы ................................................................................................................. 269
      Получение статуса ошибки ..................................................................................................................................... 269
      Объединяя изложенное.......................................................................................................................................... 270
      Использование объекта Zend_Config...................................................................................................................... 271
      Заключение ............................................................................................................................................................. 272
Zend_Http ................................................................................................................................................... 273
   Zend_Http_Client - Введение ....................................................................................................................................... 273
      Введение ................................................................................................................................................................. 273
      Параметры конфигурации ...................................................................................................................................... 273
      Выполнение базовых HTTP-запросов ..................................................................................................................... 274
      Добавление параметров GET и POST ...................................................................................................................... 274
      Получение последних запроса и ответа ................................................................................................................. 275
Zend_Json.................................................................................................................................................... 276
   Введение ..................................................................................................................................................................... 276
   Основы применения ................................................................................................................................................... 276
   Объекты JSON .............................................................................................................................................................. 276
   XML to JSON conversion ............................................................................................................................................... 277
Zend_Layout ................................................................................................................................................ 279
   Введение ..................................................................................................................................................................... 279
   Zend_Layout - Быстрый старт ...................................................................................................................................... 279
      Скрипты макетов ..................................................................................................................................................... 279
      Использование Zend_Layout с MVC Zend Framework-а .......................................................................................... 280
      Использование Zend_Layout как отдельной компоненты ..................................................................................... 282
      Пример макета ........................................................................................................................................................ 283
   Опции конфигурирования Zend_Layout ..................................................................................................................... 284
      Примеры.................................................................................................................................................................. 284
   Использование Zend_Layout для опытных разработчиков ........................................................................................ 286
                                                                                                                                                                                    13

      Собственные объекты вида .................................................................................................................................... 286
      Собственные плагины фронт-контроллера ............................................................................................................ 288
      Собственные помощники действий ....................................................................................................................... 288
      Собственное определение пути к скрипту макета: использование инфлектора .................................................. 288
Zend_Loader ................................................................................................................................................ 290
   Динамическая загрузка файлов и классов ................................................................................................................. 290
      Zend_Loader vs. require_once() ................................................................................................................................ 290
      Загрузка файлов ...................................................................................................................................................... 290
      Загрузка классов ...................................................................................................................................................... 290
      Проверка на возможность чтения из файла ........................................................................................................... 291
      Использование автозагрузчика .............................................................................................................................. 291
   Автозагрузчик.............................................................................................................................................................. 293
      Использование автозагрузчика .............................................................................................................................. 293
      Итерфейс автозагрузчика........................................................................................................................................ 294
      Справка по автозагрузчику ..................................................................................................................................... 294
Zend_Mail ................................................................................................................................................... 301
   Введение ..................................................................................................................................................................... 301
      Начало работы ........................................................................................................................................................ 301
      Конфигурирование транспорта, используемого по умолчанию............................................................................ 301
   Отправка через SMTP .................................................................................................................................................. 302
   Отправка нескольких сообщений за одно SMTP-соединение ................................................................................... 302
   Использование различных транспортов .................................................................................................................... 303
   Сообщение в формате HTML ...................................................................................................................................... 304
   Вложения .................................................................................................................................................................... 304
   Добавление получателей ........................................................................................................................................... 305
   Контроль за разделителями MIME ............................................................................................................................. 305
   Дополнительные заголовки ....................................................................................................................................... 305
   Наборы символов ....................................................................................................................................................... 306
   Кодировка ................................................................................................................................................................... 306
   SMTP-аутентификация ................................................................................................................................................ 306
   Securing SMTP Transport .............................................................................................................................................. 307
Zend_Navigation .......................................................................................................................................... 308
   Введение ..................................................................................................................................................................... 308
      Страницы и контейнеры ......................................................................................................................................... 308
                                                                                                                                                                                    14

      Страницы ................................................................................................................................................................. 308
      Контейнеры ............................................................................................................................................................. 308
      Разделение данных (модели) и отображения (вида) ............................................................................................ 308
   Страницы ..................................................................................................................................................................... 309
      Общие функциональные возможности страниц .................................................................................................... 309
      Zend_Navigation_Page_Mvc ..................................................................................................................................... 311
      Zend_Navigation_Page_Uri ....................................................................................................................................... 314
      Creating custom page types ...................................................................................................................................... 314
      Creating pages using the page factory ....................................................................................................................... 315
Zend_Paginator ........................................................................................................................................... 318
   Введение ..................................................................................................................................................................... 318
   Использование ............................................................................................................................................................ 318
      Разбиение наборов данных на страницы............................................................................................................... 318
      Адаптеры DbSelect и DbTableSelect ........................................................................................................................ 319
      Рендеринг страниц через скрипты видов............................................................................................................... 320
      Примеры постраничной навигации ........................................................................................................................ 322
      Список свойств ........................................................................................................................................................ 324
   Конфигурация ............................................................................................................................................................. 324
   Расширенное использование ..................................................................................................................................... 325
      Создание собственных адаптеров к источникам данных ...................................................................................... 325
      Создание своих стилей прокрутки .......................................................................................................................... 325
      Возможности кэширования .................................................................................................................................... 326
      Интерфейс Zend_Paginator_AdapterAggregate........................................................................................................ 327
Zend_Registry .............................................................................................................................................. 328
   Использование реестра .............................................................................................................................................. 328
      Установка значений в реестре ................................................................................................................................ 328
      Получение значений из реестра ............................................................................................................................. 328
      Создание объекта реестра ...................................................................................................................................... 329
      Доступ к реестру как к массиву............................................................................................................................... 329
      Доступ к реестру как к объекту ............................................................................................................................... 330
      Проверка существования индекса.......................................................................................................................... 330
      Создание подклассов .............................................................................................................................................. 331
      Уничтожение статического реестра ........................................................................................................................ 331
Zend_Search_Lucene ................................................................................................................................... 332
                                                                                                                                                                                    15

Обзор ........................................................................................................................................................................... 332
   Введение ................................................................................................................................................................. 332
   Объекты документа и поля ..................................................................................................................................... 332
   Значение типов полей............................................................................................................................................. 334
   HTML-документы..................................................................................................................................................... 334
Индексация ................................................................................................................................................................. 337
   Создание нового индекса ....................................................................................................................................... 337
Обновление индекса .................................................................................................................................................. 337
   Обновление документов ........................................................................................................................................ 337
   Получение размера индекса .................................................................................................................................. 338
   Оптимизация индекса ............................................................................................................................................. 338
   Опция автоматической оптимизации MaxBufferedDocs ........................................................................................ 340
   Опция автоматической оптимизации MaxMergeDocs ........................................................................................... 340
   Опция автоматической оптимизации MergeFactor ................................................................................................ 340
   Ограничения............................................................................................................................................................ 341
Поиск по индексу ........................................................................................................................................................ 341
   Построение запросов .............................................................................................................................................. 341
   Парсинг запроса ...................................................................................................................................................... 342
Результаты поиска ...................................................................................................................................................... 343
   Ранжирование результата ...................................................................................................................................... 344
   Сортировка результатов поиска ............................................................................................................................. 344
   Подсветка результатов поиска ............................................................................................................................... 345
Язык запросов ............................................................................................................................................................. 345
   Элементы................................................................................................................................................................. 345
   Поля ......................................................................................................................................................................... 346
   Модификаторы элементов ..................................................................................................................................... 346
   Поиск по критерию близости .................................................................................................................................. 347
   Усиление элемента ................................................................................................................................................. 347
   Булевы операторы .................................................................................................................................................. 347
        AND ............................................................................................................................................................ 347
        OR................................................................................................................................................................ 348
        NOT ............................................................................................................................................................. 348
   Операторы &&, ||, и ! ............................................................................................................................................. 348
        + ................................................................................................................................................................... 348
                                                                                                                                                                                    16

           - .................................................................................................................................................................... 348
      Отсутствие оператора ............................................................................................................................................. 348
      Групирование .......................................................................................................................................................... 349
      Группирование полей ............................................................................................................................................. 349
      Экранирование специальных символов ................................................................................................................ 349
   API для построения запросов ..................................................................................................................................... 351
      Исключения, бросаемые парсером запросов ........................................................................................................ 351
      Простой запрос (запрос по одному ключевому слову) .......................................................................................... 351
      Составной запрос (запрос по нескольким ключевым словам) .............................................................................. 352
      Фразовый запрос..................................................................................................................................................... 353
   Кодировки ................................................................................................................................................................... 355
      Поддержка UTF-8 и однобайтных наборов символов ........................................................................................... 355
      Используемый по умолчанию анализатор текста .................................................................................................. 356
      Совместимый с UTF-8 анализатор текста ............................................................................................................... 356
   Расширяемость ........................................................................................................................................................... 357
      Анализ текста .......................................................................................................................................................... 357
      Фильтрация лексем ................................................................................................................................................. 359
      Алгоритмы ранжирования ...................................................................................................................................... 360
      Контейнеры хранения ............................................................................................................................................. 361
   Взаимодействие с Java Lucene .................................................................................................................................... 365
      Форматы файлов ..................................................................................................................................................... 365
      Директория для индекса......................................................................................................................................... 365
      Исходный код Java .................................................................................................................................................. 365
Zend_Session ............................................................................................................................................... 366
   Введение ..................................................................................................................................................................... 366
   Базовое использование .............................................................................................................................................. 367
      Учебные примеры ................................................................................................................................................... 367
      Итерация по пространствам имен .......................................................................................................................... 368
      Методы доступа для пространств имен ................................................................................................................. 368
   Расширенное использование ..................................................................................................................................... 369
      Старт сессии ............................................................................................................................................................ 369
      Блокировка пространств имен................................................................................................................................ 370
      Время жизни пространства имен ........................................................................................................................... 371
      Инкапсуляция сессий и контроллеры ..................................................................................................................... 372
                                                                                                                                                                                        17

      Ограничение количества экземпляров Zend_Session_Namespace до одного на каждое пространство имен ..... 372
      Работа с массивами в пространствах имен ............................................................................................................ 373
      Использование сессий вместе с аутентификацией ................................................................................................ 374
      Использование сессий с юнит-тестами .................................................................................................................. 375
   Общее управление сессиями ..................................................................................................................................... 377
      Zend_Session::setOptions() ....................................................................................................................................... 377
      Опции ...................................................................................................................................................................... 378
      regenerateId()........................................................................................................................................................... 379
                           :                                           .......................................................................................................... 379
                                                    ............................................................................................................................ 380
      rememberMe(integer $seconds) ............................................................................................................................... 381
      forgetMe() ................................................................................................................................................................ 381
      sessionExists() ........................................................................................................................................................... 381
      destroy(bool $remove_cookie = true, bool $readonly = true) .................................................................................... 381
      stop() ........................................................................................................................................................................ 382
      writeClose($readonly = true)..................................................................................................................................... 382
      expireSessionCookie() ............................................................................................................................................... 382
      setSaveHandler(Zend_Session_SaveHandler_Interface $interface) ........................................................................... 382
      namespaceIsset($namespace) .................................................................................................................................. 382
      namespaceUnset($namespace) ................................................................................................................................ 383
      namespaceGet($namespace) .................................................................................................................................... 383
      getIterator() .............................................................................................................................................................. 383
Zend_Validate.............................................................................................................................................. 384
   Введение ..................................................................................................................................................................... 384
      Что такое валидатор? .............................................................................................................................................. 384
      Базовое использование валидаторов .................................................................................................................... 384
      Установка собственных сообщений от ошибках .................................................................................................... 385
      Использование статического метода is() ................................................................................................................ 386
      Перевод сообщений ............................................................................................................................................... 386
   Цепочки валидаторов ................................................................................................................................................. 387
   Написание валидаторов ............................................................................................................................................. 388
Zend_View................................................................................................................................................... 392
   Введение ..................................................................................................................................................................... 392
      Скрипт контроллера ................................................................................................................................................ 392
                                                                                                                                                                                  18

   Скрипт вида ............................................................................................................................................................. 392
   Опции ...................................................................................................................................................................... 393
   Короткие теги в скриптах вида ............................................................................................................................... 394
   Вспомогательные аксессоры .................................................................................................................................. 394
Скрипты контроллеров ............................................................................................................................................... 395
   Установка переменных ........................................................................................................................................... 395
   Выполнение скрипта вида ...................................................................................................................................... 396
   Пути к скриптам вида .............................................................................................................................................. 396
Скрипты видов ............................................................................................................................................................ 397
   Экранирование вывода........................................................................................................................................... 397
   Использование других шаблонизаторов ................................................................................................................ 398
   Шаблонизаторы c использованием скриптов видов ............................................................................................. 398
   Шаблонизаторы с использованием Zend_View_Interface...................................................................................... 399
Помощники видов ...................................................................................................................................................... 405
Начальный набор помощников .................................................................................................................................. 405
   Помощник Action .................................................................................................................................................... 408
                                                                                                                                                      Zend_Acl              19


Zend_Acl
Введение
Zend_Acl                                                                                                                           (ACL)
               .
       -                .

                                        ,

   •           -        ,                                                                 .
   •       -        ,                                                                                             .

               ,                                                                  .                   ,
           ,                        -               ,                         -               ,
                                                     .

                                                                                                      (ACL)
                                                          .

Ресурсы

                Zend_Acl                                 . Zend_Acl
Zend_Acl_Resource_Interface                                                                                           .
          , getResourceId().                                                                                                                 ,                  Zend_Acl
                                                                  .                   , Zend_Acl                                     Zend_Acl_Resource
                                ,                                                                                             .

Zend_Acl                                                              ,                                                                                          .
                                                                          (                               )                           (                           ).
                                                                                                                                                      ,
                            -               ,                                                                                  .             ,
                                                                                              ,                                                           ,
                                                .             ,
               , Zend_Acl                                                                                                                             ,
                       .                                                                                                                          ,
                                    ,                         ,                                                                                           . .

Zend_Acl                                                                              (                       ,"              ", "         ", "                        ",
"        "),                                                                      ,
                            .

Роли

                          ,                                                                       .
Zend_Acl_Role_Interface.                                                                                                  getRoleId().                          ,
Zend_Acl                Zend_Acl_Role                                                                         ,
                      .
                                                                                                                                                         Zend_Acl                20

  Zend_Acl                                                                                              .
                                              .                    ,                                    ,                       "           ",
                                                                                     ,              "                       "       "                          ".
                                                          "                 "       "                               "                   ,   "              "
                                      .                                                                                                                   "             ".

                                                      -                                                     ,                                                                .
                                                                                                                    ,       Zend_Acl
           .

Example #1

                                                                  : "guest", "member"           "admin",
               .                   "someUser",                                                                                                             .                     ,
                                                      $parents,                     .                                       Zend_Acl
                                                         (                          , "someUser"),                                               ,
                                          (                                , "guest", "member" "admin"):

   1. $acl = new Zend_Acl();
   2.
   3. $acl->addRole(new Zend_Acl_Role('guest'))
   4.     ->addRole(new Zend_Acl_Role('member'))
   5.     ->addRole(new Zend_Acl_Role('admin'));
   6.
   7. $parents = array('guest', 'member', 'admin');
   8. $acl->addRole(new Zend_Acl_Role('someUser'), $parents);
   9.
   10.      $acl->add(new Zend_Acl_Resource('someResource'));
   11.
   12.      $acl->deny('guest', 'someResource');
   13.      $acl->allow('member', 'someResource');
   14.
   15.      echo $acl->isAllowed('someUser', 'someResource') ? 'разрешен' : 'запрещен';

                        ,                                                                "someUser"                             "someResource",
Zend_Acl                                                      ,                                                                       ,
"someUser"                  .                        "admin",                                                           ,
                   .                         "member", Zend_Acl                                                         ,
                                "member" "someResource".

        Zend_Acl                                          ,                                                                         ,                               ,
    "guest"                     "someResource".                                                                                         ,
"someUser"             "someResource"                                                                           .
                                           .

Zend_Acl                                          ,                             ,                                                                    ,
                                      .                                ,                 "member"                                           ,
"guest",                                      "разрешен".

Note:                                                                           ,                   ,
                                                                                            .
                                                                                                                                          Zend_Acl         21

Создание списка контроля доступа (ACL)

                                                     (ACL)
                                         .                                      ,                                           ACL
                                                 (CMS),
          .                                                             ACL,                                                      :

   16.             $acl = new Zend_Acl();

Note:                    ,                                                                     -         ,                            , Zend_Acl
                                                                                                             .

Регистрация ролей

CMS
                   .                                                    "      ",
                   ,                     "                        "-                                             CMS,
                                             ,                "             "-                                              ,
         , ,                 ,                        "                      ",                                                                ,
                                                                  ,                                                     ,                  ,
                                                                        ,                                                             .
                                                                                           ,
                                     ,                                                                   .
                                                          :

                                                                                                                  CMS
                                                                                                                                                   ,

        (guest)                                                    (view)
                                                                         (edit),
                (staff)
                                                 (submit),                          (revise)
                                                                       (publish),                  (archive),
              (editor)
                                                 (delete)
                                                 (                                     )
(administrator)

                                                         Zend_Acl_Role,                                                                                ,
                                                 Zend_Acl_Role_Interface.
                                 :

   17.             $acl = new Zend_Acl();
   18.
   19.             // Добавление групп в реестр ролей с использованием Zend_Acl_Role
   20.             // Гость не наследует управление доступом
   21.             $roleGuest = new Zend_Acl_Role('guest');
   22.             $acl->addRole($roleGuest);
   23.
   24.             // Сотрудник наследует от гостя
   25.             $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
   26.
                                                                                         Zend_Acl   22

   27.        /*
   28.        Делает то же самое, что и
   29.        $acl->addRole(new Zend_Acl_Role('staff'), 'guest');
   30.        */
   31.
   32.        // Редактор наследует от сотрудника
   33.        $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
   34.
   35.        // Администатор не наследует управление доступом
   36.        $acl->addRole(new Zend_Acl_Role('administrator'));

Определение контроля доступа

     ,        ACL                                       ,                    ,
                              .       ,             ,        ,
                      ,                                     ,                                .
Zend_Acl                                        ,
                  ,                                                      ,
                          ,                                      .

                                                                                     .
                                            ,           :

   37.        <?php
   38.        require_once 'Zend/Acl.php';
   39.
   40.        $acl = new Zend_Acl();
   41.
   42.        require_once 'Zend/Acl/Role.php';
   43.
   44.        $roleGuest = new Zend_Acl_Role('guest');
   45.        $acl->addRole($roleGuest);
   46.        $acl->addRole(new Zend_Acl_Role('staff'), $roleGuest);
   47.        $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
   48.        $acl->addRole(new Zend_Acl_Role('administrator'));
   49.
   50.        // Гость может только просматривать контент
   51.        $acl->allow($roleGuest, null, 'view');
   52.
   53.        /* другим способом, предыдущий блок кода может быть записан в таком виде:
   54.        $acl->allow('guest', null, 'view');
   55.        //*/
   56.
   57.       // Сотрудник наследует привилегии просмотра у Гостя, но также нуждается в
       дополнительных привилегиях
   58.       $acl->allow('staff', null, array('edit', 'submit', 'revise'));
   59.
   60.       // Редактор наследует привилегии просмотра, редактирования, отправки и
       исправлений у Посетителя
   61.       // но также нуждается в дополнительных привилегиях
   62.       $acl->allow('editor', null, array('publish', 'archive', 'delete'));
   63.
   64.       // Администратор не наследует ничего, но обладает всеми привилегиями
   65.       $acl->allow('administrator');

           NULL                   allow()                                        ,       ,
                                  ,                                  .
                                                                                 Zend_Acl     23

Запросы к ACL

                      ACL,                                             ,
                  ,                              -            .                isAllowed(),
                               :

  66.      echo $acl->isAllowed('guest', null, 'view') ?
  67.           "разрешен" : "запрещен";
  68.      // разрешен
  69.
  70.      echo $acl->isAllowed('staff', null, 'publish') ?
  71.           "разрешен" : "запрещен";
  72.      // запрещен
  73.
  74.      echo $acl->isAllowed('staff', null, 'revise') ?
  75.           "разрешен" : "запрещен";
  76.      // разрешен
  77.
  78.      echo $acl->isAllowed('editor', null, 'view') ?
  79.           "разрешен" : "запрещен";
  80.      // разрешен потому, что редактор наследует от гостя
  81.
  82.      echo $acl->isAllowed('editor', null, 'update') ?
  83.           "разрешен" : "запрещен";
  84.      // запрещен потому, что нет правила, разрешающего обновление (update)
  85.
  86.      echo $acl->isAllowed('administrator', null, 'view') ?
  87.           "разрешен" : "запрещен";
  88.      // разрешен потому, что администратор обладает всеми привилегиями
  89.
  90.      echo $acl->isAllowed('administrator') ?
  91.           "разрешен" : "запрещен";
  92.      // разрешен потому, что администратор обладает всеми привилегиями
  93.
  94.      echo $acl->isAllowed('administrator', null, 'update') ?
  95.           "разрешен" : "запрещен";

// разрешен потому, что администратор обладает всеми привилегиями
                                                                                                                                                       Zend_Acl       24


Настройка управления доступом
Точное управление доступом

                  ACL,                                                                      ,                                ,
                              ACL (                              ).
                             ,                                                                                                             . Zend_Acl
                                                                                    .

    CMS                                                                         ,                                 '              '
                         ,                                                                      '                      ',
                                  CMS.
                                                ,                                                        .

                    ,                   ,                    '                      '                                                              ,
                                            .            ,                                                                   (                                    )
                                        '           ',                                                                               1-2       .

                                                                                                                                     .                     ,
          '                  '                                          ,               '                    ',                            '               '
              ,                                                             '                       ':

    96.                 // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
    97.                 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');

                                        ,
(                  ,"            ", "                                 ").                                                        :

    98.                 // Создаем ресурсы для этих ролей
    99.
    100.                // подписка
    101.                $acl->add(new Zend_Acl_Resource('newsletter'));
    102.
    103.                // новости
    104.                $acl->add(new Zend_Acl_Resource('news'));
    105.
    106.                // последние новости
    107.                $acl->add(new Zend_Acl_Resource('latest'), 'news');
    108.
    109.                // объявления
    110.                $acl->add(new Zend_Acl_Resource('announcement'), 'news');

                                                                                                                      ACL.

    111.                // Маркетинг должен иметь возможность публиковать и удалять подписку
    112.                // и последние новости
    113.                $acl->allow('marketing',
    114.                            array('newsletter', 'latest'),
    115.                            array('publish', 'archive'));
    116.
    117.                // Пользователю (и маркетингу через наследование), запрещено редактировать
    118.                // последние новости
    119.                $acl->deny('staff', 'latest', 'revise');
    120.
                                                                                     Zend_Acl   25

   121.       // Всем, включая администраторов, не разрешается удалять объявления
   122.       $acl->deny(null, 'announcement', 'archive');

                                       ACL                              :

   123.       echo $acl->isAllowed('staff', 'newsletter', 'publish') ?
   124.            "разрешен" : "запрещен";
   125.       // запрещен
   126.
   127.       echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
   128.            "разрешен" : "запрещен";
   129.       // разрешен
   130.
   131.       echo $acl->isAllowed('staff', 'latest', 'publish') ?
   132.            "разрешен" : "запрещен";
   133.       // запрещен
   134.
   135.       echo $acl->isAllowed('marketing', 'latest', 'publish') ?
   136.            "разрешен" : "запрещен";
   137.       // разрешен
   138.
   139.       echo $acl->isAllowed('marketing', 'latest', 'archive') ?
   140.            "разрешен" : "запрещен";
   141.       // разрешен
   142.
   143.       echo $acl->isAllowed('marketing', 'latest', 'revise') ?
   144.            "разрешен" : "запрещен";
   145.       // запрещен
   146.
   147.       echo $acl->isAllowed('editor', 'announcement', 'archive') ?
   148.            "разрешен" : "запрещен";
   149.       // запрещен
   150.
   151.       echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
   152.            "разрешен" : "запрещен";
   153.       // запрещен

Удаление правил доступа

          ,                                      ACL,                       removeAllow()
removeDeny().                allow()   deny(),                  NULL                        ,
                             ,         , /              :

   154.       // Убираем запрет на редактирование последних новостей для 'пользователя'
   155.       // (и маркетинга через наследование)
   156.       $acl->removeDeny('staff', 'latest', 'revise');
   157.
   158.       echo $acl->isAllowed('marketing', 'latest', 'revise') ?
   159.            "разрешен" : "запрещен";
   160.       // разрешен
   161.
   162.       // Убираем разрешение на публикацию и удаление подписки для маркетинга
   163.       $acl->removeAllow('marketing',
   164.                         'newsletter',
   165.                         array('publish', 'archive'));
   166.
   167.       echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
   168.            "разрешен" : "запрещен";
                                                                         Zend_Acl   26

169.     // запрещен
170.
171.     echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
172.          "разрешен" : "запрещен";
173.     // запрещен

                                                 ,                   ,    NULL
                                           :

1. // Разрешить маркетингу все действия над последними новостями
2. $acl->allow('marketing', 'latest');
3.
4. echo $acl->isAllowed('marketing', 'latest', 'publish') ?
5.      "разрешен" : "запрещен";
6. // разрешен
7.
8. echo $acl->isAllowed('marketing', 'latest', 'archive') ?
9.      "разрешен" : "запрещен";
10.      // разрешен
11.
12.      echo $acl->isAllowed('marketing', 'latest', 'anything') ?
13.            "разрешен" : "запрещен";
14.      // разрешен
                                                                                                   Zend_Application       27


Zend_Application
Введение
Zend_Application                                                            ,
                          ,                                                         ,                           .
                                                     PHP                                             .


Zend_Application - Быстрый старт
                                          Zend_Application                                               ,
                          .                                                     Bootstrap
                              .

                                     Zend_Tool                                  ,                                     .
                        Zend_Application                            ,
       .

Использование вместе с Zend_Tool

                                                       Zend_Application -                       Zend_Tool
                 .                                      Bootstrap.

           ,                      ,                          zf                         *nix:

   1. % zf create project newproject

               zf.bat    Windows:

   1. C:> zf.bat create project newproject

                                      ,                                                   :

   1. newproject
   2. |-- application
   3. |   |-- Bootstrap.php
   4. |   |-- configs
   5. |   |   `-- application.ini
   6. |   |-- controllers
   7. |   |   |-- ErrorController.php
   8. |   |   `-- IndexController.php
   9. |   |-- models
   10.      |   `-- views
   11.      |        |-- helpers
   12.      |        `-- scripts
   13.      |            |-- error
   14.      |            |   `-- error.phtml
   15.      |            `-- index
   16.      |                `-- index.phtml
   17.      |-- library
                                                                                          Zend_Application   28

   18.        |-- public
   19.        |   `-- index.php
   20.        `-- tests
   21.            |-- application
   22.            |   `-- bootstrap.php
   23.            |-- library
   24.            |   `-- bootstrap.php
   25.            `-- phpunit.xml

                                    - newproject/application/Bootstrap.php,
                     :

   1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
   2. {
   3. }

                          ,
newproject/application/configs/application.ini.                                    :

   1. [production]
   2. phpSettings.display_startup_errors = 0
   3. phpSettings.display_errors = 0
   4. includePaths.library = APPLICATION_PATH "/../library"
   5. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
   6. bootstrap.class = "Bootstrap"
   7. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
   8.
   9. [staging : production]
   10.
   11.      [testing : production]
   12.      phpSettings.display_startup_errors = 1
   13.      phpSettings.display_errors = 1
   14.
   15.      [development : production]
   16.      phpSettings.display_startup_errors = 1
   17.      phpSettings.display_errors = 1

                                                                                    Zend_Application
                 .

              ,                                          - newproject/public/index.php,
Zend_Application                            .

   1. // Указание пути к директории приложения
   2. defined('APPLICATION_PATH')
   3.     || define('APPLICATION_PATH',
   4.               realpath(dirname(__FILE__) . '/../application'));
   5.
   6. // Определение текущего режима работы приложения
   7. defined('APPLICATION_ENV')
   8.     || define('APPLICATION_ENV',
   9.               (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
   10.                                               : 'production'));
   11.
   12.      /** Zend_Application */
   13.      require_once 'Zend/Application.php';
   14.
                                                                                             Zend_Application      29

    15.          // Создание объекта приложения, начальная загрузка, запуск
    16.          $application = new Zend_Application(
    17.              APPLICATION_ENV,
    18.              APPLICATION_PATH . '/configs/application.ini'
    19.          );
    20.          $application->bootstrap()
    21.                      ->run();

           ,                     "                  ",                               .

Добавление Zend_Application в приложение

                                     Zend_Application                  :

    •                     application/Bootstrap.php            Bootstrap.
    •                                          application/configs/application.ini                           ,
                            Zend_Application.
    •                           public/index.php      ,                        Zend_Application.

                                                  Bootstrap.                       application/Bootstrap.php
                             :

    1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
    2. {
    3. }

                                          .                                                                  INI
(             ,                                                                   - XML        PHP).
        application/configs/application.ini                                :

    1. [production]
    2. phpSettings.display_startup_errors = 0
    3. phpSettings.display_errors = 0
    4. includePaths.library = APPLICATION_PATH "/../library"
    5. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
    6. bootstrap.class = "Bootstrap"
    7. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
    8.
    9. [staging : production]
    10.
    11.      [testing : production]
    12.      phpSettings.display_startup_errors = 1
    13.      phpSettings.display_errors = 1
    14.
    15.      [development : production]
    16.      phpSettings.display_startup_errors = 1
    17.      phpSettings.display_errors = 1

           ,                                       public/index.php.                     ,               ,
                                              :

    1. // Указание пути к директории приложения
    2. defined('APPLICATION_PATH')
    3.     || define('APPLICATION_PATH',
    4.               realpath(dirname(__FILE__) . '/../application'));
                                                                            Zend_Application           30

   5.
   6. // Определение текущего режима работы приложения
   7. defined('APPLICATION_ENV')
   8.     || define('APPLICATION_ENV',
   9.               (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
   10.                                               : 'production'));
   11.
   12.      // Обычно требуется также добавить директорию library/
   13.      // в include_path, особенно если она содержит инсталляцию ZF
   14.      set_include_path(implode(PATH_SEPARATOR, array(
   15.          dirname(dirname(__FILE__)) . '/library',
   16.          get_include_path(),
   17.      )));
   18.
   19.      /** Zend_Application */
   20.      require_once 'Zend/Application.php';
   21.
   22.      // Создание объекта приложения, начальная загрузка, запуск
   23.      $application = new Zend_Application(
   24.          APPLICATION_ENV,
   25.          APPLICATION_PATH . '/configs/application.ini'
   26.      );
   27.      $application->bootstrap()
   28.                  ->run();

                             ,
                                 "APPLICATION_ENV".
   -           .Apache                                                             ,
              .htaccess.
public/.htaccess:

   1.       SetEnv APPLICATION_ENV development
   2.
   3.       RewriteEngine On
   4.       RewriteCond %{REQUEST_FILENAME} -s [OR]
   5.       RewriteCond %{REQUEST_FILENAME} -l [OR]
   6.       RewriteCond %{REQUEST_FILENAME} -d
   7.       RewriteRule ^.*$ - [NC,L]
   8.       RewriteRule ^.*$ index.php [NC,L]

Note:                             mod_rewrite
                                                                                                   -
                                                           .        ,
                     ,                                                  .              Apache,
        »                        mod_rewrite.

                                                Zend_Application.

Добавление и создание ресурсов

                                        ,                      ,
        -                ,                             ,                       -               .

                                                                        .
                                                .
                                                                                 Zend_Application       31

                              ,                              Zend_Application,
"layout".                 ,                                          ,
                                                        Zend_Layout.

   ,                              ,-                               .

   1. [production]
   2. phpSettings.display_startup_errors = 0
   3. phpSettings.display_errors = 0
   4. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
   5. bootstrap.class = "Bootstrap"
   6. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
   7. ; ADD THE FOLLOWING LINES
   8. resources.layout.layout = "layout"
   9. resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
   10.
   11.      [staging : production]
   12.
   13.      [testing : production]
   14.      phpSettings.display_startup_errors = 1
   15.      phpSettings.display_errors = 1
   16.
   17.      [development : production]
   18.      phpSettings.display_startup_errors = 1
   19.      phpSettings.display_errors = 1

                   application/layouts/scripts/           layout.phtml,                             .
                                                  (                          ,               ):

   1. <?php echo $this->doctype() ?>
   2. <html>
   3. <head>
   4.     <?php echo $this->headTitle() ?>
   5.     <?php echo $this->headLink() ?>
   6.     <?php echo $this->headStyle() ?>
   7.     <?php echo $this->headScript() ?>
   8. </head>
   9. <body>
   10.           <?php echo $this->layout()->content ?>
   11.       </body>
   12.       </html>

                                           .

       ,                               .                                   HTML DocType
                         ,                     <head> HTML-            .
                         Bootstrap:

   1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
   2. {
   3.     protected function _initView()
   4.     {
   5.         // Инициализация вида
   6.         $view = new Zend_View();
   7.         $view->doctype('XHTML1_STRICT');
   8.         $view->headTitle('My First Zend Framework Application');
   9.
                                                                                   Zend_Application   32

  10.                  // Добавление вида в ViewRenderer
  11.                  $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
  12.                      'ViewRenderer'
  13.                  );
  14.                  $viewRenderer->setView($view);
  15.
  16.                  // Его возвращение, таким образом, он может быть сохранен загрузчиком
  17.                  return $view;
  18.          }
  19.      }



                                                                    .

Следующие шаги с Zend_Application
                                                            Zend_Application
                   .                                                           ,      ,
                                       ,                .               ,                        !
                                                                                                                                  Zend_Application                33


Расширенное использование
Постоянное хранение данных ACL

Zend_Acl                                                         ,                                                     ACL
                                                           -               ,                                           .
PHP                                                                                                                   Zend_Acl
                                .                                                                                                      ACL,
Zend_Acl                                                                           ,                         ,                                                .

              ,                                 ACL                                                       , . .
                                                                               .               Zend_Acl                                   ,
                                    ACL                PHP-                            » serialize(),                                             ,
                                -                  ,                   ,                                                                      .

Написание условных правил ACL с утверждениями

                                                                                                                                         ,
                               .                       ,                                                                      ,           8:00
17:00.                       -                                                            ,                             IP-        ,
"                     ". Zend_Acl                                                                                         ,
                                               .

Zend_Acl                                                                                                               Zend_Acl_Assert_Interface.
                                                                               ,                                          ,
         assert()                     :

   174.           class CleanIPAssertion implements Zend_Acl_Assert_Interface
   175.           {
   176.               public function assert(Zend_Acl $acl,
   177.                                      Zend_Acl_Role_Interface $role = null,
   178.                                      Zend_Acl_Resource_Interface $resource = null,
   179.                                      $privilege = null)
   180.               {
   181.                   return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
   182.               }
   183.
   184.                  protected function _isCleanIP($ip)
   185.                  {
   186.                      // ...
   187.                  }
   188.           }



                                           .                      ,                                               ,                                       ,
                                                               true.

   1. $acl = new Zend_Acl();
   2. $acl->allow(null, null, null, new CleanIPAssertion());

                                                           ,                                                                                          ,
                            ,             IP-                                                        "                    ".
                                                                                                    Zend_Application   34

IP-           ,                              "           ",                               .
                         ,                                                   ,       "   " IP
          .          ,                           ,                       ,                               (        ,
                                         ,           ,                   ),
      ,                          ,                                   ,                                       ,
                             .

          assert()                                             ACL,      ,                      ,
                                     (                   , isAllowed()).
                                                              ,                  .
                                                                                                                                        Zend_Application                   35




Теоретические основы работы с Zend_Application
                                                MVC-                   ,                                                        ,
                              ,                                                                                         :
                  ,                                                                        ,                                             (layouts),
                          ,                                                                                   .

              ,                                                                                                                                        ,
          ,           ,                                                                        .
         ,                                                 ,                                                      -                 ,
       MVC                                  ,                                                                                                                          .

Zend_Application
                                                                                                   .

Zend_Application                                       :

   •    Zend_Application:                                  PHP,                                include_paths                                     (autoloading),
                                                                           .
   •    Zend_Application_Bootstrap:                                                                                                      .
        Zend_Application_Bootstrap_Bootstrap                                                                            ,
                                                               ,
                                                                           .
   •    Zend_Application_Resource                                                                                                                              ,
                                                                                                                            ,
                                    ,                                                      .

                                                                                                       ,
Zend_Application_Bootstrap_Bootstrap     ,                                         ,
Zend_Application_Bootstrap_Bootstrapper.                                               (                   , public/index.php)
Zend_Application                                                               :

   •
   •

                                                           ,                                                                                 ,                     :

   •                                                                           include_path
   •                                                                                    ,
   •                              php.ini
   •                                (                              ,                               "Bootstrap")
   •                      -
   •                                                   (                                                                                                   )
   •
   •

                                        ,          Zend_Config                                                                                     .
                                                                                                   Zend_Application       36

Начальная загрузка

                                                Zend_Application
           .
Zend_Application_Bootstrap_Bootstrapper,                                                API:

   1. interface Zend_Application_Bootstrap_Bootstrapper
   2. {
   3.     public function __construct($application);
   4.     public function setOptions(array $options);
   5.     public function getApplication();
   6.     public function getEnvironment();
   7.     public function getClassResources();
   8.     public function getClassResourceNames();
   9.     public function bootstrap($resource = null);
   10.          public function run();
   11.      }

     API                                                                                                         ,
                     ,                                ,                                                      .

                                                ,             Zend_Application_Bootstrap_BootstrapAbstract
                    Zend_Application_Bootstrap_Bootstrap.

                                                                                    ,
                .

Методы ресурсов

Zend_Application_Bootstrap_BootstrapAbstract
       .                                     ,                             _init,                                     .

        ,                                      ,                       bootstrap()
            .                                                 _init.

        ,                                                 ,                                    .         ,
                                ,                                      .

                                         :

   1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
   2. {
   3.     protected function _initFoo()
   4.     {
   5.         // ...
   6.     }
   7.
   8.     protected function _initBar()
   9.     {
   10.               // ...
   11.          }
   12.
   13.          protected function _initBaz()
   14.          {
                                                                                                                 Zend_Application           37

   15.                      // ...
   16.              }
   17.         }

         ,                                     _initFoo(),                              :

   1. $bootstrap->bootstrap('foo');

         ,                           _initFoo()      _initBar(),                                        :

   1. $bootstrap->bootstrap(array('foo', 'bar'));

         ,                                            ,                       bootstrap()                            :

   1. $bootstrap->bootstrap();

Загрузки, использующие плагины ресурсов

         ,                                                                                                                         ,
                                                                          -                             .
                            ,                                 .                                          ,                             ,
                                     ,                                .

                                                            ,
             Zend_Application_Bootstrap_ResourceBootstrapper.                                                            API
                               ,                                                                    :

   1. interface Zend_Application_Bootstrap_ResourceBootstrapper
   2. {
   3.     public function registerPluginResource($resource, $options = null);
   4.     public function unregisterPluginResource($resource);
   5.     public function hasPluginResource($resource);
   6.     public function getPluginResource($resource);
   7.     public function getPluginResources();
   8.     public function getPluginResourceNames();
   9.     public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);
   10.          public function getPluginLoader();
   11.      }

                                                                                                                 ,
                                                                  .

         .

Zend_Application_Bootstrap_BootstrapAbstract ( ,                                ,
Zend_Application_Bootstrap_Bootstrap)                                               ,
       .

         ,                                                ,                                                  ,
                            /            .
                        .                                            ,/                                                        .
                                ,                                   .                           ,            ,                     c Zend
Framework'     ,                             "Zend_Application_Resource_",                  ,                              ,
        Zend_Application   38

.   :
                                                                                                Zend_Application   39



   1. $application = new Zend_Application(APPLICATION_ENV, array(
   2.     'resources' => array(
   3.         'FrontController' => array(
   4.             'controllerDirectory' => APPLICATION_PATH . '/controllers',
   5.         ),
   6.     ),
   7. ));

                 ,                                  "FrontController"                              .

                                                                                            ,
                      ,             .                                            Zend_Loader_PluginLoader,
                                                                                              .

                      ,
APPLICATION_PATH/resources/,                                                 My_Resource.
                                        ,                     :

   1. $application = new Zend_Application(APPLICATION_ENV, array(
   2.     'pluginPaths' => array(
   3.          'My_Resource' => APPLICATION_PATH . '/resources/',
   4.     ),
   5.     'resources' => array(
   6.          'FrontController' => array(
   7.              'controllerDirectory' => APPLICATION_PATH . '/controllers',
   8.          ),
   9.     ),
   10.       ));

                                                                        .

        ,                                       ,                           bootstrap()
             .                                                               ,                                (
        ),                                  .             ,
             .

   1.   // Выполнить один:
   2.   $bootstrap->bootstrap('FrontController');
   3.
   4.   // Выполнить несколько:
   5.   $bootstrap->bootstrap(array('FrontController', 'Foo'));
   6.
   7.   // Выполнить все ресурсы и плагины:
   8.   $bootstrap->bootstrap();

Реестр ресурсов

                 ,        ,                                                                       ,
                                    -                             .                               ?

Zend_Application_Bootstrap_BootstrapAbstract                                                              .
    ,                                   ,                                                   .
                                                                                                            Zend_Application          40

                                                                   "               ";
              ,                     .                                                   ,
                          .                                       Zend_Registry,
                               .                                                                                 setContainer()
getContainer().      getResource($resource)                                                                                       ,
 hasResource($resource) -                   ,                                                           .

                                                :

   1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
   2. {
   3.     protected function _initView()
   4.     {
   5.         $view = new Zend_View();
   6.         // дальнейшая инициализация...
   7.
   8.         return $view;
   9.     }
   10.      }

                                            /                                               :

   1. // Использование пары has/getResource()
   2. if ($bootstrap->hasResource('view')) {
   3.     $view = $bootstrap->getResource('view');
   4. }
   5.
   6. // Через контейнер:
   7. $container = $bootstrap->getContainer();
   8. if (isset($container->view)) {
   9.     $view = $container->view;
   10.      }

                      ,                                                   .                     ,
                              ,                                                .
Zend_Application_Bootstrap_Bootstrap                                                                :
run()                                               "bootstrap"            -                    ,
                          ,             ,                                               .

          ,
                  ,                             :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function init()
   4.     {
   5.         $bootstrap = $this->getInvokeArg('bootstrap');
   6.         $view = $bootstrap->getResource('view');
   7.         // ...
   8.     }
   9. }
                                                                                                              Zend_Application   41

Отслеживание зависимостей

                                                      ,                                                   ,
                        .                                                               ,
                                                                                    .


                            .                                         Zend_Application_Bootstrap_BootstrapAbstract
                                                                                         .

                        ,                    -            ,                ,-
bootstrap($resource),    $resource                                                                        .
$resource         ,                  ,                                                          .

                                                  ,                                         bootstrap()
                                                 .                                                                               .

                                                                                :

   1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
   2. {
   3.     protected function _initRequest()
   4.     {
   5.         // Обеспечение инициализации контроллера
   6.         $this->bootstrap('FrontController');
   7.
   8.         // Извлечение фронт-контроллера из реестра загрузки
   9.         $front = $this->getResource('FrontController');
   10.
   11.              $request = new Zend_Controller_Request_Http();
   12.              $request->setBaseUrl('/foo');
   13.              $front->setRequest($request);
   14.
   15.              // Обеспечение сохранения запроса в реестре загрузки
   16.              return $request;
   17.          }
   18.      }

Плагины ресурсов

                        ,
                                                                                                     .        Zend Framework
                                                                  ,                                  ,
                                                                                            ,
                .

                                                              Zend_Application_Resource_Resource   ,
                            ,                                      Zend_Application_Resource_ResourceAbstract.
                                         :

   1. interface Zend_Application_Resource_Resource
   2. {
   3.     public function __construct($options = null);
   4.     public function setBootstrap(
                                                                                Zend_Application       42

   5.              Zend_Application_Bootstrap_Bootstrapper $bootstrap
   6.         );
   7.         public function getBootstrap();
   8.         public function setOptions(array $options);
   9.         public function getOptions();
   10.               public function init();
   11.           }

                       ,                                                ,
          /                     ,                  /
                  .

                            ,                             ,
              .                                          DOCTYPE,               CSS-      ,
JavaScript,                                                                                        .
      ,                                    ,                                :

   1. class My_Resource_View extends Zend_Application_Resource_ResourceAbstract
   2. {
   3.     protected $_view;
   4.
   5.     public function init()
   6.     {
   7.         // Возвращает вид, таким образом, он будет сохранен в реестре
   8.         return $this->getView();
   9.     }
   10.
   11.          public function getView()
   12.          {
   13.              if (null === $this->_view) {
   14.                  $options = $this->getOptions();
   15.                  $title    = '';
   16.                  if (array_key_exists('title', $options)) {
   17.                      $title = $options['title'];
   18.                      unset($options['title']);
   19.                  }
   20.
   21.                  $view = new Zend_View($options);
   22.                  $view->doctype('XHTML1_STRICT');
   23.                  $view->headTitle($title);
   24.                  $view->headLink()->appendStylesheet('/css/site.css');
   25.                  $view->headScript()->appendfile('/js/analytics.js');
   26.
   27.                  $viewRenderer =
   28.                      Zend_Controller_Action_HelperBroker::getStaticHelper(
   29.                           'ViewRenderer'
   30.                      );
   31.                  $viewRenderer->setView($view);
   32.
   33.                  $this->_view = $view;
   34.              }
   35.              return $this->_view;
   36.          }
   37.      }

                                               ,                                          .
    ,
                  "View",                                                           .
Zend_Application   43
                                                                                                            Zend_Cache              44


Zend_Cache
Введение
Zend_Cache                                                               .

                                         Zend Framework                                          (                     ),
                                                   (              File, Sqlite, Memcache         .),
                                             ,
            (            :"                            ,                                   ").

                 (Zend_Cache_Core)                            ,                                    .                        ,
                               ,                           Zend_Cache_Core: Output, File, Function Class.

Example #1                                                      Zend_Cache::factory()

Zend_Cache::factory()                                                             .
                                  Core             File.

      1. $frontendOptions = array(
      2.    'lifetime' => 7200, // время жизни кэша - 2 часа
      3.    'automatic_serialization' => true
      4. );
      5.
      6. $backendOptions = array(
      7.     'cache_dir' => './tmp/' // директория, в которой размещаются файлы кэша
      8. );
      9.
      10.      // получение объекта Zend_Cache_Core
      11.      $cache = Zend_Cache::factory('Core',
      12.                                   'File',
      13.                                   $frontendOptions,
      14.                                   $backendOptions);

Note:                                    ,
                                                            ,                                     ,        , 'ZendPlatform'.
                                             ,                                               ,         ,         (' '),   ('-
'),             ('.').

Example #2

        ,                     ,                                                   ,                            .                ,
                                                                                  .
                                                  :                                                                ,
                 .

      1. // $cache определен в предыдущем примере
      2.
      3. // проверка, есть ли уже запись в кэше:
      4. if(!$result = $cache->load('myresult')) {
      5.
      6.     // промах кэша
                                                                                                         Zend_Cache       45

   7.            // установка соединения с базой данных
   8.
   9.            $db = Zend_Db::factory( [...] );
   10.
   11.                        $result = $db->fetchAll('SELECT * FROM huge_table');
   12.
   13.                        $cache->save($result, 'myresult');
   14.
   15.                } else {
   16.
   17.                        // попадание в кэш
   18.                        echo "This one is from cache!\n\n";
   19.
   20.                }
   21.
   22.                print_r($result);

Example #3                                                                 Zend_Cache

                                      ,                                                     ,                         ,
                                          start()   end().
                  .

                                                     —                                  ,
end().                                                                          ,
         (                ,                                  ).

   1. $frontendOptions = array(
   2.    'lifetime' => 30,                   // время жизни кэша - 30 секунд
   3.    'automatic_serialization' => false // уже установлено по умолчанию
   4. );
   5.
   6. $backendOptions = array('cache_dir' => './tmp/');
   7.
   8. $cache = Zend_Cache::factory('Output',
   9.                              'File',
   10.                                   $frontendOptions,
   11.                                   $backendOptions);
   12.
   13.      // передаем уникальный идентификатор методу start()
   14.      if(!$cache->start('mypage')) {
   15.          // производим вывод, как обычно:
   16.
   17.          echo 'Hello world! ';
   18.          echo 'This is cached ('.time().') ';
   19.
   20.          $cache->end(); // выходные данные сохранены и отправлены броузеру
   21.      }
   22.
   23.      echo 'This is never cached ('.time().').';

                              ,                                   time()    -
                                  .                                                             ,                ,
                                          ,                                                                  .
             ,
             .                ,                              (                                      30           )
                                                                                                                               Zend_Cache                46

                                                     ,                                               ,
                                                .

Note:                             Zend_Cache,                                                            (                                       save()
 start()).                                                                                       ,
                                  ,    ,                     ,                                       .

Теория кэширования
                                       Zend_Cache.                    —                                      (            ),
                                                   .                  —                   'lifetime',
                              ;                ,                                                                                         "           ".
                  —                              ,                                  ,
                   ,                                                      .                                               (                  ,
Zend_Cache_Core::get())                                               ,                       FALSE                              ,
                                            .                                                                                                        ,
                         (                                       )                if(){ ... },
Zend_Cache.                                                                   ,                                       (                  ,
        Zend_Cache_Core::save()).

Note:                                                                                                            ,
                      (               , Function).

Note: "                         "—                                                        ,                                          ,
             "                "(                         ,                                                       ).
"            ".                             "                    ",                                                       ,
                      .                         ,                 "       ",
     .

Фабричный метод Zend_Cache

                                                                                        Zend_Cache
                          :

    1. // Выбираем бэкэнд (например, 'File' или 'Sqlite'...)
    2. $backendName = '[...]';
    3.
    4. // Выбираем фронтэнд (например, 'Core', 'Output', 'Page'...)
    5. $frontendName = '[...]';
    6.
    7. // Устанавливаем массив опций для выбранного фронтэнда
    8. $frontendOptions = array([...]);
    9.
    10.      // Устанавливаем массив опций для выбранного бэкэнда
    11.      $backendOptions = array([...]);
    12.
    13.      // Создаем экземпляр
    14.      // (два последних аргумента являются необязательными)
    15.      $cache = Zend_Cache::factory($frontendName,
    16.                                   $backendName,
    17.                                   $frontendOptions,
    18.                                   $backendOptions);
                                                                                                              Zend_Cache       47

                                                    ,                   $cache                                        ,
                          ,       ,                         ,                                                              .

Note:                         Zend_Cache::factory()                                                       .
                                                                                     ,                .

Добавление тегов к записям

                                                                .
save(),                                                             .
     ,                                (        ).

   1. $cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));

Note:            save()                                                                    : $specificLifetime.
        FALSE,                                                                   .

Очистка кэша

           ,                                                                                                          ,
                                remove():

   1. $cache->remove('idToRemove');

           ,                                                                                                      ,
                                clean().                ,                                       :

   1.     // удаление всех записей
   2.     $cache->clean(Zend_Cache::CLEANING_MODE_ALL);
   3.
   4.     // удаление только устаревших записей
   5.     $cache->clean(Zend_Cache::CLEANING_MODE_OLD);

                                           ,                        'tagA'   'tagC':

   1. $cache->clean(
   2.     Zend_Cache::CLEANING_MODE_MATCHING_TAG,
   3.     array('tagA', 'tagC')
   4. );

                                          ,                             'tagA'       'tagC': If you want to remove cache
entries not matching the tags 'tagA' or 'tagC':

   1. $cache->clean(
   2.     Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG,
   3.     array('tagA', 'tagC')
   4. );

                                           ,                        'tagA'           'tagC':

   1. $cache->clean(
   2.     Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
   3.     array('tagA', 'tagC')
                                                                                                                           Zend_Cache        48

   4. );

                           : CLEANING_MODE_ALL (                      ), CLEANING_MODE_OLD (
          ), CLEANING_MODE_MATCHING_TAG (                                     )
CLEANING_MODE_NOT_MATCHING_TAG (                                         ).            ,                                                 ,
                                 .




                        Zend_Cache
Zend_Cache_Core
Введение
           Zend_Cache_Core                   ,                                        .
                                                 .

Note:                                    Zend_Cache_Core,                                                              ,
     ,                                                                                             .

Доступные опции

                                         ,                                                                     .

                                                 Zend_Cache_Core


                                                             /                                         (
caching                 Boolean TRUE
                                                                                                                               ).
                                                                                                                           .
                                                                     NULL,                                                               .

                                                                                      ,
cache_id_prefix         String    NULL                                           -                                                      .
                                                                                          -
                                                                                                           ,

                                                                 .
                                                                             (                ),                                    NULL,
lifetime                Integer   3600
                                                                                                                   .
                                                                             TRUE,
logging                 Boolean FALSE
                                                      Zend_Log (                                                                        ).
                                                         /                                                     (
write_ ontrol           Boolean TRUE
                                                        ),                       write_control
                                                                                                         Zend_Cache               49

                                             Zend_Cache_Core


                                                                 ,                      .
                                                                                                                 ,
                                                                                .
                                                         /                                                               ,
automatic_serialization   Boolean FALSE                                                                                           ,
                                                                                                (                            ).
                                                             /
                                               (                         ): 0         ,
                                                                               ,1
automatic_cleaning_factor Integer   10
                                                                     , x (integer) > 1               ,
                                                                                                         1           x
                                                                     .
                                                                 true,                                                   PHP-
ignore_user_abort         Boolean FALSE             ignore_user_abort                           save()
                                                                                                 .

Примеры

                                                                 .

                                         (     automatic_serialization
                 ),                                                                         ,                :

   1. // предполагается, что переменная $cache уже установлена
   2.
   3. $id = 'myBigLoop'; // идентификатор того, что мы хотим закэшировать
   4.
   5. if (!($data = $cache->load($id))) {
   6.     // промах кэша
   7.
   8.     $data = '';
   9.     for ($i = 0; $i < 10000; $i++) {
   10.              $data = $data . $i;
   11.          }
   12.
   13.          $cache->save($data);
   14.
   15.      }
   16.
   17.      // [...] делаем что-либо с данными (отображение, передача и т.д.)

                                                                                    ,                                :

   1.   // убедитесь, что используете уникальные идентификаторы:
   2.   $id1 = 'foo';
   3.   $id2 = 'bar';
   4.
   5.   // блок 1
   6.   if (!($data = $cache->load($id1))) {
   7.       // промах кэша
                                                                             Zend_Cache          50

8.
9.    $data = '';
10.         for ($i=0;$i<10000;$i++) {
11.             $data = $data . $i;
12.         }
13.
14.         $cache->save($data);
15.
16.      }
17.      echo($data);
18.
19.      // эта часть не кэшируется
20.      echo('НЕ КЭШИРУЕТСЯ! ');
21.
22.      // блок 2
23.      if (!($data = $cache->load($id2))) {
24.          // промах кэша
25.
26.         $data = '';
27.         for ($i=0;$i<10000;$i++) {
28.             $data = $data . '!';
29.         }
30.
31.         $cache->save($data);
32.
33.      }
34.      echo($data);

                                         (                          "automatic_serialization")
             ,                  ,                ,              .
                                                     .

1. // Копмпактная форма. Не подходит, если могут кэшироваться
2. // пустые строки и значения булевого типа
3. if (!($data = $cache->load($id))) {
4.
5.     // промах кэша
6.
7.     // [...] получаем данные и присваиваем их переменной $data
8.
9.     $cache->save($data);
10.
11.      }
12.
13.      // делаем что-либо с данными
14.
15.      // [...]
16.
17.      // Полная форма, будет работать в любом случае
18.      if (!($cache->test($id))) {
19.
20.          // промах кэша
21.
22.          // [...] получаем данные и присваиваем их переменной $data
23.
24.          $cache->save($data);
25.
26.      } else {
27.
28.          // попадание в кэш
                                                                                    Zend_Cache   51

   29.
   30.          $data = $cache->load($id);
   31.
   32.      }
   33.
   34.      // делаем что-либо с данными


Zend_Cache_Frontend_Output
Введение
Zend_Cache_Frontend_Output                   ,                               .
                   (output buffering) PHP                    ,
start() end().

Доступные опции

                           -                         ,                  Zend_Cache_Core.

Примеры

                                                 .                                  :

   1. // если имеет место промах кэша,
   2. // то начинается буферизация вывода
   3. if (!($cache->start('mypage'))) {
   4.
   5.     // все выводится, как обычно
   6.     echo 'Hello world! ';
   7.     echo 'This is cached ('.time().') ';
   8.
   9.     $cache->end(); // завершение буферизации вывода
   10.
   11.      }
   12.
   13.      echo 'This is never cached ('.time().').';

                   ,
                                                         .

Zend_Cache_Frontend_Function
Введение
Zend_Cache_Frontend_Function                                        .
              call(),                                                                .

Доступные опции
                                     Zend_Cache_Frontend_Function
                                                                                                          Zend_Cache      52

                                                    Zend_Cache_Frontend_Function


                                                                                   true,
cache_by_default           Boolean       TRUE
                                                                                    .
cached_functions           Array                                                            ,                         .
                                                                                            ,
non_cached_functions Array
                                                                                       .

Примеры

             call()                        ,        call_user_func_array() PHP:

   1.   $cache->call('veryExpensiveFunc', $params);
   2.
   3.   //    $params является массивом
   4.   //    Например, если нужно вызвать с кэшированием
   5.   //    veryExpensiveFunc(1, 'foo', 'bar'),
   6.   //    то вы должны использовать
   7.   //    $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))

Zend_Cache_Frontend_Function                                            ,
       ,            ,                                     .

Note:                                                         ,                                                   ,
                  array(), echo(), empty(), eval(), exit(), isset(), list(), print()       unset().

Zend_Cache_Frontend_Class
Введение
Zend_Cache_Frontend_Class                            Zend_Cache_Frontend_Function                 ,
                                                .

Доступные опции
                                                     Zend_Cache_Frontend_Class


                                                                                                      ,
cached_entity
                          Mixed
(required)                                                                        ;                           ,
                                                                                                  .
                                                                                 TRUE,
cache_by_default          Boolean TRUE
                                                                        .
cached_methods     Array                                                    ,                                         .
non_cached_methods Array                                                    ,                                             .
                                                                     Zend_Cache   53

Примеры

                              :

   1. <?php
   2. class Test {
   3.
   4.     // Статический метод
   5.     public static function foobar($param1, $param2) {
   6.          echo "foobar_output($param1, $param2)";
   7.          return "foobar_return($param1, $param2)";
   8.     }
   9.
   10.      }
   11.
   12.      // [...]
   13.      $frontendOptions = array(
   14.           'cached_entity' => 'Test' // имя класса
   15.      );
   16.      // [...]
   17.
   18.      // Кэшируемый вызов
   19.      $result = $cache->foobar('1', '2');

                                   :

   1. class Test {
   2.
   3.     private $_string = 'hello !';
   4.
   5.     public function foobar2($param1, $param2) {
   6.          echo($this->_string);
   7.          echo "foobar2_output($param1, $param2)";
   8.          return "foobar2_return($param1, $param2)";
   9.     }
   10.
   11.      }
   12.
   13.      // [...]
   14.      $frontendOptions = array(
   15.           'cached_entity' => new Test() // экземпляр класса
   16.      );
   17.      // [...]
   18.
   19.      // Кэшируемый вызов
   20.      $result = $cache->foobar2('1', '2');


Zend_Cache_Frontend_File
Введение
Zend_Cache_Frontend_File                 ,                           "
     ".                                                        .
              .
                                                                                               Zend_Cache     54

          ,                                       XML.                       ,
                    (       Zend_Config).                Zend_Cache_Frontend_File
                             ,                                                                   XML.
                                                  -                             XML               ,
                                         .

Доступные опции
                                               Zend_Cache_Frontend_File




master_file (
                           String   ''
                    )
master_files               Array    array()
                                                                        Zend_Cache_Frontend_File::MODE_
                                                                        AND
                                                                        Zend_Cache_Frontend_File::MODE_
                                                                        OR;    MODE_AND,
                                    Zend_Cache_Frontend_File::MODE
master_files_mode          String   _OR                                     ,
                                                                                                 MODE_OR,

                                                                                           ,

                                                                                    TRUE,
ignore_missing_master_fil Boolea FALSE
                                                                                                          ,
es                        n

Примеры

                                         ,    Zend_Cache_Core.                                   ,
                ,                   —            masterFile                            .

Zend_Cache_Frontend_Page
Введение
Zend_Cache_Frontend_Page          Zend_Cache_Frontend_Output,
             . Zend_Cache_Frontend_Page                                                                 .

                                                                 $_SERVER['REQUEST_URI']              (
                        ) $_GET, $_POST, $_SESSION, $_COOKIE, $_FILES.         ,
                                ( start()),       end()                      ,
                .
                                                                                                         Zend_Cache       55

                                                                  HTTP
             (                               HTTP 304 Not Modified,
                                        ).

Доступные опции
                                               Zend_Cache_Frontend_Page


                                                                                      HTTP (
http_conditional   Boolean FALSE
                                                                 )
                                                                     TRUE,
debug_header       Boolean FALSE
                                                                                            .
                                                                               ,                                      :

                                                    •   (boolean, true                 ) cache:           TRUE,

                                                    •   (boolean, false                 )
                                                        cache_with_get_variables:           TRUE,
                                                                  ,                             $_GET

                                                    •   (boolean, false                 )
                                                        cache_with_post_variables:              TRUE,
                                                                  ,                             $_POST

                                                    •   (boolean, false              )
                                                        cache_with_session_variables:     TRUE,
                                                                  ,                    $_SESSION

                                                    •   (boolean, false                 )
                           array(...                    cache_with_files_variables:             TRUE,
default_options    Array
                                 ...)                             ,                             $_FILES

                                                    •   (boolean, false              )
                                                        cache_with_cookie_variables:     TRUE,
                                                                  ,                    $_COOKIE

                                                    •   (boolean, true              )
                                                        make_id_with_get_variables:              TRUE,

                                                                $_GET
                                                    •   (boolean, true             )
                                                        make_id_with_post_variables:              TRUE,

                                                                $_POST
                                                    •   (boolean, true             )
                                                        make_id_with_session_variables:             TRUE,

                                                                 $_SESSION
                                                                                             Zend_Cache   56

                                          Zend_Cache_Frontend_Page


                                              •   (boolean, true              )
                                                  make_id_with_files_variables:          TRUE,

                                                          $_FILES
                                              •   (boolean, true             )
                                                  make_id_with_cookie_variables:           TRUE,

                                                             $_COOKIE
                                              •   (int, false              ) specific_lifetime:
                                                  FALSE,                           ,
                                                                ,

                                              •   (array, array()                ) tags:

                                              •   (int, null               ) priority:             .

                                                                       .


                                                       REQUEST_URI.
                                                                (PCRE),                     —
                                                                                     ,
                                                             $_SERVER['REQUEST_URI']
                                                                   ,
regexps            Array    array()
                                                                          ( . default_options
                                                                   ).
                                           $_SERVER['REQUEST_URI']
                                                               ,
                                                .
                                                               HTTP-        .
memorize_headers Array      array()
                                                                   .

Примеры

               Zend_Cache_Frontend_Page                        :

   1.   // [...]
   2.
   3.   $cache->start();
   4.   // если есть попадание в кэш, то результат отправляется броузеру
   5.   // и выполнение скрипта на этом прекращается
   6.
   7.   // остальная часть страницы ...

                        ,
                    (         ,                   Zend_Controller).
                                                                               Zend_Cache   57

 1. /*
 2. * Вы должны избегать слишком большого количества строк кода перед этим участком
 3. * кэша. Например, для наибольшей производительности "require_once" или
 4. * "Zend_Loader::loadClass" должны находиться после кэшируемого участка
 5. */
 6.
 7. $frontendOptions = array(
 8.    'lifetime' => 7200,
 9.    'debug_header' => true, // для отладки
 10.         'regexps' => array(
 11.             // кэширование всего IndexController
 12.             '^/$' => array('cache' => true),
 13.
 14.             // кэширование всего IndexController
 15.             '^/index/' => array('cache' => true),
 16.
 17.             // не кэшируем ArticleController...
 18.             '^/article/' => array('cache' => false),
 19.
 20.             // ...но кэшируем действие "view" контроллера ArticleController
 21.             '^/article/view/' => array(
 22.                 'cache' => true,
 23.
 24.                 // кэшируем, даже если есть переменные $_POST
 25.                 'cache_with_post_variables' => true,
 26.
 27.                 // но кэш будет зависеть от массива $_POST
 28.                 'make_id_with_post_variables' => true,
 29.             )
 30.         )
 31.      );
 32.
 33.      $backendOptions = array(
 34.          'cache_dir' => '/tmp/'
 35.      );
 36.
 37.      // получение объекта Zend_Cache_Frontend_Page
 38.      $cache = Zend_Cache::factory('Page',
 39.                                   'File',
 40.                                   $frontendOptions,
 41.                                   $backendOptions);
 42.
 43.      $cache->start();
 44.      // если есть попадание в кэш, результат отправляется броузеру,
 45.      // и выполнение скрипта на этом завершается
 46.
 47.      // [...] конец загрузочного файла
 48.      // (этот код не исполняется, если есть попадание в кэш)


Отмена кэширования
                                                                       -          ,
                       ,        HTTP 200.                          cancel():

 1. // [...]
 2.
 3. $cache->start();
 4.
 5. // [...]
                           Zend_Cache   58

6.
7. if ($someTest) {
8.     $cache->cancel();
9.     // [...]
10.      }
11.
12.      // [...]
                                                                                                                               Zend_Cache                       59


                    Zend_Cache
                         :                              .
                                 .

Zend_Cache_Backend_File
                                                            (                                                 ).

Доступные опции:
                                                 Zend_Cache_Backend_File


cache_dir                    String    '/tmp/'                              ,
                                                                        /                                                       .
                                                                                                                                                        ,
file_locking                 Boolean TRUE
                                                                                                                                    -
                                                                                          NFS...
                                                                        /                                              .                                ,
read_control                 Boolean TRUE
                                                                                                          ,
                                                                .
                                                                                              (
                                                       readControl).                                          : 'md5' (                        ,
                                                                                          ), 'crc32' (                                                      ,
read_control_type            String    'crc32'
                                                                                          ,                  ), 'adler32' (
                                                                                ,               ,      crc32), 'strlen'
                                                                                        (                   ).
                                                                                                                           :0
                                                                        "                                                                      ", 1
                                                       —"                                             ", 2 — "                          "...
hashed_directory_level       Integer   0
                                                                                .
                                                                                                                           .                       ,1
                                                            2                                                                             .
hashed_directory_umask       Integer   0700
                                                                                                  .
                                                                                                      .
                                                                    ,
file_name_prefix             String    'zend_cache'                                                                (                , /tmp)

                                                                                    .
cache_file_umask             Integer   0700            umask

metatadatas_array_max_size Integer     100                                      (
                                                                ,                         )
                                                                                                         Zend_Cache          60


Zend_Cache_Backend_Sqlite
                                                                       SQLite.

Доступные опции:
                                                Zend_Cache_Backend_Sqlite


cache_db_complete_path
                               String    NULL                              (                 )                    SQLite.
(           )
                                                                       /                                                     .

                                                       (                           )                           clean()
                                                       delete(): 0 -                                              ;1-
automatic_vacuum_factor        Integer   10
                                                                                        (
                                                       delete()        clean()); x (                           1) -

                                                                  1            x                     clean()     delete().

Zend_Cache_Backend_Memcached
                                                               memcached. » memcached —
                                                                                      .                  ,
                           ,                                     memcached »                          PECL
memcached.

                  :                                                                              ,
             "doNotTestCacheValidity=true".

Доступные опции:
                                              Zend_Cache_Backend_Memcached


                                                                                       memcached;
                                                                                               : 'host' => (string) :
                                                                        memcached, 'port' => (int) :
                      array(array('host' => 'localhost',
                                                           memcached, 'persistent' => (bool) :
                      'port' => 11211, 'persistent' =>
                                                                                                      , 'weight' =>
servers       Array   true, 'weight' => 1, 'timeout' => 5,
                                                           (int) :           memcached, 'timeout' => (int) :
                      'retry_interval' => 15, 'status' =>
                                                                           memcached, 'retry_interval' => (int) :
                      true, 'failure_callback' => '' ))
                                                                                                         , 'status' =>
                                                           (bool) :                memcached, 'failure_callback'
                                                           => (callback) :                             memcached
                                                           TRUE,                                                   "
compression Boolean FALSE
                                                                 "
                                                           TRUE,
compatibility Boolean FALSE
                                                                                                        memcache
                                                                                                                         Zend_Cache        61


Zend_Cache_Backend_Apc
                                                                                                                                   » APC
(Alternative PHP Cache —                               PHP),                    ,                      ,
                                .

                   :                                                                                       ,
              "doNotTestCacheValidity=true".

                                                .

Zend_Cache_Backend_Xcache
                                                                                                                 » XCache,
                                                                                    .

                   :                                                                                       ,
              "doNotTestCacheValidity=true".

Доступные опции:
                                                Zend_Cache_Backend_Xcache


user        String     NULL                         xcache.admin.user,                                              clean()
                                                    xcache.admin.pass -                                                       ,
password String        NULL
                                                                                             clean()

Zend_Cache_Backend_ZendPlatform
                         API » Zend Platform                                                     .              ,
                                                       Zend Platform.

                                    ,                                                            CLEANING_MODE_NOT_MATCHING_TAG.

                         ,                                     '-', '.', ' ',           '_'                    'Zend'     'Platform',
                             Zend_Cache::factory():

    1. $cache = Zend_Cache::factory('Core', 'Zend Platform');

                                                .

Zend_Cache_Backend_TwoLevels
                                                       .                                                                           :
        ,                                                                       ,               (Apc, Memcache          .),
"             ",                            ,              (File, Sqlite                .)
                                                                                                                  Zend_Cache       62

                                  priority (                                                                              )
                                                                                                              .

Доступные опции:
                                           Zend_Cache_Backend_TwoLevels


slow_backend                  String     File                    "                   "
fast_backend                  String     Apc                     "               "
slow_backend_options          Array      array()                         "                   "
fast_backend_options          Array      array()                         "               "
                                                                 TRUE,                       slow_backend
                                                                                         ,
slow_backend_custom_naming Boolean FALSE
                                                          "Zend_Cache_Backend_[...]".
                                                               TRUE,           fast_backend
                                                                          .      FALSE,
fast_backend_custom_naming Boolean FALSE
                                                          "Zend_Cache_Backend_[...]".
                                                               TRUE,
slow_backend_autoload         Boolean FALSE                                        require_once (
                                                                                                                              ).
                                                                 TRUE,
fast_backend_autoload         Boolean FALSE                                                      require_once (
                                                                                                                              ).
                                                                 TRUE,
auto_refresh_fast_cache       Boolean TRUE
                                                                         "               "                                     .

                                                                                     ,
                                                                         .
stats_update_factor           Integer    10
                                                                                                          1           x
                                                             .

Zend_Cache_Backend_ZendServer_Disk и
Zend_Cache_Backend_ZendServer_ShMem
                                                                                                              » Zend Server.

                 -                                                                       ,          ,
"doNotTestCacheValidity=true".

                                        Zend Server                  ,                                  HTTP       HTTPS,
                          ,                                                  .

                                                      .
                                                                                                 Zend_Config       63


Zend_Config
Введение
Zend_Config                   ,
                                          .
                                                                                                  .
                                                                                         ,
                                      .                       Zend_Config
                          ,                                        : Zend_Config_Ini   Zend_Config_Xml.

Example #1                    Zend_Config

                     ,                                                     ,           , Zend_Config_Ini
Zend_Config_Xml.                                                                        PHP,
                         Zend_Config,                                                               -
                             .

    1. // Массив конфигурационных данных
    2. $configArray = array(
    3.     'webhost' => 'www.example.com',
    4.     'database' => array(
    5.          'adapter' => 'pdo_mysql',
    6.          'params' => array(
    7.              'host'      => 'db.example.com',
    8.              'username' => 'dbuser',
    9.              'password' => 'secret',
    10.                    'dbname'   => 'mydatabase'
    11.               )
    12.           )
    13.      );
    14.
    15.      // Создание объектно-ориентированной обертки для конфигурационных данных
    16.      require_once 'Zend/Config.php';
    17.      $config = new Zend_Config($configArray);
    18.
    19.      // Вывод элемента конфигурационных данных (результатом будет 'www.example.com')
    20.      echo $config->webhost;
    21.
    22.      // Использование конфигурационных данных для соединения с базой данных
    23.      $db = Zend_Db::factory($config->database->adapter,
    24.                               $config->database->params->toArray());
    25.
    26.      // Альтернативный способ - просто передавайте объект Zend_Config.
    27.      // Фабрика Zend_Db знает, как его интерпретировать.
    28.      $db = Zend_Db::factory($config->database);

                                              , Zend_Config                                               ,
                                  ,                                                          .

              -                                                        , Zend_Config
get(),                                                          ,                                     .        :
                                                                                                            Zend_Config           64

   1. $host = $config->database->get('host', 'localhost');

Example #2                            Zend_Config                                      PHP

                                                                      ,            "         " PHP.
              ,                                     :

   1. // config.php
   2. return array(
   3.     'webhost' => 'www.example.com',
   4.     'database' => array(
   5.          'adapter' => 'pdo_mysql',
   6.          'params' => array(
   7.              'host'      => 'db.example.com',
   8.              'username' => 'dbuser',
   9.              'password' => 'secret',
   10.                    'dbname'   => 'mydatabase'
   11.               )
   12.           )
   13.      );

   1.   // Использование конфигурации
   2.   $config = new Zend_Config(require 'config.php');
   3.
   4.   // Вывод элемента конфигурационных данных (результатом будет 'www.example.com')
   5.   echo $config->webhost;


Теоретические основы работы с Zend_Config
                                                                     Zend_Config                                   ,
                                               ,                                                                              .

                      Zend_Config.                                                                              Zend_Config
                                              , . .
          .

                                                                                                      Zend_Config.
                                                  .                                      ,
                                           Zend_Config,                                                 .
                                  , . .,
                  .

Zend_Config                                        Countable   Iterator        ,
                                    .                              Zend_Config                                  » count()
                                  PHP,         » foreach.

                              Zend_Config                                                                   ,
                      (          , $config->database->host = 'example.com')                            .                  ,
                                                                         ,
                                     .                                 , Zend_Config
                                ( . . unset($config->database->host)).      readOnly()
                          ,                                                    Zend_Config.                 setReadOnly()
                                                                                                                                               Zend_Config          65

                                                                            Zend_Config,
                    .

Note:
                                              .
                                                                  Zend_Config.

        .

                                                                   Zend_Config, ,                           ,                                              .

                                Zend_Config                                                                                            ,
            .                             Zend_Config                                                                                      ,
                                             (                                        ).

                               Zend_Config                                                                                ,
                                                                                            .                                     ,
                                                                                                                                           .
                                                      ,                                                               .
            PHP,                                                                                        ,
              . .,                                                          ( . .            C                                                         A       B)
                          .

                                 Zend_Config,                                                                       ,                                  merge().
                ,      $config $localConfig                                                                       $localConfig                            $config,
                $config->merge($localConfig).                                       $localConfig
                $config.

Note:                   Zend_Config,                                                            ,
                                                  TRUE                                                                        .                ,
                                                  ,                                         setReadOnly()
                                        .

Zend_Config_Ini
Zend_Config_Ini
                                        INI
            .                 INI
                                                                                             .
                                                                                           (".").
                                                                                                                (":")                              ,
                                    ,                     .

Note:                                                     INI-
Zend_Config_Ini                                                   PHP » parse_ini_file().                         ,                                             ,
                                                                                                    ,
Zend_Config_Ini —                             ,               ,                                                                   "TRUE", "FALSE", "yes",
"no" "NULL".
                                                                                                                   Zend_Config       66

Note:
                                                                                    (".").
                                    'nestSeparator'                $options                           Zend_Config_Ini.
            :

   1. $options['nestSeparator'] = ':';
   2. $config = new Zend_Config_Ini('/path/to/config.ini',
   3.                               'staging',
   4.                               $options);

Example #1                                  Zend_Config_Ini

                                                                  Zend_Config_Ini
            INI.
                                .
                                              ,   "                      " (staging)                      "                      "
(production)               .                                                    , . .                          —
"                          "                          "                         ",
                       .                ,                                                         /path/to/config.ini:

   1. ; Конфигурационные данные производственного сайта
   2. [production]
   3. webhost                  = www.example.com
   4. database.adapter         = pdo_mysql
   5. database.params.host     = db.example.com
   6. database.params.username = dbuser
   7. database.params.password = secret
   8. database.params.dbname   = dbname
   9.
   10.      ; Конфигурационные данные промежуточного сайта наследуются от
   11.      ; данных производственного и подменяют их при необходимости.
   12.      [staging : production]
   13.      database.params.host     = dev.example.com
   14.      database.params.username = devuser
   15.      database.params.password = devsecret

                           ,                                                    "                 "
            INI.                                  ,                INI                       ,                :

   1. $config = new Zend_Config_Ini('/path/to/config.ini', 'staging');
   2.
   3. echo $config->database->params->host;   // выведет "dev.example.com"
   4. echo $config->database->params->dbname; // выведет "dbname"

Note:

                                                                                Zend_Config_Ini

$filename       INI-
                               INI-           ,                                         .                                NULL
$section                                                      .
                                                          .
                                                                                                                  Zend_Config     67

                                                                       Zend_Config_Ini

                                 .                                                 :

                  •    allowModifications:                             TRUE,
$options =
                                                               .                                              FALSE
false
                  •    nestSeparator:                      ,                                                          .
                                          "."


Zend_Config_Xml
Zend_Config_Xml
       XML                                                                                            .
                       XML                                                                   .
XML                                                                .                   XML
                                                                                                              .
                                                                                                          .
                                                    extends,                                                              ,
                                                        .

Note:
                                 ,                 Zend_Config_Xml,                                                           .
                                                                                                      .

Example #1                           Zend_Config_Xml

                                                               Zend_Config_Xml
                      XML.
                             .
                                                                       ,       "                  " (staging)
              "                         " (production)         .                                                          , . .
                  —"                           "                           "                     ",
                                           .           ,
/path/to/config.xml:

   1. <?xml version="1.0"?>
   2. <configdata>
   3.     <production>
   4.         <webhost>www.example.com</webhost>
   5.         <database>
   6.              <adapter>pdo_mysql</adapter>
   7.              <params>
   8.                  <host>db.example.com</host>
   9.                  <username>dbuser</username>
   10.                       <password>secret</password>
   11.                       <dbname>dbname</dbname>
   12.                   </params>
   13.               </database>
   14.          </production>
   15.          <staging extends="production">
                                                                                   Zend_Config       68

  16.                 <database>
  17.                     <params>
  18.                         <host>dev.example.com</host>
  19.                         <username>devuser</username>
  20.                         <password>devsecret</password>
  21.                     </params>
  22.                 </database>
  23.             </staging>

                   ,                                        "                  "
        XML.                       ,                XML                    ,       :

  1. $config = new Zend_Config_Xml('/path/to/config.xml', 'staging');
  2.
  3. echo $config->database->params->host;   // выведет "dev.example.com"
  4. echo $config->database->params->dbname; // выведет "dbname"

Example #2                         Zend_Config_Xml

Zend_Config_Xml                                                                                  .
                                       .                        extends   value
                                           (value
        ),                                          .
                                           ,                                             :

  1. <?xml version="1.0"?>
  2. <configdata>
  3.     <production webhost="www.example.com">
  4.         <database adapter="pdo_mysql">
  5.              <params host="db.example.com" username="dbuser" password="secret"
  6.                      dbname="dbname"/>
  7.         </database>
  8.     </production>
  9.     <staging extends="production">
  10.               <database>
  11.                   <params host="dev.example.com" username="devuser"
  12.                           password="devsecret"/>
  13.               </database>
  14.          </staging>
  15.      </configdata>

                                                        ,                                    ,
                               .                                   ,
        value:

  1. <?xml version="1.0"?>
  2. <configdata>
  3.     <production>
  4.         <webhost>www.example.com</webhost>
  5.         <database>
  6.              <adapter value="pdo_mysql"/>
  7.              <params>
  8.                  <host value="db.example.com"/>
  9.                  <username value="dbuser"/>
  10.                       <password value="secret"/>
  11.                       <dbname value="dbname"/>
  12.                   </params>
                                                                    Zend_Config       69

  13.              </database>
  14.          </production>
  15.          <staging extends="production">
  16.              <database>
  17.                  <params>
  18.                      <host value="dev.example.com"/>
  19.                      <username value="devuser"/>
  20.                      <password value="devsecret"/>
  21.                  </params>
  22.              </database>
  23.          </staging>
  24.      </configdata>

Note:                 XML
Zend_Config_Xml                     XML                         ,                 ,
        ,             .
                   '<?xml':

  1. $string = <<<EOT
  2. <?xml version="1.0"?>
  3. <config>
  4.     <production>
  5.          <db>
  6.               <adapter value="pdo_mysql"/>
  7.               <params>
  8.                   <host value="db.example.com"/>
  9.               </params>
  10.                </db>
  11.           </production>
  12.           <staging extends="production">
  13.                <db>
  14.                     <params>
  15.                         <host value="dev.example.com"/>
  16.                     </params>
  17.                </db>
  18.           </staging>
  19.      </config>
  20.      EOT;
  21.
  22.      $config = new Zend_Config_Xml($string, 'staging');
                                                                                                          Zend_Config_Writer            70


Zend_Config_Writer
Zend_Config_Writer                                                                                     Zend_Config.
                                         ,                   ,                                     .
Zend_Config_Writer                                                ,                                                .
                                                    ,                                 filename (               )       config
(                                   ).                                  write()             ,
        .                                    $filename      $config                                    write().
                Zend_Config_Writer                                                :

    •       Zend_Config_Writer_Array
    •       Zend_Config_Writer_Ini
    •       Zend_Config_Writer_Xml

                             Zend_Config_Writer_Ini                                                                    nestSeparator,
                                      -                                  .                                 ,
Zend_Config_Ini.

                                               Zend_Config                                 .         ,
                         ,                                            Zend_Config                (->).         ,
                                         ,                                 ("$config->branch = array()").        ,
            ,                                           ,                     setExtend()                 Zend_Config.

Example #1                           Zend_Config_Writer

                                                        Zend_Config_Writer_Xml
                                :

    1. // Создание объекта конфигурации
    2. $config = new Zend_Config(array(), true);
    3. $config->production = array();
    4. $config->staging    = array();
    5.
    6. $config->setExtend('staging', 'production');
    7.
    8. $config->production->db = array();
    9. $config->production->db->hostname = 'localhost';
    10.      $config->production->db->username = 'production';
    11.
    12.      $config->staging->db = array();
    13.      $config->staging->db->username = 'staging';
    14.
    15.      // Вы можете записать конфигурационный файл одним из следующих способов:
    16.      // а)
    17.      $writer = new Zend_Config_Writer_Xml(array('config'   => $config,
    18.                                                 'filename' => 'config.xml'));
    19.      $writer->write();
    20.
    21.      // б)
    22.      $writer = new Zend_Config_Writer_Xml();
    23.      $writer->setConfig($config)
    24.             ->setFilename('config.xml')
    25.             ->write();
                                                                         Zend_Config_Writer   71

    26.
    27.       // в)
    28.       $writer = new Zend_Config_Writer_Xml();
    29.       $writer->write('config.xml', $config);

                                           XML-         "          " (staging)
"                  " (production)      ,                                             .

Example #2

                                                                                 .

    1. // Загрузка всех разделов из существующего конфигурационного файла с
    2. // пропуском "расширений"
    3. $config = new Zend_Config_Ini('config.ini',
    4.                               null,
    5.                               array('skipExtends'         => true,
    6.                                     'allowModifications' => true));
    7.
    8. // Изменение значения
    9. $config->production->hostname = 'foobar';
    10.
    11.      // Сохранение
    12.      $writer = new Zend_Config_Writer_Ini(array('config'    => $config,
    13.                                                 'filename' => 'config.ini'));
    14.      $writer->write();

Note:

                             ,                              .
skipExtends             .
                                                                                            Zend_Controller        72


Zend_Controller
Zend_Controller - Быстрый старт
Введение
Zend_Controller                             MVC Zend Framework.                     MVC -                    »
Model-View-Controller (          -    -        ),                                ,
                                                       . Zend_Controller_Front                           » Front
Controller,                                               -                 (front controller)
                                                      (action controllers),
                   URL.

           Zend_Controller
                                                       ,
       ,                                                          ,
                                                                                             .

Быстрый старт

                                                 ,                                               .
                             Zend_Controller,                 .

Создайте файловую структуру

                             ,                                                  .
           :

   1. application/
   2.     controllers/
   3.         IndexController.php
   4.     models/
   5.     views/
   6.         scripts/
   7.              index/
   8.                  index.phtml
   9.         helpers/
   10.               filters/
   11.      html/
   12.          .htaccess
   13.          index.php

Установите корневую директорию для документов

               -                                html
       -              .

Создайте свои правила перезаписи

                          html/.htaccess                                                             :
                                                                                  Zend_Controller       73

   1.   RewriteEngine On
   2.   RewriteCond %{REQUEST_FILENAME} -s [OR]
   3.   RewriteCond %{REQUEST_FILENAME} -l [OR]
   4.   RewriteCond %{REQUEST_FILENAME} -d
   5.   RewriteRule ^.*$ - [NC,L]
   6.   RewriteRule ^.*$ index.php [NC,L]

Note:                    mod_rewrite
                                                                                                    -
                                                 .                  ,
                    ,                                                   .                    Apache,
        »                mod_rewrite.

            IIS 7.0,                                            :

   1. <?xml version="1.0" encoding="UTF-8"?>
   2. <configuration>
   3.      <system.webServer>
   4.          <rewrite>
   5.              <rules>
   6.                   <rule name="Imported Rule 1" stopProcessing="true">
   7.                       <match url="^.*$" />
   8.                       <conditions logicalGrouping="MatchAny">
   9.                           <add input="{REQUEST_FILENAME}"
   10.                                     matchType="IsFile" pattern=""
   11.                                     ignoreCase="false" />
   12.                                 <add input="{REQUEST_FILENAME}"
   13.                                     matchType="IsDirectory"
   14.                                     pattern="" ignoreCase="false" />
   15.                             </conditions>
   16.                             <action type="None" />
   17.                        </rule>
   18.                        <rule name="Imported Rule 2" stopProcessing="true">
   19.                             <match url="^.*$" />
   20.                             <action type="Rewrite" url="index.php" />
   21.                        </rule>
   22.                    </rules>
   23.                </rewrite>
   24.           </system.webServer>
   25.      </configuration>

                                                                (
        ,                               ),                                             -            .

Note:                                                      -            Apache.
                                 -           .                               .

Создайте файл загрузки

                -            ,                             ,                          html/index.php.
            html/index.php                                                        :

   1. Zend_Controller_Front::run('/path/to/app/controllers');
                                                                                                                          Zend_Controller               74

                                                                       -                ,
                                   .

Создайте свой контроллер действий, используемый по умолчанию

         ,                                             ,                   ,
                Zend Framework.                              URL                                                                    ,               -
              .          ,    URL http://framework.zend.com/roadmap/components.
/roadmap/components                                                            roadmap                       components.
                               ,                                      index;                                                    ,
                                       index   (                     Apache                              DirectoryIndex).

                  Zend_Controller-                                                                                                              .
                                          ,                                                                  Controller                     .
          ,                   roadmap                                           RoadmapController.

                                                                                                                                            .
                                                                                                      Action.
          ,                                                components                            componentsAction,
                                                                           :   RoadmapController::componentsAction().

    ,                              .                                                                         ,
                  .                                ,                                                                        index.
        application/controllers/IndexController.php                                                      :

   1.    /** Zend_Controller_Action */
   2.    class IndexController extends Zend_Controller_Action
   3.    {
   4.        public function indexAction()
   5.        {
   6.        }
   7.    }

                                                                ViewRenderer.                ,           ,
                                                       ,                                             .                          MVC
              "       "                 Zend_View. render()                                                      (           , index)
                          (             , index)                                ,                                 .
                                        .phtml,           ,
index/index.phtml.                          , ViewRenderer                                               ,                          views,
                                          ,                                         ,                                                   ,
                                                            views/scripts/.                                           ,
                                         application/views/scripts/index/index.phtml.

Создайте скрипт вида

                                                            ,                               application/views/scripts/.
                                                           ,                                     ,
application/views/scripts/index/index.phtml.                                                                                        -
HTML-             :
                                                                              Zend_Controller        75

   1. <!DOCTYPE html
   2. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   4. <html>
   5. <head>
   6.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   7.   <title>My first Zend Framework App</title>
   8. </head>
   9. <body>
   10.           <h1>Hello, World!</h1>
   11.       </body>
   12.       </html>

Создайте контроллер ошибок

                                     -                  .             ,
                     .                            ,          ,                               ,
                   ErrorController           errorAction.

   1. class ErrorController extends Zend_Controller_Action
   2. {
   3.     public function errorAction()
   4.     {
   5.     }
   6. }



application/controllers/ErrorController.php.
application/views/scripts/error/error.phtml,                     :

   1. <!DOCTYPE html
   2. PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
   4. <html>
   5. <head>
   6.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   7.   <title>Error</title>
   8. </head>
   9. <body>
   10.           <h1>An error occurred</h1>
   11.           <p>An error occurred; please try again later.</p>
   12.       </body>
   13.       </html>

Смотрим сайт!

       ,                                 ,                                                       .
                - example.com,                        URL-                           ,
                      :

   •   http://example.com/
   •   http://example.com/index
   •   http://example.com/index/index

                                                                          .              !
                                                                                                            Zend_Controller   76


Основы Zend_Controller
              Zend_Controller                                                   ,                          .
                                                                              ,                                           ,
                        ,                                            Zend_Controller,
                                                          .

                                                                                  ,
                            :
     .   ,          .           ,     .      ,    .




                                    Zend_Controller                                               .                ,

                ,                                                                             .

 •                -                         (Zend_Controller_Front)
             Zend_Controller.                                                    FrontController. Zend_Controller_Front
                                                      ,                      ,
                                                              (Zend_Controller_Action).
                                                                                                                                     Zend_Controller           77

•   Zend_Controller_Request_Abstract (                                            объектом запроса)
                                                                                                                                 ,
                             .            ,                               ,
                        Zend_Controller_Dispatcher.
                                                                                              ,
                                                                 ,                                                                                         .

                                            Zend_Controller_Request_Http.
                        HTTP-           .

•   Zend_Controller_Router_Interface                                                                                             .                     —
                                                                                                             ,
                                                                                          .                          ,

    Zend_Controller_Dispatcher_Standard.                                                                                                 :
                            ,                                                                                .

                                                                     Zend_Controller_Router_Rewrite
            URI                 ,                                        Zend_Controller_Request_Http,
                    ,                            ,                              URL.            , URL
    http://localhost/foo/bar/key/value                                                                                               :            foo,
            bar           key                                  value.

    Zend_Controller_Router_Rewrite
          ,                                                      .                                    Rewrite Router

•   Zend_Controller_Dispatcher_Interface                                                                                 .                         —
                                                                                                         ,
            /                                                                                           .                    ,
                                                                                     ,
                                    .


                                             .                                                    ,
       ,                                                              .
                        ,                              ,                                                         ,
                                                                              .
                                                           (                      TRUE)                              ,
                                            .

                                                Zend_Controller_Dispatcher_Standard.
                                           ,                          Controller,
                                       (MixedCase),                  —                                                                       ,
                                  Action,                      ,              ,
                (camelCase): SomeFooController::barAction.
                somefoo,                     bar.

    Note:
                            ,
                                                                                                                        Zend_Controller         78

                                                   ,            Zend Framework                                          URL
                 .                  ,                   ,                                                                     ...
                                   URL.
                                                                                                            ,
                         ,                              MixedCase            camelCase,
       URL                   '-'     '.' (                                     -                   ).
                     ,                                                   FooBarController::bazBatAction(),
                                             URL            /foo-bar/baz-bat    /foo.bar/baz.bat.

   •   Zend_Controller_Action —                                                                         .
                                             ,                 Zend_Controller_Action,
                                       .
   •   Zend_Controller_Response_Abstract                                                       ,
                                                                  .                                             ,                       .

                                                   Zend_Controller_Response_Http,
                                    HTTP.

                  Zend_Controller                                     .
Zend_Controller_Front,                                                    Zend_Controller_Router_Rewrite
    ,                  (                                                     )                     .
Zend_Controller_Router_Rewrite                          URI
      .       Zend_Controller_Front                                                 .
Zend_Controller_Dispatcher_Standard,                                                                                                ,
                         (       ,                                                        ).                        ,
                ,                                      Zend_Controller_Front.
                                                                     ,                                                                      ,
                                                                            .
             .
                                                                                                                           Zend_Controller       79


Фронт-контроллер
Обзор

Zend_Controller_Front                    »               Front Controller,                                                   » MVC.
                                                                        ,
                                                           .
            .

Zend_Controller_Front                                »                 Singleton,                ,
                                                           .                                                                                 ,
                                             ,                                                             .

Zend_Controller_Front                                                               (plugin broker),
                                 ,                                          -                .
                                                                                                                                     -
                                                                   .

        -                                                      ,                     ,                                                   ,
                                                 .
                                     -                                                       .

Note:
                      -                                                    ErrorHandler                                     ViewRenderer.
                                                                                                               ,                  .
            ,                ErrorHandler,                                                                                dispatch():

   1. // Отключение плагина ErrorHandler:
   2. $front->setParam('noErrorHandler', true);

            ,                ViewRenderer,                                                                             dispatch():

   1. // Отключение помощника ViewRenderer:
   2. $front->setParam('noViewRenderer', true);

Ключевые методы

        -                                                                                                          .                 ,
                                                                       .

getInstance()

getInstance()                                                                            -             .                         -
                    Singleton,                                                                                                                   -
                .

   1. $front = Zend_Controller_Front::getInstance();
                                                                                                                       Zend_Controller   80

setControllerDirectory() и addControllerDirectory()

setControllerDirectory()                                            ,                                 ,
                                    .                                                                                   =>
                            .

          :

   1. // Установка директории контроллеров, используемой по умолчанию:
   2. $front->setControllerDirectory('../application/controllers');
   3.
   4. // Одновременная установка нескольких директорий модулей:
   5. $front->setControllerDirectory(array(
   6.     'default' => '../application/controllers',
   7.     'blog'    => '../modules/blog/controllers',
   8.     'news'    => '../modules/news/controllers',
   9. ));
   10.
   11.      // Добавление директории модуля 'foo':
   12.      $front->addControllerDirectory('../modules/foo/controllers', 'foo');

Note:                                       addControllerDirectory()                              ,
         default.                                                   ,                                 .

                                                                                      ,
getControllerDirectory().                                                   =>                    .

addModuleDirectory() и getModuleDirectory()

                                              -                         ,
                                                                ,                             "               ".


                                                       - . .,                       ,                     ,
"controllers";          ,                      ,                                 "views"
             .

        addModuleDirectory()                                                              ,
                                .                                                                                               -
              .

                                                                                                              ,
        getModuleDirectory(),                                                                                      ,
                                        .

dispatch()

dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract
$response = null)        "                "      -          .
                    /                              ,                                                                                .
                                                                                                                                              Zend_Controller   81

                dispatch()                                                                                                ,                         ,
                                                  ,                                      ,                                                              (
                                                                                                             HTTP).

                                  dispatch()
                                          ,                                                  ,                                                      .

                                                                                                     :

   •
   •
   •

                                                                             ,                                        dispatch(),
                                      .                                                                                       .
                              ,
                                  .                                                                  ,            -                                 .

run()

Zend_Controller_Front::run($path)                                 -                                      ,
                .                                                        -                                     getInstance()),
        setControllerDirectory(),                                                                    dispatch().

               , run()                                                                           ,
       ,                                                                                 -                            .

   1. // Инстанцирование фронт-контроллера, установка директории контроллера и
   2. // выполнение диспетчеризации в одном вызове:
   3. Zend_Controller_Front::run('../application/controllers');

Методы-аксессоры для конфигурирования

                  ,                                           ,                      -                        ,
                                                      -                          -                                                              ,               -
                                                          .

   •       resetInstance()                                                                                                            .
                                                                  ,                                                                       ,
                                                              -                      .
   •       (set|get)DefaultControllerName()
                                              (                                          'index')                                               .
                                                      .
   •       (set|get)DefaultAction()
                      (                                       'index')                                                            .
                          .
   •       (set|get)Request()
                                                                                                             .
                                                          ,                                                                                             .
                                                                                                                                                                  Zend_Controller   82

•   (set|get)Router()                                                                                                                                             ,
                                                                       ,                                                     .
                              ,                                                                                                  ,
                                                           .

                                                                                                                                                     ,                              -

                              (Rewrite Router).

•   (set|get)BaseUrl()                                                                                                     URL,
                                       ,                                                                               .
                                                                                               .
•   (set|get)Dispatcher()
                                                                                       ,                                                                 .
                                                                                                           ,
                                  .

                                                                           ,                                                                                 ,
          -                                                                                                                                                            ,
                          .

•   (set|get)Response()
                                                                                           ,                                                 .
                                                                                   ,
      .
•   registerPlugin(Zend_Controller_Plugin_Abstract $plugin, $stackIndex = null)
                                                                   .                                                                                             $stackIndex,
                                                               ,                                                                     .
•   unregisterPlugin($plugin)                                                                                                                                         . $plugin
                                           ,                                       ,                                                             ,
                          .
•   throwExceptions($flag)                                                                                     /
                                                                                                       .
                                                       ;                                   throwExceptions()

                                                                                                               .

•   returnResponse($flag)                                                                          ,                                     -                            -
           dispatch() (TRUE),                                                                                                                                    (FALSE).
                                                                                                   (
    Zend_Controller_Response_Abstract::sendResponse());                                                                                      returnResponse()
                                                   .

                  ,                                                                                                ,
                                                                               ,
              (       ,                        )               . .
                                                                                                                                        Zend_Controller               83

Параметры фронт-контроллера

                                        ,                   -
                               .                                                                                            .
                                                        -                                -                 -                        ,
                                                                             .                                                                       ,
              ,                                     .                                             :

   •   setParam($name, $value)                                                                                                                       $name
                      $value.
   •   setParams(array $params)
                                            .
   •   getParam($name)                                                                                              ,                                $name
                                                .
   •   getParams()                                                                           .
   •   clearParams()                                                                 (                                                                   ),
                                            (                                                                                   )
                       (                            -           ).

                                                                                                                                                                  :

   •   useDefaultControllerAlways                                                                               ,
                                                                                                                        ,
                       ( . .                ,                        /                                         ).                                             .

          .                        MVC,
                                                                         .

   •   disableOutputBuffering                                                                          ,
                                                                                 ,                                                               .

                  .
   •   noViewRenderer                                                                            ViewRenderer.
        true                                    .
   •   noErrorHandler                                                                    Error Handler
       true                                 .

Расширение фронт-контроллера

                                    -                       ,                ,                     ,
getInstance().

   1. class My_Controller_Front extends Zend_Controller_Front
   2. {
   3.     public static function getInstance()
   4.     {
   5.         if (null === self::$_instance) {
   6.             self::$_instance = new self();
   7.         }
   8.
   9.         return self::$_instance;
                                                                 Zend_Controller   84

   10.                }
   11.            }

                           getInstance()       ,
Zend_Controller_Front::getInstance()
Zend_Controller_Front -
                  .

              ,                            -             ,
                          (   ,
         ).           ,                                                 -
              ,                                              ,
                                                   . .
                                                                                                                                                        Zend_Controller        85


Объект запроса
Введение

               -                                     "                          " (» value object),
Zend_Controller_Front,                                          ,                                                               .
                    ,                                      ,                                                                        ,
(           )        ,                                   HTTP, CLI               PHP-GTK.

   •                                                                                        getModuleName() setModuleName().
   •                                                                                            getControllerName() setControllerName().
   •                                                                                         getActionName() setActionName().
   •                                 ,                                      ,                                                                                  /           ,
                                                                                        getParams()
        setParams().
        getParam() setParam()                                                       .

         ,                                                                         ,                  ,                                                                    .
             ,                                                                    Zend_Controller_Request_Http
URI                  ,                       ,                    $_GET         $_POST, . .

                                                          -                     ,
                                                 ,                                                                    .
                                 .

                 ,                                                                                           .
                                         ,                        ,                     ,                         ,             , URI        . .,
                         -                                                                                                          .
                             ,                                                                                              -                                      MVC.

HTTP-запросы
Доступ к данным запроса

Zend_Controller_Request_Http                                                                                                                        ,      ,
                                                                                                         ,                                                     ,
  URI.                                                                                       ,                                                                     ,
                                             ,                                                               URL      URI               .
                                                                        ,                                                                   setParam/getParam
                                                                                                     .

Note:
                                                                                                                 Zend_Controller_Request_Http
             ,                                                ,                                  (                                           )
                                                                                                                        : 1. GET, 2. POST, 3. COOKIE, 4.
SERVER, 5. ENV.

                                                                                                                                                                       .
             ,                                                    $_POST['user']
                                                                                                              Zend_Controller             86

getPost('user')                               .                                     getQuery()
            $_GET      getHeader()                                                  .

Note:                 GET   POST
                        ,                                                       ,                                                 .

                                    ,                                                                 .

Note:                    Raw POST
                        1.5.0                                              POST               ,
                  ,                      getRawPost().                                   false,                 POST
                                ,                 -        POST.
                                                                                                  RESTful                 .

                                                                                                          ,       setParam(),
                        ,               getParam().
              ,                         URI            ,                    .

Note: getParam()
getParam()                                                             .
        :                                         setParam()                                  ,                GET,   ,               ,
              POST.                           ,                                                   .
                                                            ,                                setParam(),
getUserParam().
               ,                 1.5.0,
              . setParamSources()
            ,              '_GET' '_POST' (                          ).
                               ,                                   .
                      '_GET',            setParamSources(array('_GET')).

Note:                 Apache
                                       404                      -      Apache
        -                              PT                          ,                URI
                  $_SERVER['REDIRECT_URL'] ,        $_SERVER['REQUEST_URI'].
                                                       ,
                  Zend_Controller_Request_Apache404      Zend_Controller_Request_Http,
              .

   1. $request = new Zend_Controller_Request_Apache404();
   2. $front->setRequest($request);

                            Zend_Controller_Request_Http                                                       URI            .
                                             .

Базовый URL и поддиректории

Zend_Controller_Request_Http                                        Zend_Controller_Router_Rewrite                                    .
Zend_Controller_Request_Http                                                                  URL
                                                       .
                                                                                            Zend_Controller         87

          ,                       index.php                    /projects/myapp/index.php                -       ,
         URL (                         )                       /projects/myapp.
                                      ,                                                                 .
                                                                             .        'user/:username'
                    URI     http://localhost/projects/myapp/user/martel
http://example.com/user/martel.

Note:                 URL
                                             URL                         ,                    ,             URL
                                                           (                     Windows).
              ,                                        .

              URL                                  ,
                  setBaseUrl(),                            Zend_Http_Request, Zend_Controller_Request_Http
 Zend_Controller_Front.                                     Zend_Controller_Front,
                                  .                                   URL:

   1.   /**
   2.   * Обработка запроса со своим базовым URL через Zend_Controller_Front
   3.   */
   4.   $router     = new Zend_Controller_Router_Rewrite();
   5.   $controller = Zend_Controller_Front::getInstance();
   6.   $controller->setControllerDirectory('./application/controllers')
   7.              ->setRouter($router)
   8.              ->setBaseUrl('/projects/myapp'); // установка базового URL!
   9.   $response   = $controller->dispatch();

Определение HTTP-метода запроса

getMethod()                                HTTP-                    .             ,                         ,
                          ,                                HTTP-                                                    .
                                               :

   •    isGet()
   •    isPost()
   •    isPut()
   •    isDelete()
   •    isHead()
   •    isOptions()

                                                               . . RESTful-             .

Определение запросов AJAX

Zend_Controller_Request_Http                                                            AJAX:
isXmlHttpRequest().                                              HTTP-           X-Requested-With
          'XMLHttpRequest'.                        ,             TRUE.

                              ,                                                                   JS-
              :
                                                                             Zend_Controller   88

   •   Prototype/Scriptaculous (           ,        Prototype)
   •   Yahoo! UI Library
   •   jQuery
   •   MochiKit

              AJAX-                                                  HTTP-            .
                                       ,                                          ,
                 ,           isXmlHttpRequest()                  .

Создание подклассов объекта запроса

                     ,                                 ,-
Zend_Controller_Request_Abstract.                            :

   1. abstract class Zend_Controller_Request_Abstract
   2. {
   3.     /**
   4.      * @return string
   5.      */
   6.     public function getControllerName();
   7.
   8.     /**
   9.      * @param string $value
   10.           * @return self
   11.           */
   12.          public function setControllerName($value);
   13.
   14.          /**
   15.           * @return string
   16.           */
   17.          public function getActionName();
   18.
   19.          /**
   20.           * @param string $value
   21.           * @return self
   22.           */
   23.          public function setActionName($value);
   24.
   25.          /**
   26.           * @return string
   27.           */
   28.          public function getControllerKey();
   29.
   30.          /**
   31.           * @param string $key
   32.           * @return self
   33.           */
   34.          public function setControllerKey($key);
   35.
   36.          /**
   37.           * @return string
   38.           */
   39.          public function getActionKey();
   40.
   41.          /**
   42.           * @param string $key
   43.           * @return self
   44.           */
                                                                                            Zend_Controller        89

      45.                public function setActionKey($key);
      46.
      47.                /**
      48.                 * @param string $key
      49.                 * @return mixed
      50.                 */
      51.                public function getParam($key);
      52.
      53.                /**
      54.                 * @param string $key
      55.                 * @param mixed $value
      56.                 * @return self
      57.                 */
      58.                public function setParam($key, $value);
      59.
      60.                /**
      61.                 * @return array
      62.                 */
      63.                 public function getParams();
      64.
      65.                /**
      66.                 * @param array $array
      67.                 * @return self
      68.                 */
      69.                public function setParams(array $array);
      70.
      71.                /**
      72.                 * @param boolean $flag
      73.                 * @return self
      74.                 */
      75.                public function setDispatched($flag = true);
      76.
      77.                /**
      78.                 * @return boolean
      79.                 */
      80.                public function isDispatched();
      81.            }

                                                                                 .
  ,                                                     ,              ,                                           .
                                                                                 ,                                ,
                                                                 .

                                                                             ,                  ,
                                                                                  ,
            .                                   HTTP,                CLI     PHP-GTK.

Стандартный маршрутизатор
Введение

Zend_Controller_Router_Rewrite                                                          .                     -
                                                URI (                 URI,                  URL)
                                                            ,
                                .                            ,
                Zend_Controller_Request_Http,
                                                                                      Zend_Controller        90

Zend_Controller_Dispatcher_Standard.                                              –
                        ,                                       .

Zend_Controller_Router_Rewrite                        ,                                      ,
mod_rewrite,                            PHP.                                      ,                   Ruby
on Rails                 -                                           URL      -          .
                                                    mod_rewrite,                                  :

   1. RewriteEngine on
   2. RewriteRule !\.(js|ico|gif|jpg|png|css|html)$ index.php

    (                                  ):

   1.     RewriteEngine On
   2.     RewriteCond %{REQUEST_FILENAME} -s [OR]
   3.     RewriteCond %{REQUEST_FILENAME} -l [OR]
   4.     RewriteCond %{REQUEST_FILENAME} -d
   5.     RewriteRule ^.*$ - [NC,L]
   6.     RewriteRule ^.*$ index.php [NC,L]

Rewrite Router                                 -          IIS       7.0       ,       » Isapi_Rewrite
                            Isapi                                     :

   1. RewriteRule ^[\w/\%]*(?:\.(?!(?:js|ico|gif|jpg|png|css|html)$)[\w\%]*$)? /index.php
      [I]

Note: IIS Isapi_Rewrite
                  IIS, $_SERVER['REQUEST_URI']                            ,
              .           Zend_Controller_Request_Http
$_SERVER['HTTP_X_REWRITE_URL'] ,                                                        Isapi_Rewrite.

IIS 7.0                                            URL,
          :

   1. <?xml version="1.0" encoding="UTF-8"?>
   2. <configuration>
   3.      <system.webServer>
   4.          <rewrite>
   5.              <rules>
   6.                  <rule name="Imported Rule 1" stopProcessing="true">
   7.                      <match url="^.*$" />
   8.                      <conditions logicalGrouping="MatchAny">
   9.                           <add input="{REQUEST_FILENAME}"
   10.                                    matchType="IsFile" pattern=""
   11.                                    ignoreCase="false" />
   12.                                <add input="{REQUEST_FILENAME}"
   13.                                    matchType="IsDirectory"
   14.                                    pattern="" ignoreCase="false" />
   15.                            </conditions>
   16.                            <action type="None" />
   17.                        </rule>
   18.                        <rule name="Imported Rule 2" stopProcessing="true">
   19.                            <match url="^.*$" />
   20.                            <action type="Rewrite" url="index.php" />
   21.                        </rule>
                                                                                                             Zend_Controller   91

   22.                                </rules>
   23.                            </rewrite>
   24.                        </system.webServer>
   25.                   </configuration>

                                 Lighttpd,                                                               :

   1. url.rewrite-once = (
   2.     ".*\?(.*)$" => "/index.php?$1",
   3.     ".*\.(js|ico|gif|jpg|png|css|html)$" => "$0",
   4.     "" => "/index.php"
   5. )

Использование маршрутизатора

                ,                                                           ,                                 ,
                                             ,                          -               .
                    :

   1.          // Создание маршрутизатора
   2.
   3.          $router = $ctrl->getRouter(); // по умолчанию возвращает rewrite router
   4.          $router->addRoute(
   5.              'user',
   6.              new Zend_Controller_Router_Route('user/:username',
   7.                                               array('controller' => 'user',
   8.                                                     'action' => 'info'))
   9.          );

Базовые операции Rewrite Router

                        RewriteRouter (                                             )
                    .                                                                       addRoute()
           ,                        Zend_Controller_Router_Route.                   :

   1. $router->addRoute('user',
   2.                   new Zend_Controller_Router_Route('user/:username'));

Rewrite Router                                                                                     (
             ):

   •           Zend_Controller_Router_Route
   •           Zend_Controller_Router_Route_Static
   •           Zend_Controller_Router_Route_Regex
   •           Zend_Controller_Router_Route_Hostname
   •           Zend_Controller_Router_Route_Chain
   •                     ,                           *



                                                 .
                         ,                             Module,
       ,                     ,                            (                     ,                                       ).
                                                                    .
                                                                                                                          Zend_Controller    92

                                            addRoute()                                 .
                                                                                      (                  ,                       URL).
                                                             .

Note:                                                                                          URL                      Zend_View:

    1. <a href=
    2. "<?php echo $this->url(array('username' => 'martel'), 'user') ?>">Martel</a>

                                                href             user/martel.

                   -
                                   URI               .                                  ,
                                                                      Zend_Controller_Request
                                                                  .                                          ,
                       .

                                                                  ,                                          getCurrentRouteName(),
                                        ,                                                                                                .
                                       ,                         getCurrentRoute().

Note:
                                                                       ,                             ,
                           .

Note:
             ,                                                    ,                                      URL
                                                         .
            Zend_Controller_Request::getParam()                            Zend_Controller_Action::_getParam()

                                                 ,                                                               : 'module', 'controller'
'action'.                                                                   Zend_Controller_Dispatcher
                               ,                                                .

Note:
                                                                  ,                                               setControllerKey
setActionKey.

Маршруты, используемые по умолчанию

Zend_Controller_Router_Rewrite                                                                                                       ,
                      URI       контроллер/действие.                                       ,
                               ,                                                    URI          модуль/контроллер/действие.
                                                                    ,
        URI - контроллер/действие/переменная1/значение1/переменная2/значение2.

                                   ,                                                             :

    1. // Допустим, есть следующие настройки:
    2. $ctrl->setControllerDirectory(
                                                                                     Zend_Controller    93

   3.      array(
   4.          'default' => '/path/to/default/controllers',
   5.          'news'    => '/path/to/news/controllers',
   6.          'blog'    => '/path/to/blog/controllers'
   7.      )
   8. );
   9.
   10.          Только модуль:
   11.          http://example/news
   12.              module == news
   13.
   14.          Если модуль не найден, то считается, что это имя контроллера:
   15.          http://example/foo
   16.              controller == foo
   17.
   18.          Модуль + контроллер:
   19.          http://example/blog/archive
   20.              module     == blog
   21.              controller == archive
   22.
   23.          Модуль + контроллер + действие:
   24.          http://example/blog/archive/list
   25.              module     == blog
   26.              controller == archive
   27.              action     == list
   28.
   29.          Модуль + контроллер + действие + параметры:
   30.          http://example/blog/archive/list/sort/alpha/date/desc
   31.              module     == blog
   32.              controller == archive
   33.              action     == list
   34.              sort       == alpha
   35.              date       == desc

           ,                             ,                   Zend_Controller_Router_Route_Module,
                 RewriteRouter          (          ) 'default'.
       :

   1. $compat = new Zend_Controller_Router_Route_Module(array(),
   2.                                                   $dispatcher,
   3.                                                   $request);
   4. $this->addRoute('default', $compat);

                                                                                         ,
                                                                          ( . .
       'default')                                         removeDefaultRoutes():

   1. // Удаление всех маршрутов по умолчанию
   2. $router->removeDefaultRoutes();

Базовый URL и поддиректории

RewriteRouter                                         (          ,
http://domain.com/~user/application-root/),                            URL
(/~user/application-root)                                                Zend_Controller_Request_Http
                                             .
                                                                                                                         Zend_Controller                 94

               URL                            ,
setBaseUrl()             Zend_Controller_Request_Http (                             .            URL                      ):

    1. $request->setBaseUrl('/~user/application-root/');

Глобальные параметры

                 setGlobalParam,                                                                                                            ,
                                                                                                     .
        ,                                                                                    ,
                                  .                                                                                                    :

    1. $router->setGlobalParam('lang', 'en');


Типы маршрутов
Zend_Controller_Router_Route

Zend_Controller_Router_Route -                                                                   .
                                                                           .                                                               URL
(                                                        (                )),
                                                                  .

                                                                      ,
                     .                    ,                           http://domain.com/author/martel
                                                      "martel".
                                              :

    1. $route = new Zend_Controller_Router_Route(
    2.     'author/:username',
    3.     array(
    4.         'controller' => 'profile',
    5.         'action'     => 'userinfo'
    6.     )
    7. );
    8.
    9. $router->addRoute('user', $route);

                                                  Zend_Controller_Router_Route -                                     ,
                 URL.                                                                                                              ,
                         ('/').                                                                          : author.                               ,
                              ,                                                                                      : :username.

Note:
                                                                                (                                )
                                      ,                                                                                        ,
                 php.                                        ,                                               ,
                                          .

                                                  ,                        http://domain.com/author/martel                                           ,
                                                                                        Zend_Controller_Request
                                                                                                   Zend_Controller       95

                    ProfileController.             ,                                           ,
                                                  /          :

   1. $values = array(
   2.     'username'   => 'martel',
   3.     'controller' => 'profile',
   4.     'action'     => 'userinfo'
   5. );

     Zend_Controller_Dispatcher_Standard                          userinfoAction()
ProfileController (                                    ),                                             .
                                  Zend_Controller_Action::_getParam()
Zend_Controller_Request::getParam().

   1. public function userinfoAction()
   2. {
   3.     $request = $this->getRequest();
   4.     $username = $request->getParam('username');
   5.
   6.     $username = $this->_getParam('username');
   7. }

                                                                                        (              ),
                          '*'.                                              ,                      Module,
                              (               =>        ,                              URI).
                                                Module:

   1. $route = new Zend_Controller_Router_Route(
   2.     ':module/:controller/:action/*',
   3.     array('module' => 'default')
   4. );
   5. $router->addRoute('default', $route);

Значения переменных по умолчанию

                                                                        ,
                       Zend_Controller_Router_Route.                                                          ,
                                    ,                                                                                :

   1. $route = new Zend_Controller_Router_Route(
   2.     'archive/:year',
   3.     array('year' => 2006)
   4. );
   5. $router->addRoute('archive', $route);

                                      URL-   http://domain.com/archive/2005
http://example.com/archive.                                      year
          2006.

                           year                                     .
                                  (                         controller              action),
                                         ,                                      (
                                                                                                              Zend_Controller   96

Zend_Controller_Dispatcher_Abstract).                  ,                                                         ,
                                                                                                      :

   1. $route = new Zend_Controller_Router_Route(
   2.     'archive/:year',
   3.     array(
   4.         'year'       => 2006,
   5.         'controller' => 'archive',
   6.         'action'     => 'show'
   7.     )
   8. );
   9. $router->addRoute('archive', $route);

                                       showAction()                ArchiveController.

Требования к переменным

                                  Zend_Controller_Router_Route                               ,
                            .                                                                    :

   1. $route = new Zend_Controller_Router_Route(
   2.     'archive/:year',
   3.     array(
   4.          'year'       => 2006,
   5.          'controller' => 'archive',
   6.          'action'     => 'show'
   7.     ),
   8.     array('year' => '\d+')
   9. );
   10.       $router->addRoute('archive', $route);

                        ,                                      ,                                     URL
                                year                                    -            ,
http://domain.com/archive/2345. URL                    http://example.com/archive/test
                                       ,
       .

Переводимые сегменты

                                                                        .        ,
            ,                                    ,                          (            Zend_Translate)
                -                                          :

   •                                            Zend_Translate.
   •                                                 Zend_Controller_Router_Route::setDefaultTranslator().
   •                                                                       .

                                           ,                            Zend_Translate.                   ,
                    ,                                              (        Zend_Locale                                   )
                                  :

   •                                           Zend_Locale.
   •                                               Zend_Controller_Router_Route::setDefaultLocale().
                                                                                                Zend_Controller   97

   •                                                              .
   •                             @locale            assemble().

                                           .                                                                 @,
                                                                                  URL
                                                   URL                    .
        :@.          URL
        .                                                  URL
                      .

Note:
                             ,                                        ,
                       ,                                                                -   .         ,
                                    URL-       ,
            ,                        .


                                       :

   1. // Подготовка переводчика
   2. $translator = new Zend_Translate('array', array(), 'en');
   3. $translator->addTranslation(array('archive' => 'archiv',
   4.                                   'year'    => 'jahr',
   5.                                   'month'   => 'monat',
   6.                                   'index'   => 'uebersicht'),
   7.                             'de');
   8.
   9. // Установка текущей локали для переводчика
   10.      $translator->setLocale('en');
   11.
   12.      // Установка его в качестве используемого по умолчанию для маршрутов
   13.      Zend_Controller_Router_Route::setDefaultTranslator($translator);

                                                                              :

   1. // Создание маршрута
   2. $route = new Zend_Controller_Router_Route(
   3.     '@archive',
   4.     array(
   5.         'controller' => 'archive',
   6.         'action'     => 'index'
   7.     )
   8. );
   9. $router->addRoute('archive', $route);
   10.
   11.      // Сборка URL в локали, используемой по умолчанию: archive
   12.      $route->assemble(array());
   13.
   14.      // Сборка URL в немецкой локали: archiv
   15.      $route->assemble(array());



                                                     :

   1. // Создание маршрута
                                                                           Zend_Controller    98

   2. $route = new Zend_Controller_Router_Route(
   3.     ':@controller/:@action/*',
   4.     array(
   5.         'controller' => 'index',
   6.         'action'     => 'index'
   7.     )
   8. );
   9. $router->addRoute('archive', $route);
   10.
   11.      // Сборка URL в локали, используемой по умолчанию: archive/index/foo/bar
   12.      $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
   13.
   14.      // Сборка URL в немецкой локали: archiv/uebersicht/foo/bar
   15.      $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));

                                                                   :

   1. // Создание маршрута
   2. $route = new Zend_Controller_Router_Route(
   3.     '@archive/:@mode/:value',
   4.     array(
   5.           'mode'       => 'year'
   6.           'value'      => 2005,
   7.           'controller' => 'archive',
   8.           'action'     => 'show'
   9.     ),
   10.            array('mode' => '(month|year)'
   11.                  'value' => '\d+')
   12.       );
   13.       $router->addRoute('archive', $route);
   14.
   15.       // Сборка URL в локали, используемой по умолчанию: archive/month/5
   16.       $route->assemble(array('mode' => 'month', 'value' => '5'));
   17.
   18.       // Сборка URL в немецкой локали: archiv/monat/5
   19.       $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));

Zend_Controller_Router_Route_Static

                                                         -             ,
        .                                                      ,
                                                   .
                                  :

   1. $route = new Zend_Controller_Router_Route_Static(
   2.     'login',
   3.     array('controller' => 'auth', 'action' => 'login')
   4. );
   5. $router->addRoute('login', $route);

                                 URL http://domain.com/login
AuthController::loginAction().

Note:               :

                                             URL                                   ,
                                                                                                          Zend_Controller         99

                                        ,                                              ,
                 .                   "controller"                 "action"                                          , ,
       ,                                                      .
                         :                                                                            :

   •       controller
   •       action
   •       module (                  ,                                             )

                                                  "useDefaultControllerAlways"             -
            :

   1. $front->setParam('useDefaultControllerAlways', true);

                                                  ,
                     .

Zend_Controller_Router_Route_Regex

                                                          -                                                 -
                             .                                                                 ,
                 ,                                                            .
             ,                            .

                                 ,
                                                      .                                                                       ,
             ,                                ,                                                    Regex:

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive/(\d+)',
   3.     array(
   4.         'controller' => 'archive',
   5.         'action'     => 'show'
   6.     )
   7. );
   8. $router->addRoute('archive', $route);

                                                                                                                .
                                                          http://domain.com/archive/2006
                                                                  :

   1. $values = array(
   2.     1            => '2006',
   3.     'controller' => 'archive',
   4.     'action'     => 'show'
   5. );

Note:                                                                        URL                                          .
       URL- http://domain.com/foo/bar/                                                                              foo/bar,
  /foo/bar.
                                                                                                                                  Zend_Controller       100

Note:                                            ('^'   '$'                                         )
                            .                                                                                                                  ,
        ,                                                                           .

Note:                                                           #                                            .                    ,
                                    ('#'),                                                      ('/')                                      .
            '#' (                        )                                              -            ,
                                                 .

                                                                                                                 :

   1. public function showAction()
   2. {
   3.     $request = $this->getRequest();
   4.     $year    = $request->getParam(1); // $year = '2006';
   5. }

Note:                           ,                                                               (1),             ('1').

                                                                        ,                                                                          ,
                                                                            'year'.
                    ,                                               ,                                                                          'year'
                                             .                                              ,                            'year'
                            ,                                               :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive(?:/(\d+))?',
   3.     array(
   4.         1            => '2006',
   5.         'controller' => 'archive',
   6.         'action'     => 'show'
   7.     )
   8. );
   9. $router->addRoute('archive', $route);

                                                 ,                              ,                        ,                   .

                                                                    .                                                                  .
                                                        ,
                                                            .                                                        :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive/(\d+)',
   3.     array(
   4.           'controller' => 'archive',
   5.           'action' => 'show'
   6.     ),
   7.     array(
   8.           1 => 'year'
   9.     )
   10.       );
   11.       $router->addRoute('archive', $route);

                        ,                                                                                                :
                                                                                      Zend_Controller   101

   1. $values = array(
   2.     'year'       => '2006',
   3.     'controller' => 'archive',
   4.     'action'     => 'show'
   5. );

        ,                                                    ,
            .                                                    ,                               :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive/(\d+)',
   3.     array( ... ),
   4.     array(1 => 'year')
   5. );
   6.
   7. // ИЛИ
   8.
   9. $route = new Zend_Controller_Router_Route_Regex(
   10.          'archive/(\d+)',
   11.          array( ... ),
   12.          array('year' => 1)
   13.       );

Note:                                                                .

                ,
                                        .            ,
                    :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive/(\d+)/page/(\d+)',
   3.     array( ... ),
   4.     array('year' => 1)
   5. );

                    ,                                                         .           ,   URL
http://domain.com/archive/2006/page/10                                            :

   1. $values = array(
   2.     'year'            =>   '2006',
   3.     2                 =>   10,
   4.     'controller'      =>   'archive',
   5.     'action'          =>   'show'
   6. );

                                                         ,
URL,                                          URL,                                    .
                        ,                                        sprintf(),
                                    :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'archive/(\d+)',
   3.     array( ... ),
   4.     array('year' => 1),
   5.     'archive/%s'
   6. );
                                                                                                    Zend_Controller       102

                                                                   ,                                -
                                                 Regex?                    ,
     URL                              .              ,                      ,                                   URL
http://domain.com/blog/archive/01-Using_the_Regex_Router.html
            01-Using_the_Regex_Router.html   ID                                     /           .
                                                   .              Regex
                          :

   1. $route = new Zend_Controller_Router_Route_Regex(
   2.     'blog/archive/(\d+)-(.+)\.html',
   3.     array(
   4.           'controller' => 'blog',
   5.           'action'     => 'view'
   6.     ),
   7.     array(
   8.           1 => 'id',
   9.           2 => 'description'
   10.            ),
   11.            'blog/archive/%d-%s.html'
   12.       );
   13.       $router->addRoute('blogArchive', $route);

                      ,              Regex
                              .

Zend_Controller_Router_Route_Hostname

Zend_Controller_Router_Route_Hostname                         ,                                         .
                                  ,                               URL                   .

                                                                       ,
                              .              ,                                              ,                         ,
                    URL            http://martel.users.example.com                  ,
              "martel":

   1. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
   2.     ':username.users.example.com',
   3.     array(
   4.         'controller' => 'profile',
   5.         'action'     => 'userinfo'
   6.     )
   7. );
   8.
   9. $plainPathRoute = new Zend_Controller_Router_Route_Static('');
   10.
   11.      $router->addRoute('user', $hostnameRoute->chain($plainPathRoute);

                                        Zend_Controller_Router_Route_Hostname
        ,                                                 .
                  ,                          ('.').                 ,                                           ,
                                  : :username.                                                          : user.

                                                                                ,
                      ,                                                                                     .
                                                                                              Zend_Controller   103

                                                                       .                   ,
                   -               $hostnameRoute->chain($pathRoute);.         $hostnameRoute
           ,                                        (Zend_Controller_Router_Route_Chain),
                                   .

Zend_Controller_Router_Route_Chain

Zend_Controller_Router_Route_Chain                              ,
                       .                          ,       ,
                                                      .
                                    .

Note:
                                                                                               ,
                               .              ,
                           ,                                                   .

                                                                                          .
                                            Zend_Controller_Router_Route_Chain
chain                                             ,                                             .
               ,                                    ,         ,                       ,
chain                  ,                                          .
           ,                                                    Zend_Controller_Router_Route_Chain,
                                    :

   1. // Создаются два маршрута
   2. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
   3. $pathRoute     = new Zend_Controller_Router_Route(...);
   4.
   5. // Первый способ - объединение через маршрут-"цепочку
   6. $chainedRoute = new Zend_Controller_Router_Route_Chain();
   7. $chainedRoute->chain($hostnameRoute)
   8.              ->chain($pathRoute);
   9.
   10.      // Второй способ - непосредственное объединение
   11.      $chainedRoute = $hostnameRoute->chain($pathRoute);

                                                                                     .
                                        :

   1.   // Создаются два маршрута
   2.   $firstRoute = new Zend_Controller_Router_Route('foo');
   3.   $secondRoute = new Zend_Controller_Router_Route('bar');
   4.
   5.   // Объединение с использованием другого разделителя
   6.   $chainedRoute = $firstRoute->chain($secondRoute, '-');
   7.
   8.   // Результирующий маршрут: "foo-bar"
   9.   echo $chainedRoute->assemble();
                                                                                Zend_Controller       104

Объединение маршрутов через Zend_Config

                                                                                    .
                                                chains.                             ,
                           .               ,
                       ,                                                        .

                   ,                                      (-).                              XML
                                   :

   1. <routes>
   2.      <www type="Zend_Controller_Router_Route_Hostname">
   3.          <route>www.example.com</route>
   4.          <chains>
   5.              <language type="Zend_Controller_Router_Route">
   6.                  <route>:language</route>
   7.                  <reqs language="[a-z]{2}">
   8.                  <chains>
   9.                       <index type="Zend_Controller_Router_Route_Static">
   10.                                <route></route>
   11.                                <defaults module="default" controller="index"
       action="index" />
   12.                            </index>
   13.                            <imprint type="Zend_Controller_Router_Route_Static">
   14.                                <route>imprint</route>
   15.                                <defaults module="default" controller="index"
       action="index" />
   16.                            </imprint>
   17.                        </chains>
   18.                    </language>
   19.               </chains>
   20.           </www>
   21.           <users type="Zend_Controller_Router_Route_Hostname">
   22.               <route>users.example.com</route>
   23.               <chains>
   24.                    <profile type="Zend_Controller_Router_Route">
   25.                        <route>:username</route>
   26.                        <defaults module="users" controller="profile" action="index" />
   27.                    </profile>
   28.               </chains>
   29.           </users>
   30.           <misc type="Zend_Controller_Router_Route_Static">
   31.               <route>misc</route>
   32.           </misc>
   33.       </routes>

                               : www-language-index, www-language-imprint   users-language-
profile,                                                  ,                                       ,
           misc,                                               .

                                                                                        chain,
                                                      Zend_Controller_Router_Route_Chain,
                                       ,              :

   1. <routes>
   2.     <www type="Zend_Controller_Router_Route_Chain">
                                                                                Zend_Controller   105

 3.            <route>www.example.com</route>
 4.        </www>
 5.        <language type="Zend_Controller_Router_Route">
 6.            <route>:language</route>
 7.            <reqs language="[a-z]{2}">
 8.        </language>
 9.        <index type="Zend_Controller_Router_Route_Static">
 10.                 <route></route>
 11.                 <defaults module="default" controller="index" action="index" />
 12.             </index>
 13.             <imprint type="Zend_Controller_Router_Route_Static">
 14.                 <route>imprint</route>
 15.                 <defaults module="default" controller="index" action="index" />
 16.             </imprint>
 17.
 18.                <www-index type="Zend_Controller_Router_Route_Chain">
 19.                    <chain>www, language, index</chain>
 20.                </www-index>
 21.                <www-imprint type="Zend_Controller_Router_Route_Chain">
 22.                    <chain>www, language, imprint</chain>
 23.                </www-imprint>
 24.            </routes>

                                     chain
       :

 1. <routes>
 2.     <www-index type="Zend_Controller_Router_Route_Chain">
 3.          <chain>www</chain>
 4.          <chain>language</chain>
 5.          <chain>index</chain>
 6.     </www-index>
 7.     <www-imprint type="Zend_Controller_Router_Route_Chain">
 8.          <chain>www</chain>
 9.          <chain>language</chain>
 10.               <chain>imprint</chain>
 11.           </www-imprint>
 12.      </routes>


Использование Zend_Config вместе с RewriteRouter
                                                                                       ,
            .                                addConfig().         ,                          ,
                 Zend_Config,                                  RewriteRouter.

                                          INI-    :

 1. [production]
 2. routes.archive.route = "archive/:year/*"
 3. routes.archive.defaults.controller = archive
 4. routes.archive.defaults.action = show
 5. routes.archive.defaults.year = 2000
 6. routes.archive.reqs.year = "\d+"
 7.
 8. routes.news.type = "Zend_Controller_Router_Route_Static"
 9. routes.news.route = "news"
 10.      routes.news.defaults.controller = "news"
                                                                                                         Zend_Controller           106

   11.          routes.news.defaults.action = "list"
   12.
   13.          routes.archive.type = "Zend_Controller_Router_Route_Regex"
   14.          routes.archive.route = "archive/(\d+)"
   15.          routes.archive.defaults.controller = "archive"
   16.          routes.archive.defaults.action = "show"
   17.          routes.archive.map.1 = "year"
   18.          ; ИЛИ: routes.archive.map.year = 1

     INI-                                                      Zend_Config                           :

   1. $config = new Zend_Config_Ini('/path/to/config.ini', 'production');
   2. $router = new Zend_Controller_Router_Rewrite();
   3. $router->addConfig($config, 'routes');

                                              ,                                           'routes'                INI
            .                                                                                                             ,
                                        'archive'             'news'.                            ,                         ,
'route'                       'defaults';                                                                        'reqs'
(              'required').                                                         ,
Zend_Controller_Router_Route_Interface.                                 'type'
        ,                                     ;
Zend_Controller_Router_Route.                                                    'news'
Zend_Controller_Router_Route_Static.

Создание подклассов маршрутизатора
                RewriteRouter            ,
                ,                                     .                      ,
                    ,
            .

      -                                                                                                  .
Zend_Controller_Router_Interface                                                    ,
                          .

   1. interface Zend_Controller_Router_Interface
   2. {
   3.   /**
   4.    * @param Zend_Controller_Request_Abstract $request
   5.    * @throws Zend_Controller_Router_Exception
   6.    * @return Zend_Controller_Request_Abstract
   7.    */
   8.   public function route(Zend_Controller_Request_Abstract $request);
   9. }

                                                  -                                                          .
                                                                ,                                                ,
                        ,                                 .                                                          .
                                   ,                                                                                           .
                                                                                                                                                 Zend_Controller         107


Диспетчер
Обзор

                              —                                                                  (Zend_Controller_Request_Abstract),
                                                           ,                                 ,                                           ,
                                                                                                    .                        ,
         ,                                                                                       . Zend_Controller_Dispatcher_Standard
             index                                                                                              , default -            ,
                                                                            ,                    setDefaultController(), setDefaultAction()
 setDefaultModule(),                                           .

Note:             ,
                                          ,                                         ,                            ,                                               ,
                                               ,                                                                                     (
                                          ).                                    1.5.0,
prefixDefaultModule                   true,                             -                                                .

   1.   // Через фронт-контроллер:
   2.   $front->setParam('prefixDefaultModule', true);
   3.
   4.   // Через диспетчер:
   5.   $dispatcher->setParam('prefixDefaultModule', true);



                              .

                                                                                        -               .                        ,
                          ,           -
                                                           ,                    ,                                                                    .
                                      ,                             .

                                                                                                                             ,                   ,
                      .                                            pre/postDispatch                                                                                  ,
                                                                                                                                                         .
              /                                                                                                      ,
                                                       .

                                                   ,                                                                                         ,
_forward();                                                                                 pre/postDispatch()                                               ,
         ,                        ,                                                                                                      ,
                          .

   1.   public function fooAction()
   2.   {
   3.       // переход к другому действию в текущем контроллере и модуле:
   4.       $this->_forward('bar', null, null, array('baz' => 'bogus'));
   5.   }
   6.
   7.   public function barAction()
   8.   {
   9.       // переход к действию в другом контроллере FooController::bazAction()
                                                                             Zend_Controller   108

   10.            // в текущем модуле:
   11.            $this->_forward('baz', 'foo', null, array('baz' => 'bogus'));
   12.       }
   13.
   14.       public function bazAction()
   15.       {
   16.           // переход к действию в другом контроллере в другом модуле
   17.           // Foo_BarController::bazAction():
   18.           $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus'));
   19.       }

Создание подклассов диспетчера

Zend_Controller_Front                                                                  .
                                   ,                                              .

                                                     -            "   ",
                         ,                                ,
                             ,   API                                                       ,
                                          .

Zend_Controller_Dispatcher_Interface                          ,
                            :

   1. interface Zend_Controller_Dispatcher_Interface
   2. {
   3.     /**
   4.      * Формирует из данной строки имя класса контроллера.
   5.      *
   6.      * @param string $unformatted
   7.      * @return string
   8.      */
   9.     public function formatControllerName($unformatted);
   10.
   11.          /**
   12.           * Формирует из данной строки имя метода действия.
   13.           *
   14.           * @param string $unformatted
   15.           * @return string
   16.           */
   17.          public function formatActionName($unformatted);
   18.
   19.          /**
   20.           * Определяет, доступен ли для диспетчеризации запрос
   21.           *
   22.           * @param Zend_Controller_Request_Abstract $request
   23.           * @return boolean
   24.           */
   25.          public function isDispatchable(Zend_Controller_Request_Abstract $request);
   26.
   27.          /**
   28.           * Устанавливает пользовательский параметр
   29.           * (через фронт-контроллер или для локального использования)
   30.           *
   31.           * @param string $name
   32.           * @param mixed $value
   33.           * @return Zend_Controller_Dispatcher_Interface
   34.           */
                                                                          Zend_Controller   109

35.            public function setParam($name, $value);
36.
37.            /**
38.             * Устанавливает массив пользовательских параметров
39.             *
40.             * @param array $params
41.             * @return Zend_Controller_Dispatcher_Interface
42.             */
43.            public function setParams(array $params);
44.
45.            /**
46.             * Возвращает один пользовательский параметр
47.             *
48.             * @param string $name
49.             * @return mixed
50.             */
51.            public function getParam($name);
52.
53.            /**
54.             * Возвращает все пользовательские параметры
55.             *
56.             * @return array
57.             */
58.            public function getParams();
59.
60.            /**
61.             * Очищает весь стек пользовательских параметров
62.             * или удаляет один пользовательский параметр
63.             *
64.             * @param null|string|array один ключ или массив ключей для удаления
65.             * @return Zend_Controller_Dispatcher_Interface
66.             */
67.            public function clearParams($name = null);
68.
69.            /**
70.             * Устанавливает объект ответа для использования, если есть
71.             *
72.             * @param Zend_Controller_Response_Abstract|null $response
73.             * @return void
74.             */
75.            public function setResponse(Zend_Controller_Response_Abstract $response =
      null);
76.
77.            /**
78.             * Возвращает объект ответа, если есть
79.             *
80.             * @return Zend_Controller_Response_Abstract|null
81.             */
82.            public function getResponse();
83.
84.            /**
85.             * Добавляет директорию в стек директорий контроллеров
86.             *
87.             * @param string $path
88.             * @param string $args
89.             * @return Zend_Controller_Dispatcher_Interface
90.             */
91.            public function addControllerDirectory($path, $args = null);
92.
93.            /**
94.             * Устанавливает директорию(-ии), в которой хранятся файлы контроллеров
                                                                           Zend_Controller   110

   95.            *
   96.            * @param string|array $dir
   97.            * @return Zend_Controller_Dispatcher_Interface
   98.            */
   99.           public function setControllerDirectory($path);
   100.
   101.          /**
   102.           * Возвращает установленную в данное время директорию(-ии) для поиска
   103.           * файлов контроллеров
   104.           *
   105.           * @return array
   106.           */
   107.          public function getControllerDirectory();
   108.
   109.          /**
   110.           * Направляет запрос (модулю/)контроллеру/действию.
   111.           *
   112.           * @param Zend_Controller_Request_Abstract $request
   113.           * @param Zend_Controller_Response_Abstract $response
   114.           * @return Zend_Controller_Request_Abstract|boolean
   115.           */
   116.          public function dispatch(Zend_Controller_Request_Abstract $request,
       Zend_Controller_Response_Abstract $response);
   117.
   118.          /**
   119.           * Валиден или нет данный модуль
   120.           *
   121.           * @param string $module
   122.           * @return boolean
   123.           */
   124.          public function isValidModule($module);
   125.
   126.          /**
   127.           * Возвращает используемое по умолчанию имя модуля
   128.           *
   129.           * @return string
   130.           */
   131.          public function getDefaultModule();
   132.
   133.          /**
   134.           * Возвращает используемое по умолчанию имя контроллера
   135.           *
   136.           * @return string
   137.           */
   138.          public function getDefaultControllerName();
   139.
   140.          /**
   141.           * Возвращает имя используемого по умолчанию действия
   142.           *
   143.           * @return string
   144.           */
   145.          public function getDefaultAction();
   146.      }



Zend_Controller_Dispatcher_Abstract,
Zend_Controller_Dispatcher_Standard                                           .
                                                                                                     Zend_Controller                 111


                                                   ,                                                 -                       ,
                                                                                                         .

Контроллеры действий
Введение

Zend_Controller_Action -                           ,
                                                                   -                                             ,
             Model-View-Controller (MVC).

        ,                           Zend_Controller_Action,
                           (
        ).                                                                                                                       ,
                                         ,                                                                   .
                           Zend_Controller
                      ,                                'Action'.

                            ,                                                       :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // делает что-нибудь
   6.     }
   7.
   8.     public function bazAction()
   9.     {
   10.              // делает что-нибудь
   11.          }
   12.      }

                           FooController       (                   foo)                         - bar                baz.

                                                                       ,                                             (
              ,                                               ),             pre-       post-dispatch
                                .                                                                                        .

Note:
                     -                                                     ViewRenderer.
                                                                                                         .
                                                       ,                                         :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function init()
   4.     {
   5.         // Локально, только для данного контроллера:
   6.         $this->_invokeArgs['noViewRenderer'] = true;
   7.
   8.         // Глобально:
                                                                                       Zend_Controller           112

   9.                $this->_helper->removeHelper('viewRenderer');
   10.
   11.                        // Тоже глобально, но должен использоваться вместе
   12.                        // с локальной версией для того, чтобы распространить
   13.                        // действие на данный контроллер:
   14.                        Zend_Controller_Front::getInstance()
   15.                            ->setParam('noViewRenderer', true);
   16.                }
   17.       }

initView(), getViewScript(), render()           renderScript()                         ViewRenderer,
                                                                          noViewRenderer.
                                                                                           noRender
ViewRenderer:

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // отключение авторендеринга для этого действия:
   6.         $this->_helper->viewRenderer->setNoRender();
   7.     }
   8. }

                                          ViewRenderer   -
                                                (        ,
                                   -         ,     ,   SOAP, XML-RPC,       REST).
                                           ViewRenderer,
         .

Инициализация объекта

                 ,                                                                          ,
                              . Zend_Controller_Action::__construct()                                        ,
    ,                                                ,                ,                         -        .
                                                  ,
parent::__construct($request, $response, $invokeArgs)                                   .

                                                                                            init(),
                                       __construct().        ,
                          :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function init()
   4.     {
   5.         $this->db = Zend_Db::factory('Pdo_Mysql', array(
   6.             'host'     => 'myhost',
   7.             'username' => 'user',
   8.             'password' => 'XXXXXXX',
   9.             'dbname'   => 'website'
   10.              ));
   11.          }
   12.      }
                                                                                                                 Zend_Controller        113

Перехватчики Pre- и Post-Dispatch

Zend_Controller_Action                                        ,                                                                     ,
preDispatch()        postDispatch().                                                                     -                 ,
                                                                                   (                                 _forward()
preDispatch()                                                       )
                                         (           postDispatch()).

Аксессоры

                                                                                         ,                                          -
          .

   •                     :                           getRequest()                                    ,
                                             .
   •                     :                           getResponse()                                   ,
                                                      .
                 :
           1. $this->getResponse()->setHeader('Content-Type', 'text/xml');
           2. $this->getResponse()->appendBody($content);
   •                         :                   -                                                                     ,
                                 .                                          getInvokeArg($key),
                                         ,                        getInvokeArgs().
   •                             :                                                                     ,         ,
        _GET, _POST,                                                    ,                            URL.
                      _getParam($key)    _getAllParams().
                 ,               _setParam(),
                _forward().

                                     ,                                        (                                                ),
                       _hasParam($key).

        Note: _getParam()                                                                    ,
                   ,                                      ,                                                  .
                                                          _hasParam()                            :

           1.   // Используется значение по умолчанию 1, если id не установлен
           2.   $id = $this->_getParam('id', 1);
           3.
           4.   // Вместо:
           5.   if ($this->_hasParam('id') {
           6.       $id = $this->_getParam('id');
           7.   } else {
           8.       $id = 1;
           9.   }

Интеграция вида

Note:                                                                        ViewRenderer
                                                                              ,
ViewRenderer.                                                                   .
                                                                                                                        Zend_Controller      114

Zend_Controller_Action                                                                                                   .
                 : initView()               render().
        $view,                                                    ,
       ,                                                                                                       .

Инициализация вида

initView()                                            . render()                      initView()                                         ,
                                                                              .                 initView()
$view         Zend_View,                                                                              ,
Zend_View_Interface.   $view                                              ,                                                  .

                  ,                                   ,                                                                                  :

     1. applicationOrModule/
     2.     controllers/
     3.         IndexController.php
     4.     views/
     5.         scripts/
     6.             index/
     7.                 index.phtml
     8.         helpers/
     9.         filters/

                           ,                ,                                                                      views/scripts/
                        views                                                                                       (
                  ,             ).                                                            ,
                                     views/scripts/                               ,
                       ,                                         .

Рендеринг видов

render()                                          :

     1. string render(string $action = null,
     2.               string $name = null,
     3.               bool $noController = false);

render()                   .                                                              ,                  ,
      [controller]/[action].phtml                 (          .phtml   -                        $viewSuffix).
     $action                                                                           [controller].           ,
                                          [controller],                                    true     $noController.
                                      ,
         ,                                      $name.

Note:                                                                                                      -                     ,   ,
'_', '.', '-',        render()                        '-',                                                .
                                                                                                  .                     ,
/foo.bar/baz-bat                                                      foo-bar/baz-bat.phtml.
                 camelCase,                                  ,
                    '-'     .
                                                                                        Zend_Controller         115

                     :

  1. class MyController extends Zend_Controller_Action
  2. {
  3.     public function fooAction()
  4.     {
  5.         // Рендеринг my/foo.phtml
  6.         $this->render();
  7.
  8.         // Рендеринг my/bar.phtml
  9.         $this->render('bar');
  10.
  11.              // Рендеринг baz.phtml
  12.              $this->render('baz', null, true);
  13.
  14.              // Рендеринг my/login.phtml в сегмент 'form' объекта ответа
  15.              $this->render('login', 'form');
  16.
  17.              // Рендеринг site.phtml в сегмент 'page' объекта ответа,
  18.              // при этом не используется поддиректория 'my/'
  19.              $this->render('site', 'page', true);
  20.          }
  21.
  22.          public function bazBatAction()
  23.          {
  24.              // Рендеринг my/baz-bat.phtml
  25.              $this->render();
  26.          }
  27.      }

Сервисные методы

                                         , Zend_Controller_Action
                                                                 (                     pre-   post-dispatch).

  •   _forward($action, $controller = null, $module = null, array $params = null):
                    .                preDispatch(),
                                     .             ,                     _forward(),
                 ,                                 .
  •   _redirect($url, array $options = array()):                                                           .
                             URL                           .
                         HTTP 302.

                                                               :

         o   exit:                                     .                    ,
                                                                                .

                                                                     ,
             setRedirectExit().

         o   prependBase:                        URL                                               URL.
                                                                                                  Zend_Controller   116

                                                                                    ,
                    setRedirectPrependBase().

            o       code:         HTTP                                             .
                    HTTP 302.                                           301       306.

                                                                                    ,
                    setRedirectCode().

Создание подклассов контроллера действий

        ,
Zend_Controller_Action.                    ,                                                 ,
                     .

                                                                -             ,                                 ,
                                                                                                          .
                                                    ,                   Zend_Controller_Action,
                            .

Example #1

                                     ,
        ,                          Zend_Controller_Action::__call(). __call()
                                         PHP.

                                                        Zend_Controller_Action_Exception,                ,
                                                .                                                   'Action',
                     ,                                                     ;
        404.                                                              500.
                                                         ,                               ,
                .

            ,                                                       ,                                     :

   1. class MyController extends Zend_Controller_Action
   2. {
   3.     public function __call($method, $args)
   4.     {
   5.         if ('Action' == substr($method, -6)) {
   6.             // Если метод действия не найден, то рендерится шаблон ошибки
   7.             return $this->render('error');
   8.         }
   9.
   10.              // все другие методы бросают исключение
   11.              throw new Exception('Invalid method "'
   12.                                  . $method
   13.                                  . '" called',
   14.                                  500);
   15.          }
   16.      }
                                                                         Zend_Controller   117

                                ,
         :

1. class MyController extends Zend_Controller_Action
2. {
3.     public function indexAction()
4.     {
5.         $this->render();
6.     }
7.
8.     public function __call($method, $args)
9.     {
10.              if ('Action' == substr($method, -6)) {
11.                  // Если метод действия не был найден, то производится
12.                  // переход к действию index
13.                  return $this->_forward('index');
14.              }
15.
16.              // все другие методы бросают исключение
17.              throw new Exception('Invalid method "'
18.                                  . $method
19.                                  . '" called',
20.                                  500);
21.          }
22.      }

             __call(),                  ,       ,                    ,                 ,
                            ,                             ,
                                    .       ,                                  ,
                         initView():

1. abstract class My_Base_Controller extends Zend_Controller_Action
2. {
3.     public function initView()
4.     {
5.         if (null === $this->view) {
6.             if (Zend_Registry::isRegistered('view')) {
7.                 $this->view = Zend_Registry::get('view');
8.             } else {
9.                 $this->view = new Zend_View();
10.                      $this->view->setBasePath(dirname(__FILE__) . '/../views');
11.                  }
12.              }
13.
14.              return $this->view;
15.          }
16.      }

     ,                                           ,                             ,
                                                .
                                                                                                        Zend_Controller   118


Помощники действий
Введение

                          (action helpers)
                                                                        ,
Zend_Controller_Action.
                                                                                                                   .

                                                                        .
                    (brokerage system),                      ,                                 Zend_View_Helper
Zend_Controller_Plugin.                                (    Zend_View_Helper)
               ,                                                (                          )
        (init()).        ,                                        , .                                          .

Инициализация помощника

                                                                                               ,
                                  ,                                         .

                                                 $_helper       Zend_Controller_Action;
                                        .                                       :

   •                                        getHelper().                               ,
                  :
            1. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
            2. $flashMessenger->addMessage('We did something in the last request');
   •                           "          "       __get()                   -
                             ,                                                  :
            1. $flashMessenger = $this->_helper->FlashMessenger;
            2. $flashMessenger->addMessage('We did something in the last request');
   •              ,                                              direct(),
               ,                                           .         ,       FlashMessenger
                          addMessage():
            1. $this->_helper->FlashMessenger('We did something in the last request');

Note:                                                           .

                                                            .                                       ,
                                             ,
                      .                                             ,                                        PHP.

Брокер помощников

Zend_Controller_Action_HelperBroker
            ,                                                           .

        ,                                                           ,               addHelper:

   1. Zend_Controller_Action_HelperBroker::addHelper($helper);
                                                                                                       Zend_Controller           119

            ,                                                                                                       ,
                                                                           : addPrefix()   addPath().

    •   addPrefix()                                                                                ,
                                      .                        ,
                 Zend Framework- .
           1. // Добавление помощников, начинающихся
           2. // с My_Action_Helpers в My/Action/Helpers/
           3. Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');
    •   addPath()
                     (                'Zend_Controller_Action_Helper').
                                                                                               .
            1. // Добавление помощников, начинающихся с Helper в Plugins/Helpers/
            2. Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers',
            3.                                              'Helper');

                                      ,
                                                                       .

                                                                   PluginLoader                             .
        PluginLoader,                                      getPluginLoader(),
PluginLoader,                setPluginLoader().

                         ,                             ,                     hasHelper($name),          $name -
                                 :

    1. // Проверка, зарегистрирован ли помощник 'redirector' в брокере:
    2. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
    3.     echo 'Redirector helper registered';
    4. }

                                                                                                        :
getExistingHelper()          getStaticHelper(). getExistingHelper()
                                                                                           ,
             . getStaticHelper()                           ,          getExistingHelper(),                               ,
                                              ,                                                                      .
getStaticHelper()                                  ,                                                                         .

                                                   , $name,
(               ).

    1. //   Проверка, зарегистрирован ли помощник 'redirector' в брокере,
    2. //   и его извлечение:
    3. if   (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
    4.       $redirector =
    5.           Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
    6. }
    7.
    8. //   Или просто извлеките его, не заботясь о том,
    9. //   был ли он ранее зарегистрирован:
    10.        $redirector =
    11.            Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    12.        }
                                                                                           Zend_Controller               120

       ,                                                                          removeHelper($name),
   $name -                                            :

   1.   // Удаление помощника 'redirector' из брокера, помещенное
   2.   // в условную конструкцию
   3.   if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
   4.       Zend_Controller_Action_HelperBroker::removeHelper('redirector')
   5.   }

Встроенные помощники действий

Zend Framework                                                     : AutoComplete
                                               AJAX; ContextSwitch AjaxContext
                                                       ; FlashMessenger
              ; Json                                      JSON; Redirector,
                                                                                               ;       ViewRenderer,
                                                                                               .

ActionStack

             ActionStack                                                ActionStack                -             ,
                                                  ,                                .

         /                  /      .

Note:                            ActionStack                      ActionStack
                                ActionStack                                     ActionStack.                         ,
                                                             ActionStack               ,
                .

Example #1                                                          ,

                                                              ,                            (
                       ),               ,                   Zend_Controller_Action::_forward():

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // Добавление двух действий в стек
   6.         // Добавление вызова к /foo/baz/bar/baz
   7.         // (FooController::bazAction() с переменной запроса bar == baz)
   8.         $this->_helper->actionStack('baz',
   9.                                     'foo',
   10.                                           'default',
   11.                                           array('bar' => 'baz'));
   12.
   13.              // Добавление вызова к /bar/bat
   14.              // (BarController::batAction())
   15.              $this->_helper->actionStack('bat', 'bar');
   16.          }
   17.      }
                                                                                      Zend_Controller       121

Example #2

                                                 ,                                .
                                  ActionStack.

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // Добавление двух действий в стек
   6.         // Добавление вызова к /foo/baz/bar/baz
   7.         // (FooController::bazAction() с переменной запроса bar == baz)
   8.         $request = clone $this->getRequest();
   9.         // Не устанавливайте контроллер и модуль;
   10.              // используются текущие значения
   11.              $request->setActionName('baz')
   12.                      ->setParams(array('bar' => 'baz'));
   13.              $this->_helper->actionStack($request);
   14.
   15.              // Add call to /bar/bat
   16.              // (BarController::batAction())
   17.              $request = clone $this->getRequest();
   18.              // Не устанавливайте модуль;
   19.              // используется текущиее значение
   20.              $request->setActionName('bat')
   21.                      ->setControllerName('bar');
   22.              $this->_helper->actionStack($request);
   23.          }
   24.      }

AutoComplete

       JavaScript-               AJAX                                                   ,
                                                         ,                                  .
AutoComplete                                                                                            .

                 JavaScript-                                              ,
AutoComplete                                                                  ,
                       ,                                              .
        - JSON-                , JSON-                       (                  -
                                    ,                            ),           HTML.

                                                     :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // Выполнение некоторой логики...
   6.
   7.         // Кодирование и отправка ответа:
   8.         $this->_helper->autoCompleteDojo($data);
   9.
   10.              // То же самое явным образом:
   11.              $response = $this->_helper->autoCompleteDojo
   12.                                        ->sendAutoCompletion($data);
                                                                                                             Zend_Controller       122

  13.
  14.                          // Или просто подготовьте ответ для автодополнения:
  15.                          $response = $this->_helper->autoCompleteDojo
  16.                                                    ->prepareAutoCompletion($data);
  17.                   }
  18.         }

                                                              :

  •                                     ViewRenderer.
  •                                                                   .
  •                                                                                                                            .
  •                             .

                                                          :

  •     disableLayouts()                                                                         ViewRenderer.
                    prepareAutoCompletion().
  •     encodeJson($data, $keepLayouts = false)                                                                  JSON,
                                                                               .
        prepareAutoCompletion().
  •     prepareAutoCompletion($data, $keepLayouts = false)
                  ,                                                       ,
                                    .
                        .
  •     sendAutoCompletion($data, $keepLayouts = false)
                  ,                                                       .                 prepareAutoCompletion()
                                         .
  •     direct($data, $sendNow = true, $keepLayouts = false)                                          ,
                                                            .             $sendNow                                         ,
                                         - sendAutoCompletion()               prepareAutoCompletion().
                                            .

                            AutoComplete                  AJAX-                      Dojo       Scriptaculous.

Автодополнение c Dojo

 Dojo                                                             ,                         ,
                      : ComboBox FilteringSelect.
        ,                       QueryReadStore,                                         » dojo.data
                                         .

 Zend Framework                                                                                             AutoCompleteDojo,
                                         ,                                                          Dojo:

  1. // в контроллере действий:
  2. $this->_helper->autoCompleteDojo($data);

Example #3                                   Dojo   Zend MVC
                                                                                                           Zend_Controller    123

                Dojo              Zend MVC                                                         :
         ComboBox,                                                                ,
                                  ,                       QueryReadStore
javascript-                                                 .

                           ,                                  javascript. Dojo
                                          -                                      JavaScript,                   ,    Zend
Framework               PHP.                                                            ,
              .                        'custom'                       ,                            Dojo.
                    TestNameReadStore.js                                   :

   1. dojo.provide("custom.TestNameReadStore");
   2. dojo.declare("custom.TestNameReadStore", dojox.data.QueryReadStore, {
   3.     fetch:function (request) {
   4.         request.serverQuery = { test:request.query.name };
   5.         return this.inherited("fetch", arguments);
   6.     }
   7. });

                                                 QueryReadStore                Dojo,
              .                                      ,                                         ,
          'test'.

                                      ,                                                                :

   1. class TestController extends Zend_Controller_Action
   2. {
   3.     protected $_form;
   4.
   5.     public function getForm()
   6.     {
   7.         if (null === $this->_form) {
   8.             $this->_form = new Zend_Form();
   9.             $this->_form->setMethod('get')
   10.                      ->setAction(
   11.                          $this->getRequest()->getBaseUrl() . '/test/process'
   12.                      )
   13.                      ->addElements(array(
   14.                          'test' => array('type' => 'text', 'options' => array(
   15.                              'filters'        => array('StringTrim'),
   16.                              'dojoType'       => array('dijit.form.ComboBox'),
   17.                              'store'          => 'testStore',
   18.                              'autoComplete'   => 'false',
   19.                              'hasDownArrow'   => 'true',
   20.                              'label' => 'Your input:',
   21.                          )),
   22.                          'go' => array('type' => 'submit',
   23.                                        'options' => array('label' => 'Go!'))
   24.                      ));
   25.              }
   26.              return $this->_form;
   27.          }
   28.      }

                                                       'test' 'go'.      'test'                                           ,
                        Dojo                  : dojoType, store, autoComplete hasDownArrow.                  'dojoType'
                                                                                                                  Zend_Controller   124

                ,                  ComboBox,                                           (      'store') 'testStore'.
                        'autoComplete' false,             Dojo,
                    ,                                                     .           , 'hasDownArrow'
                        ,                                             ,
                    .

                                                                                                          :

  1. class TestController extends Zend_Controller_Action
  2. {
  3.     // ...
  4.
  5.     /**
  6.       * Страница с формой
  7.       */
  8.     public function indexAction()
  9.     {
  10.               $this->view->form = $this->getForm();
  11.           }
  12.
  13.           public function autocompleteAction()
  14.           {
  15.               if ('ajax' != $this->_getParam('format', false)) {
  16.                   return $this->_helper->redirector('index');
  17.               }
  18.               if ($this->getRequest()->isPost()) {
  19.                   return $this->_helper->redirector('index');
  20.               }
  21.
  22.               $match = trim($this->getRequest()->getQuery('test', ''));
  23.
  24.               $matches = array();
  25.               foreach ($this->getData() as $datum) {
  26.                   if (0 === strpos($datum, $match)) {
  27.                       $matches[] = $datum;
  28.                   }
  29.               }
  30.               $this->_helper->autoCompleteDojo($matches);
  31.           }
  32.       }

                autocompleteAction()                                          .                               ,
POST-                                     'format'           'ajax',
            .                                   'test'                                                (
                                     getData(),                                                  ).
                                                         AutoCompletion.

                                                                                  .
        ,                                                                             Dojo,
        .                                                         :

  1. <?php // установка хранилища данных: ?>
  2. <div dojoType="custom.TestNameReadStore" jsId="testStore"
  3.     url="<?php echo $this->baseUrl() ?>/unit-test/autocomplete/format/ajax"
  4.     requestMethod="get"></div>
  5.
                                                                                                                     Zend_Controller   125

   6. <?php            // рендеринг формы: ?>
   7. <?php            echo $this->form ?>
   8.
   9. <? //            подключение CSS для Dojo в HTML-заголовке: ?>
   10.                 <?php $this->headStyle()->captureStart() ?>
   11.                 @import "<?php echo $this->baseUrl()
   12.                 ?>/javascript/dijit/themes/tundra/tundra.css";
   13.                 @import "<?php echo $this->baseUrl() ?>/javascript/dojo/resources/dojo.css";
   14.                 <?php $this->headStyle()->captureEnd() ?>
   15.
   16.                 <?php // подключение javascript в HTML-заголовке, включая все
   17.                    // необходимые библиотеки для Dojo: ?>
   18.                 <?php $this->headScript()
   19.                         ->setAllowArbitraryAttributes(true)
   20.                         ->appendFile($this->baseUrl() . '/javascript/dojo/dojo.js',
   21.                             'text/javascript',
   22.                             array('djConfig' => 'parseOnLoad: true'))
   23.                         ->captureStart() ?>
   24.                 djConfig.usePlainJson=true;
   25.                 dojo.registerModulePath("custom","../custom");
   26.                 dojo.require("dojo.parser");
   27.                 dojo.require("dojox.data.QueryReadStore");
   28.                 dojo.require("dijit.form.ComboBox");
   29.                 dojo.require("custom.TestNameReadStore");
   30.                 <?php $this->headScript()->captureEnd() ?>

                                                                    ,    ,        headStyle          headScript, -
               ,                                                   HTML-                                    .

                                              ,                            Dojo                  .

Автодополнение с Scriptaculous

» Scriptaculous                  HTML-                                            .

                                                              'AutoCompleteScriptaculous'.
       ,                                  HTML,                    Ajax.Autocompleter.

ContextSwitch и AjaxContext

                       ContextSwitch                                                                                                   .
               AjaxContext                                                                ContextSwitch,
                          ,                                        XmlHttpRequest.

           ,                                                       -                                     ,
                   ,                                                                  .
                                                          ,                                                              :

   •                                  ,                        .
   •                                                                   ,
                                                  .
   •                          HTTP-                   ,                                              .
   •
           /              -               .
                                                                                          Zend_Controller       126

                                                       :

1. class NewsController extends Zend_Controller_Action
2. {
3.     /**
4.       * Начальная страница, производится переход к listAction()
5.       */
6.     public function indexAction()
7.     {
8.          $this->_forward('list');
9.     }
10.
11.           /**
12.             * Выводит список новостей
13.             */
14.           public function listAction()
15.           {
16.           }
17.
18.           /**
19.             * Просмотр одной новости
20.             */
21.           public function viewAction()
22.           {
23.           }
24.       }

          ,          ,                  listAction()                                  XML.                  ,
                             ,                     ,                listAction()
      XML:

1. class NewsController extends Zend_Controller_Action
2. {
3.     public function init()
4.     {
5.         $contextSwitch = $this->_helper->getHelper('contextSwitch');
6.         $contextSwitch->addActionContext('list', 'xml')
7.                       ->initContext();
8.     }
9.
10.          // ...
11.      }

      :

•                                'Content-Type'                   'text/xml'.
•                                         'xml.phtml' (        'xml.[your suffix]',
                ).

                                      - 'news/list.xml.phtml',                                XML.

                 ,                                         ,                                                .
                                   'format',                                          .              ,
                         ,                                                       ,
     'format'                                  :
                                                                                                                              Zend_Controller          127

   •                    URL: /news/list/format/xml (                                    ,
                                                                                                                 /
                    URL)
   •                   GET: /news/list?format=xml

ContextSwitch                                                 ,                                                                  ,
                                                                                                        -            .

Доступные по умолчанию контексты

                                    ContextSwitch                                                           : json   xml.

   •   JSON.            JSON                                                       'Content-Type'                             'application/json'
                                                 'json.phtml'.

                                                                                                .
                                                                               JSON.

                                                                                                                                       JSON:

          1. $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
   •   XML.            XML                                                    'Content-Type'                              'text/xml'
                                    'xml.phtml'.                                                                                        .

Создание своего контекста

                                                                                                    .              ,
                    YAML,                            PHP,              RSS, ATOM                        . . ContextSwitch
                            .

                                                                                                                                     addContext().
                                             -                                                               .
                                                      :

   •   suffix:       ,                                                                      ,
       ViewRenderer.
   •   headers:                          /                ,                                                               .
   •   callbacks:      ,                                      'init'       'post' (                                  ).
                                                                                ,
                                -                             .

                                                                                            ,
                      ContextSwitch.                                                                                                               .
                ,           JSON                                                                                                 ViewRenderer,
                                                                  JSON.

                            -                                                                           postDispatch()
                                                                               .                    ,                JSON
                                                                       ,                                                                       JSON;
                                                                                                                Zend_Controller                      128

                       ,                                                               JSON                                     ,
                     ViewRenderer.

                                                                       :

   •   addContext($context, array $spec):                                                .                                          ,
                                           .
   •   setContext($context, array $spec):
                           .                                       ,       addContext().
   •   addContexts(array $contexts):                                                                            .                       $contexts
                                                /              .                   -                                                          ,
                                   .
   •   setContexts(array $contexts):                                                                                                          .
                                                ,     addContexts().
   •   hasContext($context):                                                                  ,                                          true,
            false.
   •   getContext($context):                                                                            ,
                       ,                       addContext().
   •   getContexts():                                                                             /                         .
   •   removeContext($context):                                                .                      true                               , false -
                                       .
   •   clearContexts():                                .

Установка контекстов для действий

                                                                           .
                                   ,                                                    ContextSwitch               "                    "
        .

addActionContext()                                                                                          /           .
             :                 ,                                       ,                      (                                              ).
                                                           :

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function listAction()
   4.     {
   5.     }
   6.
   7.     public function viewAction()
   8.     {
   9.     }
   10.
   11.          public function commentsAction()
   12.          {
   13.          }
   14.
   15.          public function updateAction()
   16.          {
   17.          }
   18.      }
                                                                                                 Zend_Controller   129

                ,                                      XML           'list',                 'comments' -
XML   JSON.                                                                      init():

  1. class FooController extends Zend_Controller_Action
  2. {
  3.     public function init()
  4.     {
  5.         $this->_helper->contextSwitch()
  6.              ->addActionContext('list', 'xml')
  7.              ->addActionContext('comments', array('xml', 'json'))
  8.              ->initContext();
  9.     }
  10.      }

                                                   $contexts                 :

  1. class FooController extends Zend_Controller_Action
  2. {
  3.     public $contexts = array(
  4.          'list'      => array('xml'),
  5.          'comments' => array('xml', 'json')
  6.     );
  7.
  8.     public function init()
  9.     {
  10.                $this->_helper->contextSwitch()->initContext();
  11.           }
  12.       }

                                   ,                                                         .

                                                                                     /       :

  •   addActionContext($action, $context):
                    $action.                             ,                                       . $context
                                       ,                         .

           $context                        TRUE,                 ContextSwitch
                                   .

                                       $context                                                    .

  •   setActionContext($action, $context):
                    $action.                             ,                                       . $context
                                       ,                         .
  •   addActionContexts(array $contexts):                                                                     /    .
      $contexts                                                          /               .
      addActionContext(),                      ,                                                          ,
                       $contexts                             .
  •   setActionContexts(array $contexts):                                    addActionContexts(),
                                           /       ,                             .
  •   hasActionContext($action, $context):                                                   ,
      $action                      .
                                                                                                          Zend_Controller    130

  •   getActionContexts($action = null):                                                              $action
                /                .
  •   removeActionContext($action, $context):
      $action. $context                                         ,                                  .
  •   clearActionContexts($action = null):                                                       $action
                                      .

Инициализация переключения контекста

       ,                                                            ,                                      initContext()
                             :

  1. class NewsController extends Zend_Controller_Action
  2. {
  3.     public function init()
  4.     {
  5.         $this->_helper->contextSwitch()->initContext();
  6.     }
  7. }

                                                                                                  -                  ,
                                      XML,                                           .
                                     initContext():

  1. $contextSwitch->initContext('xml');

Дополнительный функционал

                                      ContextSwitch                                                   .
                    :

  •   setAutoJsonSerialization($flag):                                        JSON
                                                     JSON                                    .
                                                 ,
                    ;                        initContext().
           1. $contextSwitch->setAutoJsonSerialization(false);
           2. $contextSwitch->initContext();

                                                                        getAutoJsonSerialization().

  •   setSuffix($context, $suffix, $prependViewRendererSuffix):                                                  ,
                                                                        $context.
                         ,                                                    ViewRenderer                               ;
                                             .

                                                                                 ,
                        ViewRenderer.

  •   addHeader($context, $header, $content):                                                                    $context.
      $header                                    , $content -                                     .
                                                                                                                              Zend_Controller                      131

                                                                                . addHeader()
                                                                            .

                                                                                                       ,                                               .

•   setHeader($context, $header, $content): setHeader()                                                                       addHeader()
                           ,                                                                                                                                   .
•   addHeaders($context, array $headers):                                                                                                 $context.
              addHeader(),                                                                         ,                                         .
    $headers                                                    /               .
•   setHeaders($context, array $headers.):                                                             addHeaders()
        ,             setHeader(),                                                                                                             .
•   getHeader($context, $header):                                                                                                         .
                               ,                            null.
•   removeHeader($context, $header):                                                                                             .
•   clearHeaders($context):                                                                                    .
•   setCallback($context, $trigger, $callback):
            $trigger           $context.                                                      'init'           'post' (
              ,                                                 -
    postDispatch()). $callback                                                      PHP-                                                  .
•   setCallbacks($context, array $callbacks):
                                   . $callbacks                                                            /                                               .
                                                                                                                                     ,
                      ,                         -                   .
•   getCallback($context, $trigger):                                                                                                          $trigger
               $context.
•   getCallbacks($context):
           /                                        .
•   removeCallback($context, $trigger):                                                                                                       $trigger
               $context.
•   clearCallbacks($context):                                                                                                                 .
•   setContextParam($name):                                                             ,
               .                                                        'format',
                           .

    getContextParam()                                                                                                 .

•   setAutoDisableLayout($flag):                                                                           ,
                                     .                  ,               ,                     ,
                                                                                                                          .                        ,
                                            ,                                                          ,                                 FALSE
    setAutoDisableLayout().                                                                 initContext().

                                                                                        getAutoDisableLayout().

•   getCurrentContext()                                                                                ,                                                           .
                   null,                                                            ,                                          initContext().
                                                                                                                  Zend_Controller         132

Функционал AjaxContext

          AjaxContext                                   ContextSwitch,                                   ,
ContextSwitch,                                  .                                                   .

  -            ,                                                                                              ,              $ajaxable.
                                                                                                    AJAX                    HTTP-
          .                   *ActionContext*()                          AjaxContext                                              .

  -            ,                                                ,                                   XmlHttpRequest.
                          ,                                     XmlHttpRequest,                              isXmlHttpRequest()
                      .                ,                                   ('format')                               ,
                                 XmlHttpRequest,                                                                        .

  -                , AjaxContext                                                   - HTML.
                                            'ajax.phtml'                                                                         .
                                                      .

Example #4                                                           AJAX-

                                                    ,                 'view', 'form'    'process'                           AJAX-
      .                       'view'   'form'                                          HTML-                                         ,
              'process' -                               JSON.

   1. class CommentController extends Zend_Controller_Action
   2. {
   3.     public function init()
   4.     {
   5.         $ajaxContext = $this->_helper->getHelper('AjaxContext');
   6.         $ajaxContext->addActionContext('view', 'html')
   7.                     ->addActionContext('form', 'html')
   8.                     ->addActionContext('process', 'json')
   9.                     ->initContext();
   10.          }
   11.
   12.          public function viewAction()
   13.          {
   14.              // Извлекает один комментарий для просмотра
   15.              // Если определен контекст AjaxContext, то используется
   16.              // скрипт вида comment/view.ajax.phtml
   17.          }
   18.
   19.          public function formAction()
   20.          {
   21.              // Рендерит форму для добавления нового комментария
   22.              // Если определен контекст AjaxContext, то используется
   23.              // скрипт вида comment/form.ajax.phtml
   24.          }
   25.
   26.          public function processAction()
   27.          {
   28.              // Обрабатывает новый комментарий
   29.              // Возвращает результат в формате JSON. Просто присвойте значения
   30.              // переменным вида и эти значения будет возвращены в формате JSON.
   31.          }
                                                                                             Zend_Controller   133

   32.        }

                                      AJAX-
'/comment/view', '/comment/form', '/comment/process'                        'format':
'/comment/view/format/html', '/comment/form/format/html', '/comment/process/format/json' (
                                          ,          : "?format=json").

           AJAX-                                   'X-Requested-With: XmlHttpRequest',
                                               .

FlashMessenger

Введение

           FlashMessenger                                      ,
                     .                                                        FlashMessenger
Zend_Session_Namespace .                ,                                 Zend_Session
Zend_Session_Namespace,                                                   Zend_Session::start()
              .(                                                            . Zend Session).

Базовый пример использования

                                                                                                  .
                     /some/my,                                            "Record Saved!".
                   /some/my-next-request                              (             ).

   1. class SomeController extends Zend_Controller_Action
   2. {
   3.     /**
   4.      * FlashMessenger
   5.      *
   6.      * @var Zend_Controller_Action_Helper_FlashMessenger
   7.      */
   8.     protected $_flashMessenger = null;
   9.
   10.          public function init()
   11.          {
   12.              $this->_flashMessenger =
   13.                  $this->_helper->getHelper('FlashMessenger');
   14.              $this->initView();
   15.          }
   16.
   17.          public function myAction()
   18.          {
   19.              /**
   20.               * используемый по умолчанию метод для получения экземпляра
   21.               * Zend_Controller_Action_Helper_FlashMessenger
   22.               */
   23.              $this->_flashMessenger->addMessage('Record Saved!');
   24.          }
   25.
   26.          public function myNextRequestAction()
   27.          {
   28.              $this->view->messages = $this->_flashMessenger->getMessages();
   29.              $this->render();
                                                                                                               Zend_Controller          134

   30.                    }
   31.              }

JSON

JSON                                                                                             AJAX-               ,
                                                 .                            JSON
         ,                                                            .

                               JSON                                       :

   •                                    ,                    .
   •
         Zend_Json::encode().
                                       Zend_Json_Expr.
                 1. $this->_helper->json($data, array('enableJsonExprFinder' => true));
   •                      ViewRenderer,                        .
   •                                                 'Content-Type'                    'application/json'.
   •                                                       ,                                                             .

                                                             -
                                              encodeJson()       sendJson():

   1. class FooController extends Zend_Controller_Action
   2. {
   3.     public function barAction()
   4.     {
   5.         // произведение некоторых действий...
   6.
   7.         // Отправка ответа JSON:
   8.         $this->_helper->json($data);
   9.
   10.              // или...
   11.              $this->_helper->json->sendJson($data);
   12.
   13.              // либо получение данных в формате json:
   14.              $json = $this->_helper->json->encodeJson($data);
   15.          }
   16.      }

Note:
                                                             JSON (               ,          ,                               JSON
                              ),                                                      JSON                       ,
             -                               /                    .                                     TRUE
                                   :

   1. $this->_helper->json($data, true);

                                                                              .                                                     ,
                        keepLayouts:

   1. $this->_helper->json($data, array('keepLayouts' => true);
                                                                                                        Zend_Controller           135

Note:                                            Zend_Json_Expr
Zend_Json::encode()                                    "       "                 JSON
Zend_Json_Expr.                                              .             ,                                     ,
                     TRUE                     enableJsonExprFinder:

   1. $this->_helper->json($data, array('enableJsonExprFinder' => true);

                                                                                                                 .
                                                          -         ,             keepLayouts.
                Zend_Json::encode().

   1. $this->_helper->json($data, array(
   2.     'enableJsonExprFinder' => true,
   3.     'keepLayouts'          => true,
   4. ));

Redirector
Введение

               Redirector                                      Redirector
                                   URL.                                                                         _redirect(),
       ,                                                                                                             Redirector
                                              gotoSimple($action, $controller, $module, $params),
                            Zend_Controller_Action::_forward().

Redirector                                ,
                     :

   •       setCode()                                                             HTTP,
                               .
   •       setExit()                                                                             exit()
                               .                                   true.
   •       setGotoSimple()                                   URL,                                                        ,
                  gotoSimple()              URL.
           Zend_Controller_Action::_forward(): setGotoSimple($action,                 $controller = null, $module = null,
           array $params = array());
   •       setGotoRoute()                                                 URL,
                   .                                                     /                              ,
                  URL                                                             .
   •       setGotoUrl()                                                 URL,                                         ,
                  gotoUrl()                        URL.                                          URL
                     .
   •       setPrependBase()                                                               URL
           URL,                                setGotoUrl(), gotoUrl(),          gotoUrlAndExit().
   •       setUseAbsoluteUri()                                                     Redirector-
                         URI                                     .                                          ,
                                       $_SERVER['HTTP_HOST'] , $_SERVER['SERVER_PORT']
           $_SERVER['HTTPS']                              URI URL,
                                                                                                Zend_Controller       136

                            .                                         ,
                                .

             , Redirector                              ,                                           :

   •   gotoSimple()                     setGotoSimple()    (              ,       _forward())
       URL                                  .
   •   gotoRoute()                  setGotoRoute()     (                      )           URL
                                    .
   •   gotoUrl()                setGotoUrl()       (           URL)               URL                             .

        ,                                                  URL                      ,
getRedirectUrl().

Базовые примеры использования

Example #5

                                                               ,                  HTTP,
                   (303),                   URL,                                                       .

   1. class SomeController extends Zend_Controller_Action
   2. {
   3.     /**
   4.      * Редиректор - определен для полноты кода
   5.      *
   6.      * @var Zend_Controller_Action_Helper_Redirector
   7.      */
   8.     protected $_redirector = null;
   9.
   10.          public function init()
   11.          {
   12.              $this->_redirector = $this->_helper->getHelper('Redirector');
   13.
   14.              // Установка опций по умолчанию для редиректора
   15.              // Поскольку объект зарегистрирован в брокере помощников,
   16.              // то эти опции будут действительными для всех
   17.              // последующих действий
   18.              $this->_redirector->setCode(303)
   19.                                 ->setExit(false)
   20.                                 ->setGotoSimple("this-action",
   21.                                                  "some-controller");
   22.          }
   23.
   24.          public function myAction()
   25.          {
   26.              /* делаем что-то */
   27.
   28.              // Перенаправление на ранее зарегистрированный URL и
   29.              // принудительное завершение исполнения скрипта:
   30.              $this->_redirector->redirectAndExit();
   31.              return; // никогда не будет достигнуто
   32.          }
   33.       }
                                                                             Zend_Controller   137

Example #6

                         ,                                   ,           ,
                                        exit().

   1. // АЛЬТЕРНАТИВНЫЙ ПРИМЕР
   2. class AlternativeController extends Zend_Controller_Action
   3. {
   4.     /**
   5.      * Редиректор - определен для полноты кода
   6.      *
   7.      * @var Zend_Controller_Action_Helper_Redirector
   8.      */
   9.     protected $_redirector = null;
   10.
   11.          public function init()
   12.          {
   13.              $this->_redirector = $this->_helper->getHelper('Redirector');
   14.          }
   15.
   16.          public function myAction()
   17.          {
   18.              /* делаем что-то */
   19.
   20.              $this->_redirector
   21.                  ->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
   22.              // это место никогда не будет достигнуто,
   23.              // т.к. по умолчанию производится переход и завершение выполнения
   24.              return;
   25.          }

Example #7                           _forward()   gotoSimple()

      gotoSimple()                          Zend_Controller_Action::_forward().
                     ,          URL
:module/:controller/:action/*                            .
                                 .

   1. class ForwardController extends Zend_Controller_Action
   2. {
   3.     /**
   4.      * Редиректор - определен для полноты кода
   5.      *
   6.      * @var Zend_Controller_Action_Helper_Redirector
   7.      */
   8.     protected $_redirector = null;
   9.
   10.          public function init()
   11.          {
   12.              $this->_redirector = $this->_helper->getHelper('Redirector');
   13.          }
   14.
   15.          public function myAction()
   16.          {
   17.              /* Делаем что-то */
   18.
   19.              // Перенаправление на действие 'my-action' контроллера 'my-controller'
   20.              // в текущем модуле с использованием параметров param1 => test и
                                                                                        Zend_Controller   138

  21.                            // param2 => test2
  22.                            $this->_redirector->gotoSimple('my-action',
  23.                                                           'my-controller',
  24.                                                           null,
  25.                                                           array('param1' => 'test',
  26.                                                                 'param2' => 'test2'
  27.                                                                 )
  28.                                                           );
  29.                }
  30.        }

Example #8                                       gotoRoute()

                                              assemble()                      URL,
                                                      .                       ,
                         :

  1. $route = new Zend_Controller_Router_Route(
  2.     'blog/:year/:month/:day/:id',
  3.     array('controller' => 'archive',
  4.           'module' => 'blog',
  5.           'action' => 'view')
  6. );
  7. $router->addRoute('blogArchive', $route);

                             ,           year ( ), month (   ),   day (   )             2006, 4   24
                 ,                      URL /blog/2006/4/24/42.

  1. class BlogAdminController extends Zend_Controller_Action
  2. {
  3.     /**
  4.      * Редиректор - определен для полноты кода
  5.      *
  6.      * @var Zend_Controller_Action_Helper_Redirector
  7.      */
  8.     protected $_redirector = null;
  9.
  10.          public function init()
  11.          {
  12.              $this->_redirector = $this->_helper->getHelper('Redirector');
  13.          }
  14.
  15.          public function returnAction()
  16.          {
  17.              /* делаем что-то */
  18.
  19.              // Перенаправление в архив блога. Строит URL
  20.              // /blog/2006/4/24/42
  21.
  22.              $this->_redirector->gotoRoute(
  23.                  array('year' => 2006,
  24.                        'month' => 4,
  25.                        'day' => 24,
  26.                        'id' => 42),
  27.                  'blogArchive'
  28.              );
  29.          }
  30.       }
                                                                                                   Zend_Controller          139

ViewRenderer
Введение

           ViewRenderer                                                          :

   •                                                                                                ;
                                                                             .
   •                                                      ,                                    ,
                           ,
                                          .
   •                                                                                                            .
   •                                                                                                                        .
   •                                                                  ,                                             -
                       .
   •                                                                                                                    .

Note:                              _forward(),                                       render,
           ,                                                                                ViewRenderer,
                                   .

Note: ViewRenderer                       .                                        -
noViewRenderer ($front->setParam('noViewRenderer', true))
                    (Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')).
                                   ViewRenderer                      ,
                       :

   •                                                      ViewRenderer,
                   :
          1. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
          2. $viewRenderer->setView($view)
          3.               ->setViewSuffix('php');
          4. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
   •                     /                          ViewRenderer                                                :
          1. $viewRenderer =
          2.     Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
          3. $viewRenderer->setView($view)
          4.               ->setViewSuffix('php');

API

                                                                          ViewRenderer
               .
        getStaticHelper()                     :

   1. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');

                                                                                 ViewRenderer
               .               ,                                  ,                      init()
ViewRenderer,                                     $view
addScriptPath()                                               ;                                             ,
                                                                                                                  Zend_Controller       140

                                                        ,
                           ,                                             .

           ,                       postDispatch(),                                       render()                              .

                                                                :

   1. // Класс контроллера, модуль foo:
   2. class Foo_BarController extends Zend_Controller_Action
   3. {
   4.     // Рендеринг bar/index.phtml по умолчанию;
   5.     // не требуется производить какие-либо операции
   6.     public function indexAction()
   7.     {
   8.     }
   9.
   10.          // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
   11.          // Поскольку объект вида определен в preDispatch(), то он всегда доступен.
   12.          public function populateAction()
   13.          {
   14.              $this->view->foo = 'bar';
   15.          }
   16.      }
   17.
   18.      ...
   19.
   20.      // в одном из ваших скриптов вида:
   21.      $this->foo(); // вызывает Foo_View_Helper_Foo::foo()

ViewRenderer                                                                     ,
                       :

   •   setView($view)                                                            ViewRenderer.
                               $view           .
   •   setNeverRender($flag = true)
                                       , . .                                 .                            TRUE,  postDispatch()
                                                       render()                                    . getNeverRender()
                           .
   •   setNoRender($flag = true)
                       .                                TRUE,       postDispatch()
       render()                                    .
       preDispatch()   ( . .                                                                                  ,
                                                       ). getNoRender()                                            .
   •   setNoController($flag = true)                                                           ,                           render(),
                                                                                                      (
                ). getNoController()                                                       .
   •   setNeverController($flag = true)                                              setNoController(),
                               - . .                                                                                   .
       getNeverController()                                                  .
   •   setScriptAction($name)                                                        ,
                . $name                                                                    (                                        ,
                                         ,                          noController).                        ,
                                                                                                                       Zend_Controller       141

                        ,                                                               . getScriptAction()
                            .
   •           setResponseSegment($name)                                                                ,
                                                                                              .                        ,
                                                       ,                                     . getResponseSegment()
                                    .
   •           initView($path, $prefix, $options)                                                                                  ,
                                                               ,                  ViewRenderer.
                                                           :   neverRender, noRender, noController, scriptAction
               responseSegment.
   •           setRender($action = null, $name = null, $noController = false)
               scriptAction, responseSegment,   noController             . direct()
                                                   ,
                                .
                  1.    // Рендеринг 'foo' вместо текущего скрипта вида
                  2.    $this->_helper->viewRenderer('foo');
                  3.
                  4.    // Рендеринг form.phtml в сегмент ответа 'html' в обход
                  5.    // поддиректории:
                  6.    $this->_helper->viewRenderer('form', 'html', true);

               Note: setRender()        direct()                                                                               ,
                                                                            ,           postDispatch()          render()
                                                                .

                                                                                            ViewRenderer.
           ,           initView():

   1. $view    = new Zend_View(array('encoding' => 'UTF-8'));
   2. $options = array('noController' => true, 'neverRender' => true);
   3. $viewRenderer =
   4.     new Zend_Controller_Action_Helper_ViewRenderer($view, $options);

ViewRenderer
       ,                                                                        ,                                  ,
                                        ,
                  .                                                                                 :

   •           :moduleDir                                                                      (                                         ,
                                                                                               ).
   •           :module                                              .
   •           :controller                                                          .
   •           :action                                                  .
   •           :suffix                                                  (
               setViewSuffix()).

                                                           :

   •           setViewBasePathSpec($spec)                                                                   ,
                                             ,                                          .
                                                                                                                  Zend_Controller           142

                     :moduleDir/views.                                                                                                  ,
                       getViewBasePathSpec().
   •    setViewScriptPathSpec($spec)                                                                   ,
                                                                 (                                           ).
                                 :controller/:action.:suffix.
                                 ,           getViewScriptPathSpec().
   •    setViewScriptPathNoControllerSpec($spec)                                                                        ,
                                                                                      ,                          noController
        (                                     ).                                                             :action.:suffix.
                                                                             ,
        getViewScriptPathNoControllerSpec().

                                                                                                           Zend_Filter_Inflector.
             ViewRenderer                                                                          .
              -                                                                                                                         -
                                                       :

   •    getInflector()                                     .         ViewRenderer          ,                                    ,
                                                   .

                                                                                                                                    ,
              ,                           .                                          ViewRenderer
                                                   .

   •    setInflector($inflector, $reference)
                      ViewRenderer.     $reference                        true,
                                                                      ViewRenderer,            ,                    .

Note:
ViewRenderer                                                                                                                .
                                          :

   •    :module:                                  (CamelCase)
                         .               : "FooBarBaz"                            "foo-bar-baz".

                                                                Zend_Filter_Word_CamelCaseToDash
        Zend_Filter_StringToLower.

   •    :controller:                                           (CamelCase)                             ,
                                                                                                                        .               :
        "FooBar"                     "foo-bar"; "FooBar_Admin"                             "foo-bar/admin".

                                                                Zend_Filter_Word_CamelCaseToDash,
        Zend_Filter_Word_UnderscoreToSeparator                 Zend_Filter_StringToLower.

   •    :action:                                           (CamelCase)                     ,                  ,
                   -         ,                                                                                          .               :
        "fooBar"                     "foo-bar"; "foo-barBaz"                          "foo-bar-baz".
                                                                                                                   Zend_Controller               143

                                                        Zend_Filter_Word_CamelCaseToDash,
    Zend_Filter_PregReplace          Zend_Filter_StringToLower.

                                                    API ViewRenderer-
                                                            .                                                  :

•   renderScript($script, $name)                                                                                                         ,
                                                           .                                           ,           ViewRenderer
                                                                         ,
                $script           render()                     .

    Note:                 ,                                                                ,                               noRender
                                                                                                           .

    Note:                 Zend_Controller_Action::renderScript()                                                       renderScript()
                  ViewRenderer.

•   getViewScript($action, $vars)                                               ,
                $action /                     ,                 $vars.
                              ('moduleDir', 'module', 'controller', 'action'    'suffix').
                  ,                              ,                                                                                           .

    getViewScript()                               viewScriptPathSpec,
    viewScriptPathNoControllerSpec,                                                        noController.

                                              ,                                                                           ('-').
            ,                                                  'foo.bar'             'baz:bat',
                                                                        'foo-bar/baz-bat.phtml'                                    .

    Note:              Zend_Controller_Action::getViewScript()
    getViewScript() ViewRenderer- .

•   render($action, $name, $noController)                                       ,                                                      $name
         $noController,                 ,
    (responseSegment noController                              ) ViewRenderer.
    $action (         )     getViewScript().                        ,
            renderScript().

    Note:                                                                      render():                       ,
                                          noController,                              .                             ,
                                         noRender.

    Note:                      Zend_Controller_Action::render()                                    render()
    ViewRenderer.

•   renderBySpec($action, $vars, $name)
                                                               .               $action         $vars
    getScriptPath(),                                                  $name              renderScript().
                                                                                    Zend_Controller       144

Примеры базового использования

Example #9

                                                                             ViewRenderer
                                                                                                 .

   1. // В вашем файле загрузки:
   2. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
   3.
   4. ...
   5.
   6. // Модуль 'foo', контроллер 'bar':
   7. class Foo_BarController extends Zend_Controller_Action
   8. {
   9.     // По умолчанию производится рендеринг bar/index.phtml;
   10.          // дополнительные действия не требуются
   11.          public function indexAction()
   12.          {
   13.          }
   14.
   15.          // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
   16.          // Поскольку объект вида был определен в preDispatch(), то он уже
   17.          // доступен для использования.
   18.          public function populateAction()
   19.          {
   20.              $this->view->foo = 'bar';
   21.          }
   22.
   23.          // Ничего не рендерится, т.к. производится переход на другое действие;
   24.          // это другое действие может производить рендеринг
   25.          public function bazAction()
   26.          {
   27.              $this->_forward('index');
   28.          }
   29.
   30.          // Ничего не рендерится, т.к. производится перенаправление по другому адресу
   31.          public function batAction()
   32.          {
   33.              $this->_redirect('/index');
   34.          }
   35.      }

Note:                           :
                                                                     ,                      ,
URL                                               -                             . ViewRenderer

                 ('/')                    -           ('-').             ,
/foo.bar/baz.bat                                     FooBarController::bazBatAction()
FooBarController.php,                                                    foo-bar/baz-
bat.phtml.              /bar_baz/baz-bat
Bar_BazController::bazBatAction() Bar/BazController.php (
     ),                             bar/baz/baz-bat.phtml.
                                      ,       -                                                  ,    -
                                                           Bar_BazController
Bar/BazController.php. ViewRenderer                                                  .
                                                                                                 Zend_Controller           145

Example #10

                                                                                                     -             ,
                                                (XML, JSON       . .),
        .               -                                                         (setNeverRender()),
                                    (setNoRender()).

   1. // Класс контроллера baz, модуль bar:
   2. class Bar_BazController extends Zend_Controller_Action
   3. {
   4.     public function fooAction()
   5.     {
   6.         // Не производить авторендеринг в этом действии
   7.         $this->_helper->viewRenderer->setNoRender();
   8.     }
   9. }
   10.
   11.      // Класс контроллера bat, модуль bar:
   12.      class Bar_BatController extends Zend_Controller_Action
   13.      {
   14.          public function preDispatch()
   15.          {
   16.              // Не производить авторендеринг во всех действиях этого контроллера
   17.              $this->_helper->viewRenderer->setNoRender();
   18.          }
   19.      }

Note:                                                                                        (
setNeverRender()),                                ,
             ViewRenderer   -                                                 .

Example #11

                                ,                                                        ,
        .         ,                         ,
              ,                                              '           ',                                            .
                                     ,                  setScriptAction() setRender(),
                                     -                                  setRender().

   1. // Класс контроллера bar, модуль foo:
   2. class Foo_BarController extends Zend_Controller_Action
   3. {
   4.     public function addAction()
   5.     {
   6.         // Рендерить 'bar/form.phtml' вместо 'bar/add.phtml'
   7.         $this->_helper->viewRenderer('form');
   8.     }
   9.
   10.          public function editAction()
   11.          {
   12.              // Рендерить 'bar/form.phtml' вместо 'bar/edit.phtml'
   13.              $this->_helper->viewRenderer->setScriptAction('form');
   14.          }
   15.
   16.          public function processAction()
   17.          {
                                                                                                           Zend_Controller          146

   18.                    // произведение валидации...
   19.                    if (!$valid) {
   20.                        // Рендерить 'bar/form.phtml' вместо 'bar/process.phtml'
   21.                        $this->_helper->viewRenderer->setRender('form');
   22.                        return;
   23.                    }
   24.
   25.                    // иначе продолжение обработки...
   26.            }
   27.
   28.        }

Example #12

     ,                                                           -           ,                                                      ?
                                                                             ,                                          ,
                                     ViewRenderer,                                                                          .

   1. // Класс контроллера bar, модуль foo:
   2. class Foo_BarController extends Zend_Controller_Action
   3. {
   4.     public function preDispatch()
   5.     {
   6.         // Изменение кодировки вида
   7.         $this->view->setEncoding('UTF-8');
   8.     }
   9.
   10.          public function bazAction()
   11.          {
   12.              // Получение объекта вида и указание 'htmlspecialchars'
   13.              // в качестве функции для экранирования
   14.              $view = $this->_helper->viewRenderer->view;
   15.              $view->setEscape('htmlspecialchars');
   16.          }
   17.      }

Примеры продвинутого использования

Example #13

                                             ,                                   ,                                  ,
                                                     .               ,                                                          ,
                                                         (   ,           ,                                                  »
Smarty).
                                                                                        .

                                                 ,                                            - '/opt/vendor/templates',
         ,                                                                           ':moduleDir/:controller/:action.:suffix'.
                      ,                 noController                         ,          ,
                                   (':action.:suffix').                  ,                             'tpl'
                               .

   1. /**
   2. * В вашем файле загрузки:
   3. */
                                                                                   Zend_Controller   147

  4.
  5. // Другая реализация вида
  6. $view = new ZF_Smarty();
  7.
  8. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  9. $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
  10.                   ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
  11.                   ->setViewScriptPathNoControllerSpec(':action.:suffix')
  12.                   ->setViewSuffix('tpl');
  13.      Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

Example #14

                                                                                        .
                 -                                         render():

  1. class SearchController extends Zend_Controller_Action
  2. {
  3.     public function resultsAction()
  4.     {
  5.         // Предполагается, что $this->model - текущая модель
  6.         $this->view->results =
  7.             $this->model->find($this->_getParam('query', '');
  8.
  9.         // render() по умолчанию использует ViewRenderer
  10.              // Рендеринг формы поиска и затем результатов поиска
  11.              $this->render('form');
  12.              $this->render('results');
  13.          }
  14.
  15.          public function formAction()
  16.          {
  17.              // Ничего не делается. ViewRenderer автоматически производит
  18.              // рендеринг скрипта вида
  19.          }
  20.      }

Написание собственных помощников

                                                   Zend_Controller_Action_Helper_Abstract,
                                           ,
          .                                    :

  •   setActionController()                                                                 .
  •   init(),                                          ,
                              .                                                                 ,
                                                                                    .
  •   preDispatch()                ,                             .
  •   postDispatch()          ,                                        -
      preDispatch()                    .                                   .
  •   getRequest()                                 .
  •   getResponse()                                .
  •   getName()                        .                                       ,
                                   ,                                           .                ,
                                                                                                  Zend_Controller   148

               Zend_Controller_Action_Helper_Redirector,                   Redirector,
               FooMessage                                            .

                                      direct()                                 .                           ,
                                                                           ,
                                          .          , redirector                      direct()
     goto(),                                                                       :

1. // Перенаправление на /blog/view/item/id/42
2. $this->_helper->redirector('item', 'view', 'blog', array('id' => 42));

                        __call()                                    redirector,                        ,
                           direct,    ,          ,                                                         .

                                  ,                                                     ,
 .
                                                                                                              Zend_Controller          149


Объект ответа
Использование

                                                                                                      .                  —
                                /                  ,              ,                                                          .
        ,       -                                                                                                  ,
                                                                      .
                Zend_Controller_Front::throwExceptions(true):

   1. $front->throwExceptions(true);

                                          ,                   ,                       sendResponse().

   1. $response->sendResponse();

Note:                                -                      sendResponse(),                                                      , ,
                ,                                                             .                   ,
                                                                          ,
                                         returnResponse           Zend_Controller_Front::returnResponse(true):

   1.       $front->returnResponse(true);
   2.       $response = $front->dispatch();
   3.
   4.       // производим необходимые манипуляции с данными (например,
   5.       // журналирование), затем отправляем выходные данные:
   6.       $response->sendResponse();

                                                                                                          .
                                                                          :

   1. // Внутри контроллера действий:
   2. // Установка заголовка
   3. $this->getResponse()
   4.     ->setHeader('Content-Type', 'text/html')
   5.     ->appendBody($content);

                            ,                                                         ,                                      ,
                                               .

Note:                                              ,
                    ,               Zend_Controller_Action::render()                                           .

                    ,                                                 ,                               isException()
                                          ,            getException().                    ,
                        ,                                                                     ,
                ,                                                                                                      . .

                                                                   dispatch()             -                                        -
                ,                                                                 .
                                                                                                  Zend_Controller           150

  1. // Получение объекта ответа после диспетчеризации:
  2. $front->dispatch();
  3. $response = $front->getResponse();
  4. if ($response->isException()) {
  5.     // Журналирование, отправка сообщений и т.д
  6. }
  7.
  8. // Либо метод dispatch() фронт-контроллера возвращает его
  9. $front->returnResponse(true);
  10.      $response = $front->dispatch();
  11.
  12.      // Производим какие-либо манипуляции...
  13.
  14.      // В конце выводим ответ
  15.      $response->sendResponse();

                                                                .
      renderExceptions()                                            throwExceptions()
                -           ,                           :

  1. $response->renderExceptions(true);
  2. $front->dispatch($request, $response);
  3.
  4. // или:
  5. $front->returnResponse(true);
  6. $response = $front->dispatch();
  7. $response->renderExceptions();
  8. $response->sendResponse();
  9.
  10.      // или:
  11.      $front->throwExceptions(true);
  12.      $front->dispatch();

Управление заголовками

                        ,
      HTTP.                                 :

  •   canSendHeaders()                                                ,                                             .
                                      ,                     ,                                 ,
                    .
              headersSentThrowsException FALSE.
  •   setHeader($name, $value, $replace = false)                                                                        .
                                                                                                       .
                $replace TRUE                                                                     .

                                                                    canSendHeaders()                        ,
                                ,               ,                                       .

  •   setRedirect($url, $code = 302)                            HTTP-            "Location"                             .
                                    HTTP,                                                               .

                            setHeader()                         $replace                                        ,
                                                    .
                                                                                                          Zend_Controller       151

  •       getHeaders()                                                   .
                           'name'   'value'.
  •       clearHeaders()                                                                      .
  •       setRawHeader()                                                                     ,
                   /            ,              ,                 HTTP.
  •       getRawHeaders()                                                             setRawHeader()               .
  •       clearRawHeaders()                                                          setRawHeader()            .
  •       clearAllHeaders()                                                              /           ,    "                 "
          (raw).

                                                    ,
          , setHttpResponseCode()                  getHttpResponseCode().

Именованные сегменты

                                                                 .
                                                                     ,
           .                                                                     ,
          -                                                                          .

               ,                                              preDispatch()
      ,                                                                      ,                    postDispatch()
                       :

  1. // Предполагается, что класс плагина зарегистрирован во фронт-контроллере
  2. class MyPlugin extends Zend_Controller_Plugin_Abstract
  3. {
  4.     public function preDispatch(Zend_Controller_Request_Abstract $request)
  5.     {
  6.         $response = $this->getResponse();
  7.         $view = new Zend_View();
  8.         $view->setBasePath('../views/scripts');
  9.
  10.              $response->prepend('header', $view->render('header.phtml'));
  11.          }
  12.
  13.          public function postDispatch(Zend_Controller_Request_Abstract $request)
  14.          {
  15.              $response = $this->getResponse();
  16.              $view = new Zend_View();
  17.              $view->setBasePath('../views/scripts');
  18.
  19.              $response->append('footer', $view->render('footer.phtml'));
  20.          }
  21.      }
  22.
  23.      // Пример контроллера действий
  24.      class MyController extends Zend_Controller_Action
  25.      {
  26.          public function fooAction()
  27.          {
  28.              $this->render();
  29.          }
  30.      }
                                                                                                                                 Zend_Controller         152

                            /my/foo                              ,
                                        :

  1. array(
  2.     'header' => ..., // содержимое верха страницы
  3.     'default' => ..., // содержимое тела страницы из MyController::fooAction()
  4.     'footer' => ... // содержимое низа страницы
  5. );

                                                    ,                                                                    .

                                                                                                                         :

  •   setBody()        appendBody()                                                                     , $name,
                                        .                    ,                                  ,
                                            ,                                (                                                                 ).
               setBody()                                                                  ,
                                .                   appendBody()                                                         ,
                                                                     'default'.
  •   prepend($name, $content)                                                                      $name
               .                                             ,                                                                         ( . .
                       ).
  •   append($name, $content)                                                                   $name
               .                                             ,                                                                         .
  •   insert($name, $content, $parent = null, $before = false)
      $name.                                                     $parent (                ),
                                                (                                    $before)                    .
                   ,                                                                   .
  •   clearBody($name = null)                                                ,                                          $name,
                                    .
  •   getBody($spec = false)                                                                                                       ,           $spec -
                                            .           false,                                              ,
                                                                                                    .           $spec             true,
                                                .

Проверка на исключения в объекте ответа

                                ,                                        ,                                                                 ,
                                                .                                                   ,
                                -                                    ,                    ,                 . .
                                                                                      ,                                                API
                            :

  •   setException(Exception $e)                                                                                             .
  •   isException()                                      ,                                                      -                              .
  •   getException()                                                             .
  •   hasExceptionOfType($type)
           .
  •   hasExceptionOfMessage($message)
                       .
                                                                                                        Zend_Controller              153

  •       hasExceptionOfCode($code)
               .
  •       getExceptionByType($type)                                                                                      .
                           false,                                                 ,       -                      .
  •       getExceptionByMessage($message)
                   .                      false,                                              ,   -                          .
  •       getExceptionByCode($code)                                                                                              .
                           false,                                                 ,       -                      .
  •       renderExceptions($flag)                                             ,               ,
                                                       .

Создание подклассов объекта ответа

                                                                                                                                 ,
                            .                      ,                                      (             )            ,
                       ,                                                              .

                                                   Zend_Controller_Response_Abstract,
                                                                        .
                                .

      ,                                                                       ,                                                      ,
                                                   (         ,                                        CLI       PHP-GTK),
                                                                          ,                                 ,
                                    ,   . .
                                                                                                                       Zend_Controller         154


Плагины
Введение

                                                                                        ,                                                  ,
                                                                                                                       .           -
                                 (plugin broker)                                                                               ,
                                                                                                   ,                                           -
               .

                                                                              Zend_Controller_Plugin_Abstract,
                                                           :

   •       routeStartup()                                  ,               Zend_Controller_Front
                                                                                             .
   •       routeShutdown()                                             ,                                                               .
   •       dispatchLoopStartup()                                             ,    Zend_Controller_Front
                            .
   •       preDispatch()                               ,                                                       .
           (callback)                                                                                  .
                                                   (
           Zend_Controller_Request_Abstract::setDispatched(false))
                        /                                      .
   •       postDispatch()                                          ,                                                       .
                                                                                                   .
                                       (
           Zend_Controller_Request_Abstract::setDispatched(false))
                                           .
   •       dispatchLoopShutdown()                                                    Zend_Controller_Front
                            .

Написание плагинов

       ,                                       ,
Zend_Controller_Plugin_Abstract:

   1. class MyPlugin extends Zend_Controller_Plugin_Abstract
   2. {
   3.     // ...
   4. }

                                Zend_Controller_Plugin_Abstract                                                    ,
                                                                                                                                   .
                                                                                            ,
       .

Zend_Controller_Plugin_Abstract
                                getRequest()                   getResponse(),                              .
                                                                            Zend_Controller   155

Использование плагинов

                                 Zend_Controller_Front::registerPlugin(),
                                  .
                  :

  1. class MyPlugin extends Zend_Controller_Plugin_Abstract
  2. {
  3.      public function routeStartup(Zend_Controller_Request_Abstract $request)
  4.      {
  5.          $this->getResponse()
  6.               ->appendBody("<p>routeStartup() called</p>\n");
  7.      }
  8.
  9.      public function routeShutdown(Zend_Controller_Request_Abstract $request)
  10.           {
  11.               $this->getResponse()
  12.                    ->appendBody("<p>routeShutdown() called</p>\n");
  13.           }
  14.
  15.           public function dispatchLoopStartup(Zend_Controller_Request_Abstract
      $request)
  16.           {
  17.               $this->getResponse()
  18.                    ->appendBody("<p>dispatchLoopStartup() called</p>\n");
  19.           }
  20.
  21.           public function preDispatch(Zend_Controller_Request_Abstract $request)
  22.           {
  23.               $this->getResponse()
  24.                    ->appendBody("<p>preDispatch() called</p>\n");
  25.           }
  26.
  27.           public function postDispatch(Zend_Controller_Request_Abstract $request)
  28.           {
  29.               $this->getResponse()
  30.                    ->appendBody("<p>postDispatch() called</p>\n");
  31.           }
  32.
  33.           public function dispatchLoopShutdown()
  34.           {
  35.               $this->getResponse()
  36.                    ->appendBody("<p>dispatchLoopShutdown() called</p>\n");
  37.           }
  38.       }
  39.
  40.       $front = Zend_Controller_Front::getInstance();
  41.       $front->setControllerDirectory('/path/to/controllers')
  42.             ->setRouter(new Zend_Controller_Router_Rewrite())
  43.             ->registerPlugin(new MyPlugin());
  44.       $front->dispatch();

          ,                                         ,                                 ,
                                              :

  1. <p>routeStartup() called</p>
  2. <p>routeShutdown() called</p>
  3. <p>dispatchLoopStartup() called</p>
                                                                                                                                       Zend_Controller             156

   4. <p>preDispatch() called</p>
   5. <p>postDispatch() called</p>
   6. <p>dispatchLoopShutdown() called</p>

Note:                                                                                                             -                .              ,
            ,                                                                                                 ,                         ,
                    .

Извлечение и работа с плагинами

                                                                                                                          .                                    -
                                                     :

   •    getPlugin($class)                                                                                 .
                ,                               false.                                                                                             ,
                                     .
   •    getPlugins()                                                         .
   •    unregisterPlugin($plugin)                                                                                     .
                                                             ,                                                                .
                ,                                                                     .

Плагины, включенные в стандартную поставку

Zend Framework                                                                                                                              .

ActionStack

        ActionStack                                                                                                           postDispatch.
                                                                                                      ,                           .
                             ,                                                                                                     ,
        .                                                        "                        -                           " (last-in-first-out, LIFO).

                                                         -                                                            ,
Zend_Controller_Front::getPlugin('Zend_Controller_Plugin_ActionStack').                                                                                        ,
                                                                                                  .

   •    getRegistry()                setRegistry().                              ActionStack                                             Zend_Registry
                                         .
                                 .
   •    getRegistryKey()                     setRegistryKey().                                                                                         ,
                                                                                  .
        'Zend_Controller_Plugin_ActionStack'.
   •    getStack()                                                                            .
   •    pushStack()              popStack()                                                                                                     . pushStack()
                                                 .

                                     forward()
                                                                     -                                                                                     ,
                                                                         (
                        ).
                                                                                                                                        Zend_Controller           157

Zend_Controller_Plugins_ErrorHandler

Zend_Controller_Plugins_ErrorHandler                                                                                                              ,
                    ,          ,                                                                                                                              .
                                    ,                                                                                      MVC.

                                              :

   •                               ,
   •                               ,

                     ,           ErrorHandler                                                                  HTTP-                        404 (
         )   500 (                         ).                                                                              ,
                                                                  .

                 Zend_Controller_Plugins_ErrorHandler
ErrorController::errorAction()                                                        .
                           ,                                          -                   ,                                 :

   •   setErrorHandlerModule()                                                ,                                                               .
   •   setErrorHandlerController()                                                                     ,                                              .
   •   setErrorHandlerAction()                                                    ,                                                               .
   •   setErrorHandler()                                                                      ,
       'module', 'controller'          'action'.

             ,                                                                                                                  ,
                           setErrorHandler().

Zend_Controller_Plugin_ErrorHandler                                                                   postDispatch()                              ,
                                                                  .                   ,
         ,                                                                                        .

                                                                                                                       ,                                  -
             ,                                        ,                                                                                 ,
                                                  .

Использование ErrorHandler в качестве обработчика ошибки 404

                                                                                                  ,                                                   ,
                                                          /                                                ,
                          404.                                ,                                                                                               .

                                                                          ,                                                         .
                         Zend_Controller_Action::_getParam('error_handler'):

   1. class ErrorController extends Zend_Controller_Action
   2. {
   3.     public function errorAction()
   4.     {
   5.         $errors = $this->_getParam('error_handler');
                                                                                   Zend_Controller   158

   6.       }
   7. }

                          ,                           $errors->type.
                 :

   •   Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER,           ,
                     .
   •   Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION,       ,
                                     .
   •   Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER,                                  .


          404:

   1. class ErrorController extends Zend_Controller_Action
   2. {
   3.     public function errorAction()
   4.     {
   5.         $errors = $this->_getParam('error_handler');
   6.
   7.         switch ($errors->type) {
   8.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
   9.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
   10.                      // ошибка 404 - не найден контроллер или действие
   11.                      $this->getResponse()
   12.                           ->setRawHeader('HTTP/1.1 404 Not Found');
   13.
   14.                      // ... получение данных для отображения...
   15.                      break;
   16.                  default:
   17.                      // ошибка приложения; выводим страницу ошибки,
   18.                      // но не меняем код статуса
   19.                      break;
   20.              }
   21.          }
   22.      }

                                         ,                                 ,
exception                error_handler:

   1. public function errorAction()
   2. {
   3.         $errors = $this->_getParam('error_handler');
   4.
   5.         switch ($errors->type) {
   6.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
   7.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
   8.                 // ошибка 404 - не найден контроллер или действие
   9.                 $this->getResponse()
   10.                           ->setRawHeader('HTTP/1.1 404 Not Found');
   11.
   12.                      // ... получение данных для отображения...
   13.                      break;
   14.                  default:
   15.                      // ошибка приложения; выводим страницу ошибки,
   16.                      // но не меняем код статуса
                                                                                      Zend_Controller   159

  17.
  18.                                 // ...
  19.
  20.                                 // Журналируем исключение:
  21.                                 $exception = $errors->exception;
  22.                                 $log = new Zend_Log(
  23.                                     new Zend_Log_Writer_Stream(
  24.                                         '/tmp/applicationException.log'
  25.                                     )
  26.                                 );
  27.                                 $log->debug($exception->getMessage() . "\n" .
  28.                                             $exception->getTraceAsString());
  29.                                 break;
  30.                             }
  31.             }

Управление сгенерированным ранее выводом

                                                                   ,
                          render(),         ,
          .                             ,
              .

                      ,                                                        ,
  -                       .                                               ,
      -                       :

  1. $this->getResponse()->clearBody();

Примеры использования плагина

Example #1

  1. $front = Zend_Controller_Front::getInstance();
  2. $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());

Example #2

  1. $front = Zend_Controller_Front::getInstance();
  2. $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
  3.     'module'     => 'mystuff',
  4.     'controller' => 'static',
  5.     'action'     => 'error'
  6. )));

Example #3

  1.      $plugin = new Zend_Controller_Plugin_ErrorHandler();
  2.      $plugin->setErrorHandlerModule('mystuff')
  3.             ->setErrorHandlerController('static')
  4.             ->setErrorHandlerAction('error');
  5.
  6.      $front = Zend_Controller_Front::getInstance();
  7.      $front->registerPlugin($plugin);
                                                                          Zend_Controller   160

Пример контроллера ошибок

      ,                        ErrorHandler,                     .
                      .

  1. class ErrorController extends Zend_Controller_Action
  2. {
  3.     public function errorAction()
  4.     {
  5.         $errors = $this->_getParam('error_handler');
  6.
  7.         switch ($errors->type) {
  8.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  9.             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  10.                      // ошибка 404 - не найден контроллер или действие
  11.                      $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
  12.
  13.                      $content =<<<EOH
  14.      <h1>Ошибка!</h1>
  15.      <p>Запрошенная вами страница не найдена.</p>
  16.      EOH;
  17.                      break;
  18.                  default:
  19.                      // ошибка приложения
  20.                      $content =<<<EOH
  21.      <h1>Ошибка!</h1>
  22.      <p>Произошла непредвиденная ошибка. Пожалуйста, попробуйте позднее.</p>
  23.      EOH;
  24.                      break;
  25.              }
  26.
  27.              // Удаление добавленного ранее содержимого
  28.              $this->getResponse()->clearBody();
  29.
  30.              $this->view->content = $content;
  31.          }
  32.      }
                                                                                          Zend_Controller      161


Использование модульной структуры директорий
Введение


MVC                                                                             -                 .
                               :

    1. docroot/
    2.     index.php
    3. application/
    4.     default/
    5.          controllers/
    6.              IndexController.php
    7.              FooController.php
    8.          models/
    9.          views/
    10.                    scripts/
    11.                        index/
    12.                        foo/
    13.                    helpers/
    14.                    filters/
    15.           blog/
    16.                controllers/
    17.                    IndexController.php
    18.                models/
    19.                views/
    20.                    scripts/
    21.                        index/
    22.                    helpers/
    23.                    filters/
    24.           news/
    25.                controllers/
    26.                    IndexController.php
    27.                    ListController.php
    28.                models/
    29.                views/
    30.                    scripts/
    31.                        index/
    32.                        list/
    33.                    helpers/
    34.                    filters/

                                                                                                .
                                           : 'Blog_IndexController', 'News_IndexController'
'News_ListController'.                                                 : 'IndexController' 'FooController',
                                             .
                           .

Note:                                  ,
                       ,           ,                            ,
                   .
'Default_' -                                                            : 'IndexController' and 'FooController'.
                                                                                  .
                                                                                            Zend_Controller      162

    ,                                                                       ,                          MVC
Zend Framework?

Определение директорий контроллеров в модулях


        -                .                               MVC
setControllerDirectory(),                              addControllerDirectory().
                                                                .

                setControllerDirectory()                                                ,
    /                                                                           .                    'default'
                                                  (                                             ).
                                          ,                                     ,
     default.                 :

   1. $front->setControllerDirectory(array(
   2.       'default' => '/path/to/application/controllers',
   3.       'blog'    => '/path/to/application/blog/controllers'
   4. ));

            addControllerDirectory()                                                .
            ,                                                          ;                    ,
                                      default.           :

   1. $front->addControllerDirectory('/path/to/application/news/controllers',
   2.                                'news');

                         :
                   ,                                                                                       .
                                       addModuleDirectory():

   1. /**
   2. * Предполагается следующая структура директорий:
   3. * application/
   4. *     modules/
   5. *         default/
   6. *              controllers/
   7. *         foo/
   8. *              controllers/
   9. *         bar/
   10.      *              controllers/
   11.      */
   12.      $front->addModuleDirectory('/path/to/application/modules');

                                        default, foo    bar,                                    controllers
                                  .

           setModuleControllerDirectoryName() можно указать другую поддиректорию
контроллеров для использования внутри модулей:

   1. /**
   2. * Изменяем поддиректорию для контроллеров на 'con'
                                                                                                Zend_Controller   163

   3. * application/
   4. *     modules/
   5. *         default/
   6. *              con/
   7. *         foo/
   8. *              con/
   9. *         bar/
   10.      *             con/
   11.      */
   12.      $front->setModuleControllerDirectoryName('con');
   13.      $front->addModuleDirectory('/path/to/application/modules');

Note:                    ,
                                              setModuleControllerDirectoryName().

Маршрутизация применительно к модулям

        ,                                         Zend_Controller_Router_Rewrite,
Zend_Controller_Router_Route_Module.
               :

   •    :module/:controller/:action/*
   •    :controller/:action/*

                 ,
                                          .                                              ,   URL
                                  ,
             ,                        -                             .

Модуль или глобальный контроллер по умолчанию

                     ,                                  ,                                    URL,
                             (IndexController,                                      ).
         ,                                                  ,
                                                    ,                                         'default'.

                                                                          ,
useGlobalDefault              -               :

   1. $front->setParam('useDefaultControllerAlways', true);
                                                                                                                  Zend_Controller             164


Исключения
Введение

                        MVC Zend Framework                                 -                 ,            ,
                                                          .                                   ,                               ,
                                               -                ,
         .

                                                                                                                                              ,
     ,                                 SQL,                                        . .
Zend_Controller_Front                                                                                                                 ;
             ,                                                                                                .

Обработка исключений

                         MVC                                                   ,
                    .

     •                                     ErrorHandler                                           .
                           :
                o                  ,
                o                  ,

                                              postDispatch()                                          ,                                   ,
                                               .                                         ,                                                    -
                                       .


                                                                                              .

     •       Zend_Controller_Front::throwExceptions()

                                                                    TRUE                                          -               ,
                                                                                              ,
                                                              ErrorHandler.                  :

1.           $front->throwExceptions(true);
                2. try {
                3.     $front->dispatch();
                4. } catch (Exception $e) {
                5.     // самостоятельная обработка исключения
                6. }

                           ,
                               ,                                                                                          .

             Zend_Controller_Response_Abstract::renderExceptions()

                                                          TRUE                     ,                                  ,
                                                                                                                      Zend_Controller          165

                        .                                                                             ,
                            .                                                                             .

      Zend_Controller_Front::returnResponse()
Zend_Controller_Response_Abstract::isException().

                                       TRUE                                   Zend_Controller_Front::returnResponse()
         Zend_Controller_Front::dispatch()                                                        ,                       .
                ,                             ,                                               ,                               isException(),
                                            getException().                           :

0.       $front->returnResponse(true);
            1. $response = $front->dispatch();
            2. if ($response->isException()) {
            3.     $exceptions = $response->getException();
            4.     // обработка исключений ...
            5. } else {
            6.     $response->sendHeaders();
            7.     $response->outputBody();
            8. }



         Zend_Controller_Front::throwExceptions()                                         ,
                                                                  .
                            ,                                     ErrorHandler.

Исключения в MVC, с которыми вы можете встретиться

                                    MVC -                                 ,               ,                   ,                            ,
                                                          .
           ,                                                                      ,                                   ,               ,
                                     .

                            :

     •   Zend_Controller_Dispatcher::dispatch()                                                                                   ,
                                                                      .                                                       .
            o                                 useDefaultControllerAlways.

                                                      -                                                                       :

                    1. $front->setParam('useDefaultControllerAlways', true);
                    2.
                    3. // или
                    4.
                    5. $dispatcher->setParam('useDefaultControllerAlways', true);

                                                              ,                                                                       ,
                                                  ,                                           .
                    ,
                                ,                                                                                 .
                                                                                        Zend_Controller   166

       o              ,                    dispatch(),
           Zend_Controller_Dispatcher_Exception,                  'Invalid controller specified' (
                                        ).                             ,
                 ,
                            .
•   Zend_Controller_Action::__call()                              ,
           ,                                              .               ,                   ,
                                                              .
                         :
       o                     Zend_Controller_Action                                 __call().
                    :
               1. class My_Controller_Action extends Zend_Controller_Action
               2. {
               3.     public function __call($method, $args)
               4.     {
               5.         if ('Action' == substr($method, -6)) {
               6.             $controller = $this->getRequest()->getControllerName();
               7.             $url = '/' . $controller . '/index';
               8.             return $this->_redirect($url);
               9.         }
               10.
               11.              throw new Exception('Invalid method');
               12.          }
               13.      }



                                                                      .

       o                     Zend_Controller_Dispatcher                                   getAction()     ,
                                            ,                                       .                 :
               1. class My_Controller_Dispatcher extends Zend_Controller_Dispatcher
               2. {
               3.     public function getAction($request)
               4.     {
               5.         $action = $request->getActionName();
               6.         if (empty($action)) {
               7.             $action = $this->getDefaultAction();
               8.             $request->setActionName($action);
               9.             $action = $this->formatActionName($action);
               10.              } else {
               11.                  $controller = $this->getController();
               12.                  $action     = $this->formatActionName($action);
               13.                  if (!method_exists($controller, $action)) {
               14.                      $action = $this->getDefaultAction();
               15.                      $request->setActionName($action);
               16.                      $action = $this->formatActionName($action);
               17.                  }
               18.              }
               19.
               20.              return $action;
               21.          }
               22.      }

                                                                                                  ;
                                  ,                                             .
                                                                     Zend_Controller    167

                              ,
                          .       ,                 ,               URL
                                   ,                                                .

o               Zend_Controller_Action::preDispatch()
    Zend_Controller_Plugin_Abstract::preDispatch()
                              .

                   Zend_Controller_Action                     preDispatch(),
                                    ,
                 HTTP-                          ,                               .
                        ,                   ,                 __call().

                  ,                                                   .
                                                          .

         ,                                                                      .

             :

      1. class My_Controller_PreDispatchPlugin extends
          Zend_Controller_Plugin_Abstract
      2. {
      3.      public function preDispatch(Zend_Controller_Request_Abstract $request)
      4.      {
      5.          $front       = Zend_Controller_Front::getInstance();
      6.          $dispatcher = $front->getDispatcher();
      7.          $class       = $dispatcher->getControllerClass($request);
      8.          if (!$controller) {
      9.              $class = $dispatcher->getDefaultControllerClass($request);
      10.                }
      11.
      12.                $r      = new ReflectionClass($class);
      13.                $action = $dispatcher->getActionMethod($request);
      14.
      15.                if (!$r->hasMethod($action)) {
      16.                    $defaultAction = $dispatcher->getDefaultAction();
      17.                    $controllerName = $request->getControllerName();
      18.                    $response       = $front->getResponse();
      19.                    $response->setRedirect('/' . $controllerName
      20.                                          . '/' . $defaultAction);
      21.                    $response->sendHeaders();
      22.                    exit;
      23.                }
      24.           }
      25.       }

                      ,                                        .          ,

         .
                                                                                            Zend_Db   168



Zend_Db
Zend_Db_Adapter
Zend_Db                                                                               SQL Zend
Framework. Zend_Db_Adapter                                ,
                       PHP              .
                   .

           Zend_Db                                                            PHP
                        ,                                                       PHP
                                                                      .

                                                              » PHP Data Objects (PDO). Zend_Db
                                            PDO                                       :

   •    IBM DB2 Informix Dynamic Server (IDS),                                 » pdo_ibm
   •    MySQL,                              » pdo_mysql
   •    Microsoft SQL Server,                            » pdo_mssql
   •    Oracle,                           » pdo_oci
   •    PostgreSQL,                             » pdo_pgsql
   •    SQLite,                            » pdo_sqlite

                , Zend_Db                             ,                            PHP
                                    :

   •    MySQL,                                » mysqli
   •    Oracle,                             » oci8
   •    IBM DB2,                                » ibm_db2
   •    Firebird/Interbase,                            » php_interbase

Note:                 Zend_Db                     PHP.
                                           PHP                                Zend_Db.            ,
                        -               PDO Zend_Db,                                       PDO,
         PDO                               .

Соединение с БД с использованием адаптера

                            ,                                 .
                                        PHP.

Использование конструктора адаптера Zend_Db

                                                                          .
                                ,                                 ,
            .
                                                                                             Zend_Db         169

Example #1

  1. $db = new Zend_Db_Adapter_Pdo_Mysql(array(
  2.     'host'     => '127.0.0.1',
  3.     'username' => 'webuser',
  4.     'password' => 'xxxxxxxx',
  5.     'dbname'   => 'test'
  6. ));

Использование фабрики Zend_Db

                                                                                                         ,
                               Zend_Db::factory().
       ,               Zend_Loader::loadClass().

                                                                       .          ,        'Pdo_Mysql'
                        Zend_Db_Adapter_Pdo_Mysql.
           ,                                                               .

Example #2                            -

  1. // Нам не нужно использовать следующее предложение, поскольку
  2. // файл Zend_Db_Adapter_Pdo_Mysql будет загружен через
  3. // метод-фабрику Zend_Db
  4.
  5. // require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
  6.
  7. // Автоматически загружает класс Zend_Db_Adapter_Pdo_Mysql
  8. // и создает его экземпляр.
  9. $db = Zend_Db::factory('Pdo_Mysql', array(
  10.          'host'     => '127.0.0.1',
  11.          'username' => 'webuser',
  12.          'password' => 'xxxxxxxx',
  13.          'dbname'   => 'test'
  14.      ));

                                    ,                Zend_Db_Adapter_Abstract,                    ,
                             "Zend_Db_Adapter",                                factory()
               ,                                                                 'adapterNamespace'
                   .

Example #3                            -

  1. // Нам не нужно загружать файл с классом адаптера,
  2. // поскольку он будет загружен через метод-фабрику Zend_Db
  3.
  4. // Автоматически загружает класс MyProject_Db_Adapter_Pdo_Mysql
  5. // и создает его экземпляр.
  6. $db = Zend_Db::factory('Pdo_Mysql', array(
  7.     'host'             => '127.0.0.1',
  8.     'username'         => 'webuser',
  9.     'password'         => 'xxxxxxxx',
  10.          'dbname'           => 'test',
  11.          'adapterNamespace' => 'MyProject_Db_Adapter'
  12.      ));
                                                                                                                 Zend_Db     170

Использование Zend_Config с фабрикой Zend_Db

                                                                    factory()                     Zend_Config.

                                                                ,                     ,
adapter,                                                                          .
                              params      "                    ",                                                    .

Example #4                            -                                               Zend_Config

                        Zend_Config                    .
                   Zend_Config_Ini        Zend_Config_Xml.

   1. $config = new Zend_Config(
   2.     array(
   3.          'database' => array(
   4.              'adapter' => 'Mysqli',
   5.              'params' => array(
   6.                  'dbname' => 'test',
   7.                  'username' => 'webuser',
   8.                  'password' => 'secret',
   9.              )
   10.               )
   11.           )
   12.      );
   13.
   14.      $db = Zend_Db::factory($config->database);

                          factory()                                                       ,                          ,
                                              .                                                     .
                                   Zend_Config,                               ,
           ,                                .

Параметры адаптера

                                              ,                                                         Zend_Db.

   •   host:       ,                                  IP               .
             ,                    PHP,                                       'localhost'      '127.0.0.1'.
   •   username:                                                                                                         .
   •   password:                                                                                             .
   •   dbname:                                             .
   •   port:
                              .                                                               ,
       PHP                                        ,                                           ,
               .
   •   options:                                                                       ,
       Zend_Db_Adapter.
   •   driver_options:                                                                                           ,
                                                      .
                                                                           PDO.
                                                                                                 Zend_Db            171

   •   adapterNamespace:                                                              'Zend_Db_Adapter'.
                      ,                                   factory()                  " Zend'       "
                  .

Example #5                                                    (case-folding)

                                                              Zend_Db::CASE_FOLDING.
         ATTR_CASE                   PDO   IBM DB2,
                    .                                 Zend_Db::CASE_NATURAL    (                           ),
Zend_Db::CASE_UPPER         Zend_Db::CASE_LOWER.

   1. $options = array(
   2.     Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER
   3. );
   4.
   5. $params = array(
   6.     'host'           => '127.0.0.1',
   7.     'username'       => 'webuser',
   8.     'password'       => 'xxxxxxxx',
   9.     'dbname'         => 'test',
   10.          'options'        => $options
   11.      );
   12.
   13.      $db = Zend_Db::factory('Db2', $params);

Example #6

                                                   Zend_Db::AUTO_QUOTE_IDENTIFIERS.
                 TRUE   (             ),                  ,       ,                  ,
             ,                                                                           SQL.
                                               ,                               SQL                              .
                            FALSE,                                                           .
                                           ,
       quoteIdentifier().

   1. $options = array(
   2.     Zend_Db::AUTO_QUOTE_IDENTIFIERS => false
   3. );
   4.
   5. $params = array(
   6.     'host'           => '127.0.0.1',
   7.     'username'       => 'webuser',
   8.     'password'       => 'xxxxxxxx',
   9.     'dbname'         => 'test',
   10.          'options'        => $options
   11.      );
   12.
   13.      $db = Zend_Db::factory('Pdo_Mysql', $params);

Example #7                                          PDO

   1. $pdoParams = array(
   2.     PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
   3. );
   4.
                                                                                                    Zend_Db       172

  5. $params = array(
  6.     'host'            => '127.0.0.1',
  7.     'username'        => 'webuser',
  8.     'password'        => 'xxxxxxxx',
  9.     'dbname'          => 'test',
  10.          'driver_options' => $pdoParams
  11.      );
  12.
  13.      $db = Zend_Db::factory('Pdo_Mysql', $params);
  14.
  15.      echo $db->getConnection()
  16.               ->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);

Управление отложенными соединениями

                                                                                                       .
                                                                        ,
              .             ,
                  .                                                             ,                      ,
                                                    -                       .

                                                        ,                           getConnection().
                                                                                              PHP                 .
          ,                                 -                               PDO,        getConnection()
                          PDO           ,                                     "           "
                      .

                                                                ,
              ,                         -
                      .                                     ,                                   ,
                                ,                                                   ,
  ,                                             .

Example #8

  1.   try {
  2.       $db = Zend_Db::factory('Pdo_Mysql', $parameters);
  3.       $db->getConnection();
  4.   } catch (Zend_Db_Adapter_Exception $e) {
  5.       // возможно, неправильные параметры соединения или СУРБД не запущена
  6.   } catch (Zend_Exception $e) {
  7.       // возможно, попытка загрузки требуемого класса адаптера потерпела неудачу
  8.   }

Пример базы данных

                                Zend_Db                                                   ,
                                                        .
                                                                    .                                         :

  •    accounts (                   )
              .
                                                                                            Zend_Db   173

   •   products (       )                                               ,
                             .
   •   bugs (       )                                    ,                          ,          ,
                                 ,    ,                                     ,
                                     .
   •   bugs_products                                         .                  "            - -
              ",                                                            ,
                                          .

                                                  SQL                                   .
                            unit-             Zend_Db.

   1. CREATE TABLE accounts (
   2.    account_name       VARCHAR(100) NOT NULL PRIMARY KEY
   3. );
   4.
   5. CREATE TABLE products (
   6.    product_id         INTEGER NOT NULL PRIMARY KEY,
   7.    product_name       VARCHAR(100)
   8. );
   9.
   10.       CREATE TABLE bugs (
   11.          bug_id            INTEGER NOT NULL PRIMARY KEY,
   12.          bug_description   VARCHAR(100),
   13.          bug_status        VARCHAR(20),
   14.          reported_by       VARCHAR(100) REFERENCES accounts(account_name),
   15.          assigned_to       VARCHAR(100) REFERENCES accounts(account_name),
   16.          verified_by       VARCHAR(100) REFERENCES accounts(account_name)
   17.       );
   18.
   19.       CREATE TABLE bugs_products (
   20.          bug_id            INTEGER NOT NULL REFERENCES bugs,
   21.          product_id        INTEGER NOT NULL REFERENCES products,
   22.          PRIMARY KEY       (bug_id, product_id)
   23.       );

                        ,                 bugs                          ,
       accounts.
accounts.

                                                                        .
                                                                                                Zend_Db       174
    .   ,        .    ,   .        ,      .




Чтение результатов запроса

                                                            ,
SELECT                                        .

Извлечение полного набора результатов

                                       SELECT                                  ,                fetchAll().

                                                                 ,                 SELECT.
                                                    Zend_Db_Select.
                                                  SELECT.

                              fetchAll()
(placeholders)                    SQL.

Example #9                             fetchAll()

   1. $sql = 'SELECT * FROM bugs WHERE bug_id = ?';
   2.
   3. $result = $db->fetchAll($sql, 2);

Изменение режима извлечения

                     fetchAll()                                 ,
            .                                                                                       ,
                                                        .

                                                                      ,       setFetchMode().
                                                                          :
                                                                                                               Zend_Db            175

  •    Zend_Db::FETCH_ASSOC:                                                                               .
                                                              .                                    ,
                                      Zend_Db_Adapter.

                                  ,                                                                                   ,
                  ,                                     JOIN- ,
                                            .                                 FETCH_ASSOC,
                                                        SELECT            ,
                              .

                                                                  ,                                                           .
                          ,                                                                .
                      ,                     . Zend_Db::CASE_FOLDING.
              .           .                                                   (case-folding).

  •    Zend_Db::FETCH_NUM:                                                             .
                                                                                                                          .
  •    Zend_Db::FETCH_BOTH:                                                                .
             ,                        .                                                                                   ,
                               FETCH_ASSOC                            FETCH_NUM.
  •    Zend_Db::FETCH_COLUMN:                                                                  .
                       ,                                                                               .
                    ,                   .
  •    Zend_Db::FETCH_OBJ:                                                         .
                   PHP     stdClass.
                         .

Example #10                            setFetchMode()

  1.   $db->setFetchMode(Zend_Db::FETCH_OBJ);
  2.
  3.   $result = $db->fetchAll('SELECT * FROM bugs WHERE bug_id = ?', 2);
  4.
  5.   // $result является массивом объектов
  6.   echo $result[0]->bug_description;

Извлечение результатов выборки в виде ассоциативного массива

       fetchAssoc()                                                                                               ,
                                                         .

Example #11                            fetchAssoc()

  1.   $db->setFetchMode(Zend_Db::FETCH_OBJ);
  2.
  3.   $result = $db->fetchAssoc('SELECT * FROM bugs WHERE bug_id = ?', 2);
  4.
  5.   // $result является массивом ассоциативных массивов, независимо
  6.   // от установленного режима извлечения
  7.   echo $result[0]['bug_description'];
                                                                                          Zend_Db         176

Извлечение единственного столбца из результатов выборки

       fetchCol()                                                             ,
                                      .                                                               .
                        ,                           ,             .                           ,
                    ,        .                                            .

Example #12                      fetchCol()

  1. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  2.
  3. $result = $db->fetchCol(
  4.     'SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2);
  5.
  6. // содержит bug_description; bug_id не возвращается
  7. echo $result[0];

Извлечение пар ключ-значение из результатов выборки

       fetchPairs()                                           -       ,
                             ,                          SELECT.                               ,
                            SELECT.                         ,                     ,               .

                             SELECT        ,
        .                                                ,
                .

Example #13                      fetchPairs()

  1. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  2.
  3. $result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs');
  4.
  5. echo $result[2];

Извлечение единственной строки из результатов выборки

       fetchRow()                                                                     ,
                                                .

Example #14                      fetchRow()

  1.   $db->setFetchMode(Zend_Db::FETCH_OBJ);
  2.
  3.   $result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2');
  4.
  5.   // обратите внимание, что $result - единственный объект, а не массив объектов
  6.   echo $result->bug_description;
                                                                                                                                       Zend_Db           177

Извлечение единственного скалярного значения из результатов выборки

      fetchOne()                                                              fetchRow()       fetchCol()       -
                                                                                           .            ,
                       ,                            .

Example #15                        fetchOne()

  1. $result = $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
  2.
  3. // это единственное строковое значение
  4. echo $result;

Изменение данных в БД


                   .                                                                                                           .

Добавление данных

                                                                                           ,                    insert().
                                                                               ,                            -
                                                                                       .

Example #16

  1. $data = array(
  2.     'created_on'      => '2007-03-22',
  3.     'bug_description' => 'Something wrong',
  4.     'bug_status'      => 'NEW'
  5. );
  6.
  7. $db->insert('bugs', $data);

         ,                                                                ,                                         .                        ,
                           ,         SQL-                   INSERT:                                                       DEFAULT,
                                                    ,                                          NULL.

                                                                                                                                   .
                                                .
               ,                                                      .

                               ,                                                                                        SQL-                     ,
                                                              .                                     ,                                                ,
                                        .               ,                          ,                                           SQL-
              (      ,                                                    ),
              Zend_Db_Expr                                     .

Example #17

  1. $data = array(
  2.     'created_on'                => new Zend_Db_Expr('CURDATE()'),
                                                                                                        Zend_Db   178

   3.     'bug_description' => 'Something wrong',
   4.     'bug_status'      => 'NEW'
   5. );
   6.
   7. $db->insert('bugs', $data);

Получение сгенерированного значения

                                                                  .          ,
        ,                                                                                                   .
                           insert()                                                                        ,
                                                      .
                                 (            1).

                                                                      ,
lastInsertId()                        .                                       ,
                                          .

Example #18                     lastInsertId()

   1. $db->insert('bugs', $data);
   2.
   3. // возвращает последнее значение, сгенерированное автоинкрементным столбцом
   4. $id = $db->lastInsertId();

                                                              (sequence object),
                                                                              .
                         lastInsertId()                                                     .
                                                      ,                             ,
              ,                                                                         ,
                                               ,    "_seq".
            PostgreSQL                                                    SERIAL.                   ,
"bugs"                         "bug_id"
"bugs_bug_id_seq".

Example #19                     lastInsertId()

   1.   $db->insert('bugs', $data);
   2.
   3.   // возвращает последнее значение, сгенерированное
   4.   // последовательностью 'bugs_bug_id_seq'
   5.   $id = $db->lastInsertId('bugs', 'bug_id');
   6.
   7.   // альтернативно, возвращает последнее значение, сгенерированное
   8.   // последовательностью 'bugs_seq'.
   9.   $id = $db->lastInsertId('bugs');

                                                                                                ,
                     lastSequenceId().                                                  ,


Example #20                     lastSequenceId()
                                                                                                                                                              Zend_Db             179

      1.   $db->insert('bugs', $data);
      2.
      3.   // возвращает последнее значение, сгенерированное
      4.   // последовательностью 'bugs_id_gen'.
      5.   $id = $db->lastSequenceId('bugs_id_gen');

                       ,                                                                                  ,                           MySQL, Microsoft SQL Server
SQLite,                                 lastInsertId()                                    ,                                                               ,
                                                                                         INSERT                                                       .
                                   lastSequenceId()                                                   NULL.

Note:                                            "SELECT MAX(id) FROM table"?
                                                                                                                          ,                                   .
                                                          ,                                                                                                       .
              (                                                                      )       ,
                                                                                                 ,                                                                    -
  ,                                                                      MAX(id).                                                 ,
                                                                         ,                                                                                            ,
                                             .                                  ,                                              .
                                                                              ,                       ,           "repeatable read",
      ,                                                                                                                                                   ,
                                                                                                                              .
                                                                  "MAX(id)+1"
                           ,                                                                                                                  ,
                                                                                                                          INSERT.

                                         .                                                                                                                ,
                           ,                                                                                              ,                           ,
                           ,                                                                                                                                                  .

Обновление данных

                                                                     ,                               update()                                 .
                   :                                                             ,               -                                                                ,
                               ,                 ,                                                                                        .

                                                                                                                                  .
                  SQL                                         .                                                       .

                                                      ,                                              SQL,                                                                     ,
                                                                                         .
                                                                     .                                            ,
                                                                             .                                                        ,                                   ,
  .                                                                                                           .

                                                                         ,                                                                        .

Example #21

      1. $data = array(
      2.     'updated_on'                            => '2007-03-23',
                                                                                                 Zend_Db         180

  3.     'bug_status'      => 'FIXED'
  4. );
  5.
  6. $n = $db->update('bugs', $data, 'bug_id = 2');

                             ,                                                                    ,
                         .

                                                                 ,
              ,                           AND.

Example #22

  1. $data = array(
  2.     'updated_on'      => '2007-03-23',
  3.     'bug_status'      => 'FIXED'
  4. );
  5.
  6. $where[] = "reported_by = 'goofy'";
  7. $where[] = "bug_status = 'OPEN'";
  8.
  9. $n = $db->update('bugs', $data, $where);
  10.
  11.      // Результирующий SQL:
  12.      // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
  13.      // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')

Удаление данных

                                     ,               delete().
          ,                                              .

                             ,                       SQL,
      ,                                          .
                                      .                              ,
                                     .                                   ,                            ,    .
                                                     .

                                           ,                                             .

Example #23

  1. $n = $db->delete('bugs', 'bug_id = 3');

                             ,                                                               .

                                                             ,
              ,                           AND.

Заключение в кавычки значений и идентификаторов

                     SQL                                                           PHP                    SQL.
                                 ,                                           PHP
                                                                                                                                               Zend_Db       181

         ,                   ,                                           ,                                                                 SQL.
             ,                                                                                                         :

   1.   $name = "O'Reilly";
   2.   $sql = "SELECT * FROM bugs WHERE reported_by = '$name'";
   3.
   4.   echo $sql;
   5.   // SELECT * FROM bugs WHERE reported_by = 'O'Reilly'

                                             ,                                                                                                    ,
                                                                             -                     .
PHP,                                              HTTP                                         ,                           SQL-
         ,                                                                       -                 ,               ,
                 .                                                                                                                         ,
                             "SQL-                      "(   . » http://ru.wikipedia.org/wiki/                  _SQL).

                              Zend_Db                                                                     ,
                             SQL-                       .                                      ,                                                  ,      ,
                                                 PHP,                    ,                                                 SQL.
                         ,                                                                                SQL                         PHP,
                                                             .

Использование quote()

        quote()                                                                            -                                .
                                                                     ,
                     ,                                                                                    .
                                         SQL                                                       (').

Example #24                                             quote()

   1.   $name = $db->quote("O'Reilly");
   2.   echo $name;
   3.   // 'O\'Reilly'
   4.
   5.   $sql = "SELECT * FROM bugs WHERE reported_by = $name";
   6.
   7.   echo $sql;
   8.   // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'

                                     ,                                                   quote()                                                         .
                                                                         ,                                                             ,
                                     ,                  , » mysql_real_escape_string().

                                                                                                                                  ,
                     SQL                                         .                   ,
                                         ,                                                                                                        .
                                 ,                                                                                              SQL,
intColumn                                                                        INTEGER.

   1. SELECT * FROM atable WHERE intColumn = '123'
                                                                                                                Zend_Db           182

                                                                                 quote()
                          SQL,                               .

Example #25                  quote()                                 SQL

   1. $value = '1234';
   2. $sql = 'SELECT * FROM atable WHERE intColumn = '
   3.      . $db->quote($value, 'INTEGER');

              Zend_Db_Adapter                                                               SQL
       .                                                   Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE
Zend_Db::FLOAT_TYPE                                                                                               .

Zend_Db_Table                                        SQL                    quote()                      SQL-             ,
                                             .

Использование quoteInto()


           PHP                               SQL.                                                 quoteInto()                 ,
                                .                                                       :
       ,                                             (?),                           -                                 PHP,
                                                                             .

                                                                                                     ,
quoteInto()                                            .                                                              ,
                                                                      .
                                       SQL                             ,
                 .

Example #26                  quoteInto()

   1. $sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");
   2.
   3. echo $sql;
   4. // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'

                                                                             quoteInto()
SQL.                                                             ,                            .

Example #27                  quoteInto()                                   SQL

   1. $sql = $db->quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');
   2.
   3. echo $sql;
   4. // SELECT * FROM bugs WHERE reported_by = 1234

Использование quoteIdentifier()

                                                                 SQL,                                    .
                       PHP                       ,
                                                                                                                                                            Zend_Db           183

SQL,                                                                                       .                                                           SQL
                             ,                           PHP                                                           .                           ,
                                         ,                                                             ,
                                 .                                               SQL                                                           ,
                                                                             .

                , SQL                                            ,                                                                                               (delimited
identifiers),                                                                                              .
SQL                                          ,                                                                             ,
                                     .                                                                                                                  ,
                                                                     .                                                                                            SQL,
                                                                                       .

quoteIdentifier()                                        ,               quote(),
                                                                                                                   .                       ,                      SQL
                              (")
                        . MySQL                                                                                            (`).
quoteIdentifier()                                                                                                                          .

Example #28                              quoteIdentifier()

    1.   // мы можем иметь имя таблицы,
    2.   // которое является зарезервированным в SQL словом
    3.   $tableName = $db->quoteIdentifier("order");
    4.
    5.   $sql = "SELECT * FROM $tableName";
    6.
    7.   echo $sql
    8.   // SELECT * FROM "order"

                                                             SQL                                                                       ,
                             .                   ,                                                                                                      ,
                                                                                                   ,                       ,                                        .

                         ,               SQL                                                       Zend_Db,
                                                                             .
Zend_Db::AUTO_QUOTE_IDENTIFIERS.                                                                                                                        .    .
                                                                                               .

Управление транзакциями

                                                                                                               ,
                                                 ,                                                                                 .
                                                             ,                                                                                                          .
                                                                                       ,
                         SQL-                                    .                                                         Zend_Db
                                                     .

                                                                                           ,                                                                 SQL-
                   ,                                                     (                         )                           .
                                                                                                               Zend_Db     184

beginTransaction()                                      .               SQL-
                                      ,                                               .

                                                  commit()          rollBack().               commit()
          ,                                                     ,                     ,                    ,
                                                   ,                                                   .

      rollBack()                  -                                 ,                                                  .
                                          ,                                       ,                                        ,
                          .                   ,                                                    ,
                      ,                                     .

          ,                           , Zend_Db_Adapter
      ,                   beginTransaction()      .

Example #29

   1. // Старт транзакции явным образом
   2. $db->beginTransaction();
   3.
   4. try {
   5.      // Попытка произвести один или несколько запросов
   6.      $db->query(...);
   7.      $db->query(...);
   8.      $db->query(...);
   9.
   10.           // Если все запросы были произведены успешно, то транзакция фиксируется,
   11.           // и все изменения фиксируются одновременно
   12.           $db->commit();
   13.
   14.       } catch (Exception $e) {
   15.           // Если какой-либо из этих запросов прошел неудачно, то вся транзакция
   16.           // откатывается, при этом все изменения отменяются, даже те, которые были
   17.           // произведены успешно.
   18.           // Таким образом, все изменения либо фиксируются, либо не фиксируется
       вместе.
   19.           $db->rollBack();
   20.           echo $e->getMessage();
   21.       }

Листинг и описание таблиц

      listTables()                                                                        .

      describeTable()                                                                     .
                                                    .                                                          ,
                  ,                                     .

                                                                                               .                   ,
                              ,
              :

                                              ,                         describeTable()
                                                                                                                              Zend_Db           185



SCHEMA_NAME      (string)                               ,                                                    .
TABLE_NAME       (string)                           ,                                                            .
COLUMN_NAME      (string)
COLUMN_POSITION  (integer)                                                                   .
DATA_TYPE        (string)                                                   ,
DEFAULT          (string)                                               ,              .
NULLABLE         (boolean) TRUE,                                                                 NULL,               FALSE.
LENGTH           (integer)                                                       ,                        .
SCALE            (integer)                                                      NUMERIC              DECIMAL.
PRECISION        (integer)                                                      NUMERIC              DECIMAL.
                           TRUE,                                                                       UNSIGNED (
UNSIGNED         (boolean)
                               ).
PRIMARY          (boolean) TRUE,                                                                                                    .
PRIMARY_POSITION (integer)                                  (                          1)                                                   .
                           TRUE,
IDENTITY         (boolean)
                                                .

              ,                                                                                     (                ),                 ,
  describeTable()                                       .

Note:                            IDENTITY
                  IDENTITY                                          "                            "
                                  .                                                                              :

   •    IDENTITY - DB2, MSSQL
   •    AUTO_INCREMENT - MySQL
   •    SERIAL - PostgreSQL
   •    SEQUENCE - Oracle

Закрытие соединения

                                      ,                                                     . PHP
                         .                    PHP                                                                         ,
                     ,                                                             .

              ,                           PHP                                                           ,
                             ,                                                                          ,
                                          .                                                                 closeConnection()
                                                                .

Example #30

   1. $db->closeConnection();
                                                                                                                                                      Zend_Db              186

Note:                                    Zend_Db                                                 ?
                                                                                                                           Zend_Db.

                              ,                                           ,                                                              ,
                                                                                                      .
                                                              , . .
                                  .                                                   ,                                     ,
                                                                              ,            ,
                                           .                                                                      ,
                                                                                       ,                              PHP-                       .

Запуск других операторов БД

                                                                                                                       ,
                                                       PHP                         .
                  ,                                                                    Zend_Db_Adapter_Abstract.

          ,                                SQL,                                    Zend_Db,                                                                        .
                                                                                                                                         .
DDL,          ,                   CREATE       ALTER,                                                MySQL.                                          SQL
                          »                                   MySQL                            MySQL  5.1.17.

                                            PHP                                                                                                            SQL
                          .                , PDO                                         exec().
                                                         PHP,                      getConnection().

Example #31                                                                                           PDO

   1. $result = $db->getConnection()->exec('DROP TABLE bugs');

                                                                                                          ,
                  .                        ,                          ,           ,               ,
                      ,                                                                                           .

                                      Zend_Db                                                                                                              ,
                                                                                   PHP.                                                                        .

Примечания к отдельным адаптерам

                                                                                                          ,                                          .

IBM DB2

   •                                                                              factory()                           'Db2'.
   •                                                   PHP-                       ibm_db2.
   •    IBM DB2                                                                         ,                                          .
                                       lastInsertId()                                                 .                                                                ,
                                                                ,                                                                            .
                                                   ,                                                      ,
                                               ,                                                              '        _        _seq'.
                                                                                                            Zend_Db         187

MySQLi

   •                                                    factory()                       'Mysqli'.
   •                               PHP-                 mysqli.
   •     MySQL                                             ,            lastInsertId()
                                                                    ,
                  .       lastSequenceId()                 NULL.

Oracle

   •                                                    factory()                       'Oracle'.
   •                               PHP-                 oci8.
   •     Oracle                                                 ,
                                  lastInsertId()            lastSequenceId().
   •                  Oracle                                                .
                                  .
   •                                  Zend_Db::CASE_FOLDING                                         Oracle.             ,
                                          Oracle,                                       PDO OCI.

PDO для IBM DB2 и Informix Dynamic Server (IDS)

   •                                                    factory()                       'Pdo_Ibm'.
   •                               PHP-                 pdo pdo_ibm.
   •                                                 PDO_IBM                        1.2.2.
                                                 ,                                      PDO_IBM          PECL.

PDO Microsoft SQL Server

   •                                                    factory()                       'Pdo_Mssql'.
   •                               PHP-                 pdo pdo_mssql.
   •     Microsoft SQL Server                                        ,                lastInsertId()
                                                                                ,
                               .                 lastSequenceId()           NULL.
   •     Zend_Db_Adapter_Pdo_Mssql                        QUOTED_IDENTIFIER ON
                             .                                                                       -
                         (")                                    ,        SQL Server
                                             .
   •                            pdoType                                    .
              "mssql" (                 ), "dblib", "freetds""sybase".                                           DSN,
                                             ,                      DSN. "Freetds" "sybase"
                  "sybase:",                                              » FreeTDS.
                                   ,                                 ,            »
         http://www.php.net/manual/en/ref.pdo-dblib.connection.php.

PDO MySQL

   •                                                    factory()                       'Pdo_Mysql'.
   •                               PHP-                 pdo pdo_mysql.
                                                                                                                     Zend_Db     188

   •   MySQL                                                    ,             lastInsertId()
                                                                        ,
                .       lastSequenceId()                       NULL.

PDO Oracle

   •                                                         factory()                        'Pdo_Oci'.
   •                                  PHP-                   pdo pdo_oci.
   •   Oracle                                                        ,
                                      lastInsertId()            lastSequenceId().

PDO PostgreSQL

   •                                                         factory()                        'Pdo_Pgsql'.
   •                                  PHP-                   pdo pdo_pgsql.
   •   PostgreSQL                                                     ,                                      .
                        lastInsertId()                                   .                                               ,
                                                   ,                                                             .
                                  ,                                                   ,
                              ,                                                           '    _    _seq'.

PDO SQLite

   •                                                         factory()                   'Pdo_Sqlite'.
   •                                  PHP-                   pdo pdo_sqlite.
   •   SQLite                                                   ,         lastInsertId()
                                                                        ,
                .       lastSequenceId()                          NULL.
   •                ,                                          SQLite2,            'sqlite2'=>true
                                                                   Pdo_Sqlite.
   •                                             SQLite                           'dbname'=>':memory:'
                                                                    Pdo_Sqlite.
   •                                  SQLite           PHP                                      PRAGMA,
                                                                                             .
          ,                                                                 "tablename.columnname",
                                             ,                              PHP                  .

Firebird/Interbase

   •                                  PHP-                   php_interbase.
   •   Firebird/interbase                                                         ,
                                      lastInsertId()    lastSequenceId().
   •                                   Zend_Db::CASE_FOLDING                                               Firebird/interbase.
                                                                                                                         ..
                                                                                                                     Zend_Db             189


Zend_Db_Statement
                                ,        ,     fetchAll()                       insert(),
Zend_Db_Adapter,                                                                          ,                              O
                                                                                            .                        ,
                                                                                            .

Zend_Db_Statement                       PDOStatement                                      » PDO.

Создание оператора

                                                       query()                                       .
                                                               SQL.                                                  ,
                    SQL.                                                        -
                        SQL.

Example #1                                   SQL                                query()

   1. $stmt = $db->query(
   2.             'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
   3.             array('goofy', 'FIXED')
   4.         );

                                             SQL,
                     .                                         SELECT                                                        ,
                            ,                                                                   .

                                                                        ,                                                                .
                    -                                                       ,
                                    .
      ,                     SQL                                 .                                          ,                             .

Example #2 Using a SQL statement constructor

   1. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
   2.
   3. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);

Выполнение оператора

                                                   ,
                                                                    .                               execute()                        .
                                                                                                                                 .

                                               -       ,                                                        (?), -
                                                           .

Example #3

   1. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
                                                                                                                 Zend_Db     190

   2.
   3. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
   4.
   5. $stmt->execute(array('goofy', 'FIXED'));

                                                      -       ,
             (:)     ,-                                                                              .
                                                                   .

Example #4

   1. $sql = 'SELECT * FROM bugs WHERE ' .
   2.        'reported_by = :reporter AND bug_status = :status';
   3.
   4. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
   5.
   6. $stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));

          PDO                                             ,                                                      ,
                          SQL.                                Zend_Db_Statement            -PDO
                                              .

Извлечение результатов выполнения оператора SELECT

                                                                   SQL-        ,
                                    . SELECT, SHOW, DESCRIBE EXPLAIN
          ,                                          , INSERT, UPDATE DELETE -
          ,                                             .                                                                ,
          Zend_Db_Statement,
            .

Извлечение одной строки из набора результатов

                                                                                       fetch()                       .
                                                                       :

   •                        -                     .                                                          ,
                                .
                                                      .
   •                    -                         .
       Zend_Db::FETCH_ORI_NEXT,                                                ,                         fetch()
                                                                           ,                             ,
                                          .
   •             -             .                                                - Zend_Db::FETCH_ORI_ABS,
                -                                                              .                      -
       Zend_Db::FETCH_ORI_REL,
                             ,                                    fetch().

fetch()            FALSE,                                                                        .

Example #5                      fetch()
                                                                                                 Zend_Db   191

   1. $stmt = $db->query('SELECT * FROM bugs');
   2.
   3. while ($row = $stmt->fetch()) {
   4.     echo $row['bug_description'];
   5. }

  .        » PDOStatement::fetch().

Извлечение всего набора результатов

                                                                                        fetchAll().
                                             fetch()                                             .
fetchAll()                               .                 -                ,                ,
                                                       ,
Zend_Db::FETCH_COLUMN.

Example #6                   fetchAll()

   1. $stmt = $db->query('SELECT * FROM bugs');
   2.
   3. $rows = $stmt->fetchAll();
   4.
   5. echo $rows[0]['bug_description'];

  .        » PDOStatement::fetchAll().

Изменение формата извлечения


                     .                                                                  ,        ,
                    .                                          setFetchMode()
                    .                                        ,                        FETCH_ASSOC,
FETCH_NUM, FETCH_BOTH, FETCH_COLUMN                    FETCH_OBJ           Zend_Db.
                                                                       .
fetch()    fetchAll()                                                                                .

Example #7

   1.   $stmt = $db->query('SELECT * FROM bugs');
   2.
   3.   $stmt->setFetchMode(Zend_Db::FETCH_NUM);
   4.
   5.   $rows = $stmt->fetchAll();
   6.
   7.   echo $rows[0][0];

  .        » PDOStatement::setFetchMode().
                                                                                               Zend_Db     192

Извлечение одного столбца из набора результатов

                                                                                          fetchColumn().
                         -                                 ,                0.
                         FALSE,

                 ,                                    ,        fetchCol()                  .
fetchColumn()                                                               .        fetchCol()
                             ,                                                        .

Example #8                   fetchColumn()

   1. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
   2.
   3. $bug_status = $stmt->fetchColumn(2);

  .      » PDOStatement::fetchColumn().

Извлечение строки в виде объекта

                                                                                 fetchObject().
                                                 .
                     ,                       'stdClass'.                                           ,
                                                      .

Example #9                   fetchObject()

   1. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
   2.
   3. $obj = $stmt->fetchObject();
   4.
   5. echo $obj->bug_description;

  .      » PDOStatement::fetchObject().
                                                                                              Zend_Db       193


Zend_Db_Profiler
Введение

Zend_Db_Profiler                                                 .
        ,                         ,            ,                                     .
                                                                                                .
                                                                    ,
                 .


            ,                                               .

   1. $params = array(
   2.     'host'     => '127.0.0.1',
   3.     'username' => 'webuser',
   4.     'password' => 'xxxxxxxx',
   5.     'dbname'   => 'test'
   6.     'profiler' => true // включение профилировщика;
   7.                          // для отключения устанавливайте в false
   8.                          // (значение по умолчанию)
   9. );
   10.
   11.      $db = Zend_Db::factory('PDO_MYSQL', $params);
   12.
   13.      // отключение профилировщика:
   14.      $db->getProfiler()->setEnabled(false);
   15.
   16.      // включение профилировщика:
   17.      $db->getProfiler()->setEnabled(true);

                     'profiler'        .                        -                                       .
                                                                            ,


                                                   ,                        TRUE,              ,
                     FALSE.                                                         Zend_Db_Profiler.

   1. $params['profiler'] = true;
   2. $db = Zend_Db::factory('PDO_MYSQL', $params);

                                                                        .
        Zend_Db_Profiler                   .

   1.   $profiler = MyProject_Db_Profiler();
   2.   $profiler->setEnabled(true);
   3.   $params['profiler'] = $profiler;
   4.   $db = Zend_Db::factory('PDO_MYSQL', $params);

                                           ,                    'enabled', 'instance' 'class'.
'enabled'       'instance'                              ,                   .      'class'
                                               ,                            .
                                                                                                                 Zend_Db             194

Zend_Db_Profiler                                 .                                                                               .
      'class'                    ,                            'instance'.

   1. $params['profiler'] = array(
   2.     'enabled' => true,
   3.     'class'   => 'MyProject_Db_Profiler'
   4. );
   5. $db = Zend_Db::factory('PDO_MYSQL', $params);

            ,                                            Zend_Config,                                       ,
        ,                    .               ,       "config.ini"                                                :

   1. [main]
   2. db.profiler.class   = "MyProject_Db_Profiler"
   3. db.profiler.enabled = true

                                                     ,                                      :

   1. $config = new Zend_Config_Ini('config.ini', 'main');
   2. $params['profiler'] = $config->db->profiler;
   3. $db = Zend_Db::factory('PDO_MYSQL', $params);

            'instance'                                                          :

   1.   $profiler = new MyProject_Db_Profiler();
   2.   $profiler->setEnabled(true);
   3.   $configData = array(
   4.       'instance' => $profiler
   5.       );
   6.   $config = new Zend_Config($configData);
   7.   $params['profiler'] = $config;
   8.   $db = Zend_Db::factory('PDO_MYSQL', $params);

Использование профилировщика

                                                                                                getProfiler()        :

   1. $profiler = $db->getProfiler();

                                     Zend_Db_Profiler.
        ,                                    :

   •    getTotalNumQueries()                                                            ,                                        .
   •    getTotalElapsedSecs()                                                       ,                                ,
                                                 .
   •    getQueryProfiles()                                                                  .
   •    getLastQueryProfile()                                               (                           )                ,
                                     ,                         (                                  ,
                 null).
   •    clear()                                                .

                   getLastQueryProfile()                                                    getQueryProfiles()
                Zend_Db_Profiler_Query,                                                                                      :
                                                                                                                            Zend_Db         195

   •   getQuery()                               SQL-                       . SQL-
                                                   ,                                        ,
                           ,                     ,                                                          .
   •   getQueryParams()                                                                     ,
                                                                   .                                                                    ,
                                                               execute().
       (                           1)                          (                    )                       .
   •   getElapsedSecs()                                                                                 .

                   ,                            Zend_Db_Profiler,                                   "                   "
                       .                ,                              ,                                            :

   1. $query = $profiler->getLastQueryProfile();
   2.
   3. echo $query->getQuery();

               ,                                           .                                                    ,
                                                                                ,                                           ,
           ,                                                   :

   1. $totalTime     = $profiler->getTotalElapsedSecs();
   2. $queryCount    = $profiler->getTotalNumQueries();
   3. $longestTime = 0;
   4. $longestQuery = null;
   5.
   6. foreach ($profiler->getQueryProfiles() as $query) {
   7.     if ($query->getElapsedSecs() > $longestTime) {
   8.         $longestTime = $query->getElapsedSecs();
   9.         $longestQuery = $query->getQuery();
   10.          }
   11.      }
   12.
   13.      echo 'Executed ' . $queryCount . ' queries in ' . $totalTime .
   14.            ' seconds' . "\n";
   15.      echo 'Average query length: ' . $totalTime / $queryCount .
   16.            ' seconds' . "\n";
   17.      echo 'Queries per second: ' . $queryCount / $totalTime . "\n";
   18.      echo 'Longest query length: ' . $longestTime . "\n";
   19.      echo "Longest query: \n" . $longestQuery . "\n";

Расширенное использование профилировщика

                                            ,                                                                       ,
                               .                                                            Zend_Db_Profiler:

Фильтрация по времени выполнения запроса

setFilterElapsedSecs()                                                                                                              ,
                                                                                        .       ,                               ,
                                        null.

   1. // Профилировать только те запросы, которые отнимают не менее 5 секунд:
   2. $profiler->setFilterElapsedSecs(5);
   3.
                                                                                                       Zend_Db                  196

   4. // Профилировать все запросы безотносительно времени выполнения:
   5. $profiler->setFilterElapsedSecs(null);

Фильтрация по типу запроса

setFilterQueryType()                                                  ,
                      ;                                                                          OR.
                                                  Zend_Db_Profiler:

   •    Zend_Db_Profiler::CONNECT:                                                                             .
   •    Zend_Db_Profiler::QUERY:                                  ,                                                             .
   •    Zend_Db_Profiler::INSERT:                       ,
              ,                 ,             INSERT.
   •    Zend_Db_Profiler::UPDATE:                       ,                                                  ,
                      UPDATE.
   •    Zend_Db_Profiler::DELETE:                       ,                                              ,
                  DELETE.
   •    Zend_Db_Profiler::SELECT:                       ,                                                               ,
                                SELECT.
   •    Zend_Db_Profiler::TRANSACTION:                                            ,   ,                                     ,
                                          .

              setFilterElapsedSecs(),                                         ,           NULL
                            .

   1. // профилирование только запросов SELECT
   2. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
   3.
   4. // профилирование запросов SELECT, INSERT и UPDATE
   5. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT |
   6.                               Zend_Db_Profiler::INSERT |
   7.                               Zend_Db_Profiler::UPDATE);
   8.
   9. // профилирование запросов DELETE
   10.      $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
   11.
   12.      // удалить все фильтры
   13.      $profiler->setFilterQueryType(null);

Получение профилей по типу запроса

                          setFilterQueryType()                                                                     .
         ,                                                    ,                                  ,
                  .                 getQueryProfiles()                                                 "               ",
                                (                                         )                                             ;
                                      .                           .

   1.   // Получение только профилей запросов SELECT
   2.   $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
   3.
   4.   // Получение только профилей запросов SELECT, INSERT и UPDATE
   5.   $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT |
   6.                                           Zend_Db_Profiler::INSERT |
                                                                                                Zend_Db        197

   7.                                         Zend_Db_Profiler::UPDATE);
   8.
   9. // Получение профилей запросов DELETE
   10.      $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);

Специализированные профилировщики

                                        -           ,                       Zend_Db_Profiler.

                 .

Profiling with Firebug

Zend_Db_Profiler_Firebug sends profiling infomation to the » Firebug » Console.

All data is sent via the Zend_Wildfire_Channel_HttpHeaders component which uses HTTP headers to ensure the
page content is not disturbed. Debugging AJAX requests that require clean JSON and XML responses is possible
with this approach.

Requirements:

   •   Firefox Browser ideally version 3 but version 2 is also supported.
   •   Firebug Firefox Extension which you can download from » https://addons.mozilla.org/en-
       US/firefox/addon/1843.
   •   FirePHP Firefox Extension which you can download from » https://addons.mozilla.org/en-
       US/firefox/addon/6149.

Example #1 DB Profiling with Zend_Controller_Front

   1. // In your bootstrap file
   2.
   3. $profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
   4. $profiler->setEnabled(true);
   5.
   6. // Attach the profiler to your db adapter
   7. $db->setProfiler($profiler);
   8.
   9. // Dispatch your front controller
   10.
   11.      // All DB queries in your model, view and controller
   12.      // files will now be profiled and sent to Firebug

Example #2 DB Profiling without Zend_Controller_Front

   1. $profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
   2. $profiler->setEnabled(true);
   3.
   4. // Attach the profiler to your db adapter
   5. $db->setProfiler($profiler);
   6.
   7. $request = new Zend_Controller_Request_Http();
   8. $response = new Zend_Controller_Response_Http();
   9. $channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
   10.      $channel->setRequest($request);
                                                          Zend_Db   198

11.   $channel->setResponse($response);
12.
13.   // Start output buffering
14.   ob_start();
15.
16.   // Now you can run your DB queries to be profiled
17.
18.   // Flush profiling data to browser
19.   $channel->flush();
20.   $response->sendHeaders();
                                                                                                                          Zend_Db              199


Zend_Db_Select
Обзор

        Zend_Db_Select                         SQL-                SELECT.
                               .                                                                        ,                     PHP
                      ,                                                          SQL.                           ,                   ,
                                   ,                                                            .

                          Zend_Db_Select              :

   •              -                                            "                 "                  SQL-              ;
   •                                                                                 SQL-           ;
   •
                                           ,                                                SQL                               ;
   •
        SQL-               .

                 Zend_Db_Select                            .                                                SELECT
        SQL-                                                             ,                                                ,
query()        fetchAll().                       Zend_Db_Select                        ,                                  SELECT
                                                     .

Создание объекта Select

                                                 Zend_Db_Select,                                    select()
Zend_Db_Adapter_Abstract.

Example #1                                                select()

   1. $db = Zend_Db::factory( ...опции... );
   2. $select = $db->select();

                                                      Zend_Db_Select                                        ,
                                       .

Example #2                                                     Select

   1. $db = Zend_Db::factory( ...опции... );
   2. $select = new Zend_Db_Select($db);

Построение запросов Select

                                                                                                    .                  -                SQL-
          ,                                                                  ;              ,                        WHERE.
                                               Zend_Db_Select.

Example #3

   1. // Создание объекта Zend_Db_Select
                                                                                                              Zend_Db          200

   2. $select = $db->select();
   3.
   4. // Добавление предложения FROM
   5. $select->from( ...определение таблицы и столбцов... )
   6.
   7. // Добавление предложения WHERE
   8. $select->where( ...определение критериев поиска... )
   9.
   10.      // Добавление предложения ORDER BY
   11.      $select->order( ...определение критериев сортировки... );

                                                                       Zend_Db_Select                             fluent
interface. Fluent interface             ,                                                         ,
        ,                                                                            .

Example #4                                  fluent interface

   1. $select = $db->select()
   2.     ->from( ...определение таблицы и столбцов... )
   3.     ->where( ...определение критериев поиска... )
   4.     ->order( ...определение критериев сортировки... );

                                               fluent interface,
                       .                                                                      -               ,
                                                                                 .

Добавление предложения FROM

                                    ,                     from().
                 , Zend_Db_Select                                  ,                                  ,
                                                  .

Example #5                                            from()

   1.   // Строит запрос:
   2.   //   SELECT *
   3.   //   FROM "products"
   4.
   5.   $select = $db->select()
   6.                ->from( 'products' );

                                                  (                    "                 ")               .

                               .                                SQL-                                                       .
                                                                  , Zend_Db_Select
                           ,                                   ,            ,
                           .

Example #6

   1. // Строит запрос:
   2. //   SELECT p.*
   3. //   FROM "products" AS p
   4.
                                                                                              Zend_Db     201

   5. $select = $db->select()
   6.              ->from( array('p' => 'products') );

                                                                         .
    "имяСхемы.имяТаблицы". Zend_Db_Select                                                 .

Example #7

   1. // Строит запрос:
   2. //   SELECT *
   3. //   FROM "myschema"."products"
   4.
   5. $select = $db->select()
   6.               ->from( 'myschema.products' );
   7.
   8. // или
   9.
   10.       $select = $db->select()
   11.                    ->from('products', '*', 'myschema');

Добавление колонок

                            from()
          .                                       ,                                                "*",
              "        ".


                  .                                          ,                                ,
                                             .

                                                                     ,
                                                                 .           .
join().

                                     "корреляционноеИмя.имяСтолбца". Zend_Db_Select
                                .                                                     ,
                            ,                                        from().

Example #8

   1. // Строит запрос:
   2. //   SELECT p."product_id", p."product_name"
   3. //   FROM "products" AS p
   4.
   5. $select = $db->select()
   6.              ->from(array('p' => 'products'),
   7.                     array('product_id', 'product_name'));
   8.
   9. // Строит тот же запрос с указанием корреляционных имен:
   10.      //   SELECT p."product_id", p."product_name"
   11.      //   FROM "products" AS p
   12.
   13.      $select = $db->select()
   14.                   ->from(array('p' => 'products'),
                                                                                                 Zend_Db   202

   15.                            array('p.product_id', 'p.product_name'));
   16.
   17.       // Строит тот же запрос с псевдонимом для одного столбца:
   18.       //   SELECT p."product_id" AS prodno, p."product_name"
   19.       //   FROM "products" AS p
   20.
   21.       $select = $db->select()
   22.                    ->from(array('p' => 'products'),
   23.                           array('prodno' => 'product_id', 'product_name'));

Добавление столбцов выражений

         SQL-                                                    ,                                  .
                                                                                 .       ,
                           ,                ,       Zend_Db_Select                                  .

                                          Zend_Db_Expr               ,
                                     . Zend_Db_Expr -        -           ,                          .
Zend_Db_Select                        Zend_Db_Expr                                       ,
       ,                                                                     .

Note:              Zend_Db_Expr                 ,                                            .
Zend_Db_Select                                                                       ,
       ,                                                                     .

Example #9                           ,

   1. // Строит запрос:
   2. //   SELECT p."product_id", LOWER(product_name)
   3. //   FROM "products" AS p
   4. // Выражение со скобками неявно преобразуется в Zend_Db_Expr.
   5.
   6. $select = $db->select()
   7.              ->from(array('p' => 'products'),
   8.                     array('product_id', 'LOWER(product_name)'));
   9.
   10.      // Строит запрос:
   11.      //   SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
   12.      //   FROM "products" AS p
   13.
   14.      $select = $db->select()
   15.                   ->from(array('p' => 'products'),
   16.                          array('product_id',
   17.                                'cost_plus_tax' => '(p.cost * 1.08)')
   18.                         );
   19.
   20.      // Построение того же запроса с явным использованием Zend_Db_Expr:
   21.      //   SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
   22.      //   FROM "products" AS p
   23.
   24.      $select = $db->select()
   25.                   ->from(array('p' => 'products'),
   26.                          array('product_id',
   27.                                'cost_plus_tax' =>
   28.                                    new Zend_Db_Expr('p.cost * 1.08'))
   29.                          );
                                                                                                        Zend_Db    203

                          Zend_Db_Select
                                                 .
                      ,                                                 .

                                                            SQL                                         ,
                                        quoteIdentifier()                          .
quoteIdentifier()                                                                              ,
              ,                                                    ,                               SQL.

                                                       ,                                   quoteIdentifier()
                                                               ,
                                                 .       quoteIdentifier()                                  ,
                                        . quoteIdentifier()
                  .

Example #10

   1. // Строится следующий запрос, при этом имя столбца "from" в выражении
   2. // заключается в кавычки:
   3. //   SELECT p."from" + 10 AS origin
   4. //   FROM "products" AS p
   5.
   6. $select = $db->select()
   7.              ->from(array('p' => 'products'),
   8.                     array('origin' =>
   9.                               '(p.' . $db->quoteIdentifier('from') . ' + 10)')
   10.                         );

Добавление столбцов в существующую таблицу FROM или JOIN

                                                            FROM       JOIN    ,
                                .          columns()
       ,                                    .                                          ,            Zend_Db_Expr
                                    .                                              ,                ,
                                             FROM,
   .

Example #11                                                        columns()

   1. // Строится следующий запрос:
   2. //   SELECT p."product_id", p."product_name"
   3. //   FROM "products" AS p
   4.
   5. $select = $db->select()
   6.              ->from(array('p' => 'products'), 'product_id')
   7.              ->columns('product_name');
   8.
   9. // Строится тот же запрос с указанием корреляционных имен:
   10.      //   SELECT p."product_id", p."product_name"
   11.      //   FROM "products" AS p
   12.
   13.      $select = $db->select()
   14.                   ->from(array('p' => 'products'), 'p.product_id')
   15.                   ->columns('product_name', 'p');
                                                                                                                             Zend_Db       204

   16.                                       // Можно также писать: columns('p.product_name')

Добавление в запрос другой таблицы c помощью JOIN

                                                              JOIN                                                    .
                                         ,                                join()               Zend_Db_Select.
                                                    from()                                 ,
                                                        .

Example #12                                                               join()

   1.       // Строит запрос:
   2.       //   SELECT p."product_id", p."product_name", l.*
   3.       //   FROM "products" AS p JOIN "line_items" AS l
   4.       //     ON p.product_id = l.product_id
   5.
   6.$select = $db->select()
   7.             ->from(array('p' => 'products'),
   8.                    array('product_id', 'product_name'))
   9.             ->join(array('l' => 'line_items'),
   10.                         'p.product_id = l.product_id');

                                       join()                                ,                                        .
                           ,
            .                                                                                                     .

Note:                          ,                                                                ,
                                   .                                                                      ,
quoteIdentifier()                                                                                    .

                                       join()   -                                   ,                    from().
                    "* "                            ,                                                         ,           Zend_Db_Expr -
        ,                                                                        from().

                                                                      ,
                .                                           from(),
                           ,                                                                                                      .

Example #13

   1. // Строит запрос:
   2. //   SELECT p."product_id", p."product_name"
   3. //   FROM "products" AS p JOIN "line_items" AS l
   4. //     ON p.product_id = l.product_id
   5.
   6. $select = $db->select()
   7.              ->from(array('p' => 'products'),
   8.                     array('product_id', 'product_name'))
   9.              ->join(array('l' => 'line_items'),
   10.                          'p.product_id = l.product_id',
   11.                          array() ); // empty list of columns
                                                                                                                          Zend_Db               205

                               array()
       .

SQL                                          .
                       Zend_Db_Select.

  •   INNER JOIN,              join(table, join, [columns])                           joinInner(table, join, [columns]).

                  ,                                                                    .
                                                                      .                                                             ,
                                                              .                                                    ,
                                         .

                                                                  .

  •   LEFT JOIN,           joinLeft(table, condition, [columns]).

                                                                                                                                            .
                                                                          ,
                      NULL.

                                                                  .

  •   RIGHT JOIN,             joinRight(table, condition, [columns]).

                                                                                                       .
                                                                                                           .
                                                     ,
      NULL.

                                                                                       ,   ,                   ,
                                                                                                                                        .

  •   FULL JOIN,           joinFull(table, condition, [columns]).

                                                                                                                             .
                                                         ,
                  ,                                                               ,                                NULL
                                                 .

                                                                                       .

  •   CROSS JOIN,             joinCross(table, [columns]).

                                                                                               .
                                                                              .                        ,
                                                                                                   .
              ,                                               WHERE,
                                                             SQL-89.
                                                                                        Zend_Db             206

              joinCross()                                                      .
                                                      .

   •    NATURAL JOIN,         joinNatural(table, [columns]).

                                                    ,                                               .
                                        ;
                    .         API                                                               ,
             SQL                                                   .

              joinNatural()                                                        .

                                                                           ,
JoinUsing.
        ,                                     ,   Zend_Db_Select                                        .

Example #14                                 joinUsing()

   1. // Строится запрос:
   2. //   SELECT *
   3. //   FROM "table1"
   4. //   JOIN "table2"
   5. //   ON "table1".column1 = "table2".column1
   6. //   WHERE column2 = 'foo'
   7.
   8. $select = $db->select()
   9.              ->from('table1')
   10.                   ->joinUsing('table2', 'column1')
   11.                   ->where('column2 = ?', 'foo');

                                                                                   JoinUsing.

   •    joinUsing(table, join, [columns]) joinInnerUsing(table, join, [columns])
   •    joinLeftUsing(table, join, [columns])
   •    joinRightUsing(table, join, [columns])
   •    joinFullUsing(table, join, [columns])

Добавление предложения WHERE

                                                                       ,               where().
                                       SQL-               ,                                  WHERE
               .

Example #15                                 where()

   1.   // Строится запрос:
   2.   //   SELECT product_id, product_name, price
   3.   //   FROM "products"
   4.   //   WHERE price > 100.00
   5.
   6.   $select = $db->select()
   7.                ->from('products',
   8.                       array('product_id', 'product_name', 'price'))
                                                                                                  Zend_Db             207

   9.                   ->where('price > 100.00');

Note:                                  where()        orWhere()
        .                     ,                                                 ,
quoteIdentifier()                                            .

                             where()                              .                                       .
Zend_Db_Select                                                                            ("?")                   .

                                                  .                                                   ,
                                            ,                                                                 .

Example #16                                      where()

   1. // Строит запрос:
   2. //   SELECT product_id, product_name, price
   3. //   FROM "products"
   4. //   WHERE (price > 100.00)
   5.
   6. $minimumPrice = 100;
   7.
   8. $select = $db->select()
   9.              ->from('products',
   10.                          array('product_id', 'product_name', 'price'))
   11.                   ->where('price > ?', $minimumPrice);

                                  where()                                       Zend_Db_Select.
                                                                          AND         .

Example #17                                                where()

   1. // Строит запрос:
   2. //   SELECT product_id, product_name, price
   3. //   FROM "products"
   4. //   WHERE (price > 100.00)
   5. //     AND (price < 500.00)
   6.
   7. $minimumPrice = 100;
   8. $maximumPrice = 500;
   9.
   10.      $select = $db->select()
   11.                   ->from('products',
   12.                          array('product_id', 'product_name', 'price'))
   13.                   ->where('price > ?', $minimumPrice)
   14.                   ->where('price < ?', $maximumPrice);

                                                            OR,                     orWhere().
                    ,                 where(),                        ,
                        OR           AND.

Example #18                                           orWhere()

   1. // Строит запрос:
   2. //   SELECT product_id, product_name, price
   3. //   FROM "products"
                                                                                                        Zend_Db       208

   4. //   WHERE (price < 100.00)
   5. //     OR (price > 500.00)
   6.
   7. $minimumPrice = 100;
   8. $maximumPrice = 500;
   9.
   10.      $select = $db->select()
   11.                   ->from('products',
   12.                           array('product_id', 'product_name', 'price'))
   13.                   ->where('price < ?', $minimumPrice)
   14.                   ->orWhere('price > ?', $maximumPrice);

Zend_Db_Select                                                              ,
where()         orWhere().                                              ,
                                                             .

Example #19

   1. // Строит запрос:
   2. //   SELECT product_id, product_name, price
   3. //   FROM "products"
   4. //   WHERE (price < 100.00 OR price > 500.00)
   5. //     AND (product_name = 'Apple')
   6.
   7. $minimumPrice = 100;
   8. $maximumPrice = 500;
   9. $prod = 'Apple';
   10.
   11.      $select = $db->select()
   12.                   ->from('products',
   13.                          array('product_id', 'product_name', 'price'))
   14.                   ->where("price < $minimumPrice OR price > $maximumPrice")
   15.                   ->where('product_name = ?', $prod);

                                                                 ,                  ,                   AND
                      ,       OR.   Zend_Db_Select                      ,       ,                                 ,
                          ,                                          where()            ,    AND,
                 .

Добавление предложения GROUP BY

          SQL                 GROUP BY
                                                         ,                              GROUP BY.

  Zend_Db_Select                                     ,                                              ,
group().
GROUP BY.

Example #20                                          group()

   1.   // Строит запрос:
   2.   //   SELECT p."product_id", COUNT(*) AS line_items_per_product
   3.   //   FROM "products" AS p JOIN "line_items" AS l
   4.   //     ON p.product_id = l.product_id
   5.   //   GROUP BY p.product_id
                                                                                                                    Zend_Db   209

   6.
   7. $select = $db->select()
   8.              ->from(array('p' => 'products'),
   9.                     array('product_id'))
   10.                   ->join(array('l' => 'line_items'),
   11.                          'p.product_id = l.product_id',
   12.                          array('line_items_per_product' => 'COUNT(*)'))
   13.                   ->group('p.product_id');

                                            from(),
         ,                                                                            ,
                                  Zend_Db_Expr.

Добавление предложения HAVING

  SQL                    HAVING                                                               .                         ,
              WHERE                                                       .
              ,                           WHERE                                   ,                                 HAVING
                                      .

  Zend_Db_Select                                                                                       having().
                                                            where().                                                ,
              SQL-                .                                       -               ,
                                                  SQL-              .             ,
        having(),                                                   AND                                       OR,
                        orHaving().

Example #21                                              having()

   1. // Строит запрос:
   2. //   SELECT p."product_id", COUNT(*) AS line_items_per_product
   3. //   FROM "products" AS p JOIN "line_items" AS l
   4. //     ON p.product_id = l.product_id
   5. //   GROUP BY p.product_id
   6. //   HAVING line_items_per_product > 10
   7.
   8. $select = $db->select()
   9.              ->from(array('p' => 'products'),
   10.                           array('product_id'))
   11.                   ->join(array('l' => 'line_items'),
   12.                           'p.product_id = l.product_id',
   13.                           array('line_items_per_product' => 'COUNT(*)'))
   14.                   ->group('p.product_id')
   15.                   ->having('line_items_per_product > 10');

Note:                    ,                                having()        orHaving(),
                             .                                  ,                                                       ,
              quoteIdentifier()                                               .

Добавление предложения ORDER BY

  SQL                    ORDER BY                                         (                       ),
                    .                                               ,
                                                                                                               Zend_Db           210

                                   "           ":                                                               ,
                                                                         .
                                   .
                          ,                             DESC                        .

 Zend_Db_Select                                             order()                                                          ,
                                               .                                                                     ,
                                                                   ASC       DESC
              .

                              from()       group(),
                  ,                                                                         Zend_Db_Expr.

Example #22                                              order()

  1. // Строит запрос:
  2. //   SELECT p."product_id", COUNT(*) AS line_items_per_product
  3. //   FROM "products" AS p JOIN "line_items" AS l
  4. //     ON p.product_id = l.product_id
  5. //   GROUP BY p.product_id
  6. //   ORDER BY "line_items_per_product" DESC, "product_id"
  7.
  8. $select = $db->select()
  9.              ->from(array('p' => 'products'),
  10.                           array('product_id'))
  11.                   ->join(array('l' => 'line_items'),
  12.                           'p.product_id = l.product_id',
  13.                           array('line_items_per_product' => 'COUNT(*)'))
  14.                   ->group('p.product_id')
  15.                   ->order(array('line_items_per_product DESC',
  16.                                  'product_id'));

Добавление предложения LIMIT

                                              SQL                   ,                                 LIMIT.
                                                                                                                 .
                                                                                        .
                                                    -          ,                                                         .

 Zend_Db_Select                                             limit()
                                       .
                      .                             -

Example #23                                              limit()

  1.   // Строит запрос:
  2.   //   SELECT p."product_id", p."product_name"
  3.   //   FROM "products" AS p
  4.   //   LIMIT 10, 20
  5.
  6.   $select = $db->select()
  7.                ->from(array('p' => 'products'),
  8.                       array('product_id', 'product_name'))
  9.                ->limit(10, 20);
                                                                                             Zend_Db   211

Note:             LIMIT                                   .
                                                .             Zend_Db_Adapter_Abstract
                      SQL,                            .

                     limitPage()
          .
                          ,                                                      ,
                              .            ,                     "         "
                                          .
limitPage(),                      -   .
              .

Example #24                                    limitPage()

   1.   // Строит запрос:
   2.   //   SELECT p."product_id", p."product_name"
   3.   //   FROM "products" AS p
   4.   //   LIMIT 10, 20
   5.
   6.   $select = $db->select()
   7.                ->from(array('p' => 'products'),
   8.                       array('product_id', 'product_name'))
   9.                ->limitPage(2, 10);

Добавление модификатора DISTINCT

        distinct()                                             DISTINCT              .

Example #25                                    distinct()

   1.   // Строит запрос:
   2.   //   SELECT DISTINCT p."product_name"
   3.   //   FROM "products" AS p
   4.
   5.   $select = $db->select()
   6.                ->distinct()
   7.                ->from(array('p' => 'products'), 'product_name');

Добавление модификатора FOR UPDATE

        forUpdate()                                           FOR UPDATE                 .

Example #26                                    forUpdate()

   1.   // Строит запрос:
   2.   //   SELECT FOR UPDATE p.*
   3.   //   FROM "products" AS p
   4.
   5.   $select = $db->select()
   6.                ->forUpdate()
   7.                ->from(array('p' => 'products'));
                                                                                              Zend_Db           212

Произведение запросов на выборку

                        ,                   ,                               Zend_Db_Select.

Произведение запросов на выборку из адаптера БД

                            ,                            Zend_Db_Select,
                                  query()           Zend_Db_Adapter_Abstract.
Zend_Db_Select                      .

        query()                   Zend_Db_Statement        PDOStatement,                                    .

Example #27                                 query()

   1. $select = $db->select()
   2.              ->from('products');
   3.
   4. $stmt = $db->query($select);
   5. $result = $stmt->fetchAll();

Произведение запросов на выборку через объект Select

                  query()                                           query()           Zend_Db_Select.
                                Zend_Db_Statement      PDOStatement,                                    .

Example #28                                 query()            Select

   1. $select = $db->select()
   2.              ->from('products');
   3.
   4. $stmt = $select->query();
   5. $result = $stmt->fetchAll();

Преобразование объекта Select в SQL-строку

                                                       SQL-             ,
         Zend_Db_Select,                     __toString().

Example #29                                 __toString()

   1.   $select = $db->select()
   2.                ->from('products');
   3.
   4.   $sql = $select->__toString();
   5.   echo "$sql\n";
   6.
   7.   // Выводится будет строка:
   8.   //   SELECT * FROM "products"
                                                                                                  Zend_Db           213

Другие методы

                                               Zend_Db_Select,                                     :
getPart()       reset().

Получение частей объекта Select

      getPart()                                                                   .           ,
                                                                              WHERE,                        ,
                                                ,                                                          LIMIT.

                                           ,                                  SQL.
                                                ,                         ,                                     .
                                                    .

                               getPart()                              ,                                ,
                    .      ,     'from'                                       ,
                                    FROM,                                         .

Zend_Db_Select                    ,                                                    SQL-            .
                                                                  .

            ,                         getPart()         reset()

Zend_Db_Select::DISTINCT       'distinct'
Zend_Db_Select::FOR_UPDATE     'forupdate'
Zend_Db_Select::COLUMNS        'columns'
Zend_Db_Select::FROM           'from'
Zend_Db_Select::WHERE          'where'
Zend_Db_Select::GROUP          'group'
Zend_Db_Select::HAVING         'having'
Zend_Db_Select::ORDER          'order'
Zend_Db_Select::LIMIT_COUNT    'limitcount'
Zend_Db_Select::LIMIT_OFFSET   'limitoffset'


Example #30                                    getPart()

   1. $select = $db->select()
   2.              ->from('products')
   3.              ->order('product_id');
   4.
   5. // Вы можете использовать строковой литерал для указания части запроса
   6. $orderData = $select->getPart( 'order' );
   7.
   8. // Можно использовать константу для указания той же части
   9. $orderData = $select->getPart( Zend_Db_Select::ORDER );
   10.
   11.      // Возвращаемое значение может быть массивом, а не строкой
   12.      // Каждая часть имет свою структуру
   13.      print_r( $orderData );
                                                                                Zend_Db        214

Сброс частей запроса в объекте Select

           reset()                                            SQL-                 ,
                 .

                                                       .                                   ,
                     ,                                     getPart().       ,
      ,                                        .

                               ,   reset()                                             .
              Zend_Db_Select                                  -         ,
                   .

Example #31                                  reset()

   1. // Строит запрос:
   2. //   SELECT p.*
   3. //   FROM "products" AS p
   4. //   ORDER BY "product_name"
   5.
   6. $select = $db->select()
   7.              ->from(array('p' => 'products')
   8.              ->order('product_name');
   9.
   10.      // Changed requirement, instead order by a different columns:
   11.      // Теперь нужна сортировка по другому столбцу:
   12.      //   SELECT p.*
   13.      //   FROM "products" AS p
   14.      //   ORDER BY "product_id"
   15.
   16.      // Очищаем соответствующую часть, теперь можно переопределить ее
   17.      $select->reset( Zend_Db_Select::ORDER );
   18.
   19.      // Задаем другой столбец
   20.      $select->order('product_id');
   21.
   22.      // Очищаем все части запроса
   23.      $select->reset();
                                                                                                            Zend_Db       215


Zend_Db_Table
Класс таблицы - введение

        Zend_Db_Table                         -                                                                .
                                                                            .                                         ,
                                                  .

              Zend_Db_Table                                     » Table Data Gateway.
                       ,                              » Row Data Gateway.

Определение класса таблицы

                              ,                            ,                        ,
Zend_Db_Table_Abstract.

Определение имени и схемы таблицы

                      ,                                         ,                                           $_name.
                                                                ,                                       .

Example #1

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bugs';
   4. }

                                          ,                                                 .
          ,                                                     ,                               .

Example #2

   1. class bugs extends Zend_Db_Table_Abstract
   2. {
   3.     // имя таблицы соответствует имени класса
   4. }

                                                                                    $_schema
                                                      $_name.           ,                                   $_name,
                                      ,           ,                                         $_schema.
                          "       "                                 "           "       "                      ",
                                          .

Example #3

   1.   // Первый способ:
   2.   class Bugs extends Zend_Db_Table_Abstract
   3.   {
   4.       protected $_schema = 'bug_db';
   5.       protected $_name   = 'bugs';
   6.   }
                                                                                Zend_Db     216

  7.
  8. // Второй способ:
  9. class Bugs extends Zend_Db_Table_Abstract
  10.      {
  11.          protected $_name = 'bug_db.bugs';
  12.      }
  13.
  14.      // Если в обоих свойствах $_name м $_schema была объявлена схема,
  15.      // то указанная в $_name имеет больший приоритет:
  16.      class Bugs extends Zend_Db_Table_Abstract
  17.      {
  18.          protected $_name   = 'bug_db.bugs';
  19.          protected $_schema = 'ignored';
  20.      }

                                                                          ,
                                         ,                             $_name   $_schema.
                 ,                      name,                           ,
      schema.

Example #4

  1. class Bugs extends Zend_Db_Table_Abstract
  2. {
  3. }
  4.
  5. // Первый способ:
  6.
  7. $tableBugs = new Bugs(array('name' => 'bugs', 'schema' => 'bug_db'));
  8.
  9. // Второй способ:
  10.
  11.      $tableBugs = new Bugs(array('name' => 'bug_db.bugs');
  12.
  13.      // Если в обоих опциях 'name' и 'schema' была объявлена схема,
  14.      // то указанная в 'name' имеет больший приоритет:
  15.
  16.      $tableBugs = new Bugs(array('name' => 'bug_db.bugs',
  17.                                  'schema' => 'ignored');

                         ,                            ,
             .

Определение первичного ключа таблицы

                                         .                                            ,
                               $_primary.
                  ,                                    .

Example #5

  1. class Bugs extends Zend_Db_Table_Abstract
  2. {
  3.     protected $_name = 'bugs';
  4.     protected $_primary = 'bug_id';
  5. }
                                                                                                                                                        Zend_Db   217

                                              Zend_Db_Table_Abstract
                                                 ,                                                                                          ,
            ,                            describeTable().

Note:                                        ,                             (                           )
        .                                                                                      (                                                ,
                describeTable())                                                                           ,
                             Zend_Db_Table.

Переопределение методов установки таблицы

                                                             ,                                                                                      ,
                                                                     .
    ,                                                            .                 ,
        .

Example #6                                                               _setupTableName()

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected function _setupTableName()
   4.     {
   5.         $this->_name = 'bugs';
   6.         parent::_setupTableName();
   7.     }
   8. }

                                                                                                               :

   •        _setupDatabaseAdapter()                              ,                                                     ,
                                                         ,                                 .                                           ,
                                                                               .
   •        _setupTableName()                                                                                                  .
                 ,                                                                     ,
                     .
   •        _setupMetadata()                  ,                                                                                            "schema.table",
                    describeTable()                                                                ,
            $_cols,               describeTable().                                                                         ,
                                     .
   •        _setupPrimaryKey()                                                                                                         ,
            describeTable(),                         ,                                                                                 $_cols.
                                         ,                                                                                               .

Инициализация таблицы

                                                                                                   ,                                                      ,
                                                 init(),                                                           ,
                         .
__construct,                                                                                                                       .

Example #7                                                           init()
                                                                                    Zend_Db         218

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_observer;
   4.
   5.     protected function init()
   6.     {
   7.         $this->_observer = new MyObserverClass();
   8.     }
   9. }

Создание экземпляра класса таблицы

       ,                                    ,                           ,                   .
                                                                .
                                        ,                                       -
      .                                                         ,                       :

Установка адаптера БД


Zend_Db_Adapter_Abstract                            'db'.

Example #8

   1. $db = Zend_Db::factory('PDO_MYSQL', $options);
   2.
   3. $table = new Bugs(array('db' => $db));

Установка используемого по умолчанию адаптера БД


Zend_Db_Adapter_Abstract
          .
Zend_Db_Table_Abstract::setDefaultAdapter().
Zend_Db_Adapter_Abstract.

Example #9                                                          ,

   1. $db = Zend_Db::factory('PDO_MYSQL', $options);
   2. Zend_Db_Table_Abstract::setDefaultAdapter($db);
   3.
   4. // Далее...
   5.
   6. $table = new Bugs();

                                                                                    -           ,
                  -                             ,                           .
                                ,
           .                ,                               ,                                   .
                                                                                                 Zend_Db   219

Хранение адаптера БД в реестре

                                                        -                                             'db'.
                                                               Zend_Registry,
                                   Zend_Db_Adapter_Abstract.

Example #10

  1.   $db = Zend_Db::factory('PDO_MYSQL', $options);
  2.   Zend_Registry::set('my_db', $db);
  3.
  4.   // Далее...
  5.
  6.   $table = new Bugs(array('db' => 'my_db'));

                                      ,                         ,
   ,                                                            ,
                   , . .                                                            .
                                                                    .
                                                                            ,
                           .

Добавление строк в таблицу

                                                                                ,
           .                              insert()                  .
       ,                                                                .

Example #11

  1.   $table = new Bugs();
  2.
  3.   $data = array(
  4.       'created_on'      => '2007-03-22',
  5.       'bug_description' => 'Something wrong',
  6.       'bug_status'      => 'NEW'
  7.   );
  8.
  9.   $table->insert($data);

                                                                                        ,
               .               ,                                                SQL,
                                           .                                     Zend_Db_Expr.

Example #12

  1. $table = new Bugs();
  2.
  3. $data = array(
  4.     'created_on'      => new Zend_Db_Expr('CURDATE()'),
  5.     'bug_description' => 'Something wrong',
  6.     'bug_status'      => 'NEW'
  7. );
                                                                                                                 Zend_Db               220

                                                                    ,
       .                                                       Zend_Db_Table_Abstract,
           .                                           ,                                                             .

Использование таблицы с автоинкрементным ключом

                                                                                                       ,
                                                                  INSERT.

                                               Zend_Db_Table_Abstract $_sequence                               TRUE,
                    ,                                                    .

Example #13

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bugs';
   4.
   5.     // Это значение по умолчанию присутствует в Zend_Db_Table_Abstract,
   6.     // устанавливать его не обязательно
   7.     protected $_sequence = true;
   8. }

                         ,                                                                                 MySQL, Microsoft
SQL Server          SQLite.

PostgreSQL                              SERIAL,                                                    ,
                          ,                                                                                          . IBM DB2
                        IDENTITY                                                  .
               ,                                           Zend_Db_Table                                                 ,
                   $_sequence                                   TRUE.

Использование таблицы с последовательностью

                                  (sequence)                                  ,                                                  ,
                                                                                                                 .

                              $_sequence                           ,   Zend_Db_Table_Abstract
                                                .                                                                            ,
                                                    INSERT.

Example #14

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bugs';
   4.
   5.     protected $_sequence = 'bug_sequence';
   6. }

                              ,                                                                 Oracle, PostgreSQL               IBM
DB2.
                                                                                                                             Zend_Db       221

PostgreSQL              IBM DB2                                 ,
                                        .                                               ,
                                                        .
            ,
        .

Использование таблицы с естественным ключом

                                                                    .                   ,
                                                    .                                                                              .

                                $_sequence                          FALSE,          Zend_Db_Table_Abstract               ,
                                                        .
                                            insert(),                                                   Zend_Db_Table_Exception.

Example #15

   1. class BugStatus extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bug_status';
   4.
   5.     protected $_sequence = false;
   6. }

Note:                                                                                            .                   ,
                                                :                               ,                                            "     - -
            ",                                                              .

Обновление строк в таблице

                                                            ,                           update                   .
                                    :                                                                      ,                           ,
                           ,                                            ;           -                  SQL,
                        WHERE                                                                        UPDATE.

Example #16

   1.       $table = new Bugs();
   2.
   3.       $data = array(
   4.           'updated_on'                  => '2007-03-23',
   5.           'bug_status'                  => 'FIXED'
   6.       );
   7.
   8.       $where = $table->getAdapter()->quoteInto('bug_id = ?', 1234);
   9.
   10.                  $table->update($data, $where);

                                        update()                                                                update(),
                                              SQL-                  .
                 AND.
                                                                                                                            Zend_Db             222

Note:                                              SQL-                                                                      .
                                                     ,                                                  ,
                                 .                             quote(), quoteInto()       quoteIdentifier()                          .

Удаление строк из таблицы

                                                                          ,                 delete().
                     ,                      SQL-                  ,                                                 WHERE
            ,                                              .

Example #17

   1. $table = new Bugs();
   2.
   3. $where = $table->getAdapter()->quoteInto('bug_id = ?', 1235);
   4.
   5. $table->delete($where);

                                                                               delete()                     ,
                                     SQL-              .                                                                                 AND.

Note:                                              SQL-                                                                      .
                                                     ,                                                  ,
                                 .                             quote(), quoteInto()       quoteIdentifier()                          .

Извлечение строк по первичному ключу

                                                                  ,
        ,                             find().
                         ,                                                            .

Example #18

   1.       $table = new Bugs();
   2.
   3.       // Запрос одной строки
   4.       // Возвращает набор строк (Rowset)
   5.       $rows = $table->find(1234);
   6.
   7.       // Запрос нескольких строк
   8.       // Также возвращает набор строк (Rowset)
   9.       $rows = $table->find(array(1234, 5678));

                                             ,                                              ,
                                                                                                                            ,
                                                   .                                             ,
                 ,                                                              .

            find()                                                    ,                                                          ,
                                                                                .
                             .                                                                                  ,           find()
                                      Zend_Db_Table_Rowset_Abstract (                       ).
                                                                                                       Zend_Db   223

                                         , .e.                                              ,
                                                              find().
            ,                                         .

                                                                            ,
                .                                                                           .
                             "   "                    ;                 ,
                                                          ,                         -
  . .

Example #19

                find()                                                                                      .
                                                     (1234, 'ABC'),                 - (5678, 'DEF').

  1. class BugsProducts extends Zend_Db_Table_Abstract
  2. {
  3.     protected $_name = 'bugs_products';
  4.     protected $_primary = array('bug_id', 'product_id');
  5. }
  6.
  7. $table = new BugsProducts();
  8.
  9. // Запрашивает единственную строку через составной первичный ключ
  10.      // Возвращает набор строк (Rowset)
  11.      $rows = $table->find(1234, 'ABC');
  12.
  13.      // Запрашивает несколько строк через составной первичный ключ
  14.      // Также возвращает набор строк (Rowset)
  15.      $rows = $table->find(array(1234, 5678), array('ABC', 'DEF'));

Извлечение наборов строк

API для произведения выборки
Warning

API                                              ,                 Zend_Db_Table_Select
        .            ,                                                  fetchRow() fetchAll()
                         .

                                                                                ,       ,               ,
                                     ,                                                          .

  1.    // Извлечение набора строк
  2.    $rows = $table->fetchAll('bug_status = "NEW"', 'bug_id ASC', 10, 0);
  3.    $rows = $table->fetchAll($table->select()->where('bug_status = ?', 'NEW')
  4.                                             ->order('bug_id ASC')
  5.                                             ->limit(10, 0));
  6.
  7.// Извлечение одной строки
  8.$row = $table->fetchRow('bug_status = "NEW"', 'bug_id ASC');
  9.$row = $table->fetchRow($table->select()->where('bug_status = ?', 'NEW')
  10.                                             ->order('bug_id ASC'));
                                                                                                                 Zend_Db        224

            Zend_Db_Table_Select                                           Zend_Db_Select,
                                                              .
                            :

   •                                                                                  fetchRow   fetchAll.
                                                      ,
                                                 .
   •                                        ,                                                        .                      ,

                                                          .                  Zend_Db_Table_Row                   readOnly
                                                                                                 (       save()).
   •                                                 JOIN                                                     .
   •
                 /              .                                               PHP.                         ,
                                        Zend_Db_Table,            . . Zend_Db_Table_Row
                                    ,                                            Zend_Db_Table.

Example #20

   1.       $table = new Bugs();
   2.
   3.       $select = $table->select();
   4.       $select->where('bug_status = ?', 'NEW');
   5.
   6.       $rows = $table->fetchAll($select);

                                            fluent interface,
                        .

Example #21                                 fluent interface

   1. $table = new Bugs();
   2.
   3. $rows =
   4.     $table->fetchAll($table->select()->where('bug_status = ?', 'NEW'));

Извлечение набора строк

                                        ,                                         ,
        ,        fetchAll()                            .
Zend_Db_Table_Rowset_Abstract.

Example #22

   1. $table = new Bugs();
   2.
   3. $select = $table->select()->where('bug_status = ?', 'NEW');
   4.
   5. $rows = $table->fetchAll($select);
                                                                                                     Zend_Db         225

                                                          ,                                        ORDER BY,
                                                                                 LIMIT
                    ,                             LIMIT.

Example #23

   1. $table = new Bugs();
   2.
   3. $order = 'bug_id';
   4.
   5. // Требуется вернуть строки начиная с 21-ой и кончая 30-й
   6. $count = 10;
   7. $offset = 20;
   8.
   9. $select = $table->select()->where(array('bug_status = ?' => 'NEW'))
   10.                                ->order($order)
   11.                                ->limit($count, $offset);
   12.
   13.      $rows = $table->fetchAll($select);

                                                                  .                                ORDER,
                                                                             .
                LIMIT,                                                           WHERE                       .

Расширенное использование

                                                                                                                 ,
                             /           .                                                               FROM
                    .

Example #24

   1.   $table = new Bugs();
   2.
   3.   $select = $table->select();
   4.   $select->from($table, array('bug_id', 'bug_description'))
   5.          ->where('bug_status = ?', 'NEW');
   6.
   7.   $rows = $table->fetchAll($select);

Important

                                                  ,                      -                  "       ",
                                     .                                                   save(),
                                         .

                                                               FROM,
        /                ,                            .
            Bugs,                                               ,                                        .
                                         GROUP.               'count'                               ,
                                 ,                                   .

Example #25
                                                                                   Zend_Db          226

   1.   $table = new Bugs();
   2.
   3.   $select = $table->select();
   4.   $select->from($table,
   5.                 array('COUNT(reported_by) as `count`', 'reported_by'))
   6.          ->where('bug_status = ?', 'NEW')
   7.          ->group('reported_by');
   8.
   9.   $rows = $table->fetchAll($select);



            .                      Accounts                                    ,
                         'Bob'.

Example #26                                                              ,             fetchAll()

   1. $table = new Bugs();
   2.
   3. $select = $table->select();
   4. $select->where('bug_status = ?', 'NEW')
   5.        ->join('accounts', 'accounts.account_name = bugs.reported_by')
   6.        ->where('accounts.account_name = ?', 'Bob');
   7.
   8. $rows = $table->fetchAll($select);

     Zend_Db_Table_Select
      .           ,                                 ,
Zend_Db_Table_Row                                                        .
                                              /                                false
setIntegrityCheck().                   /                           "             "             ,
            ,   save(), delete()                                                        .

Example #27                                       Zend_Db_Table_Select



$table = new Bugs();

$select = $table->select()->setIntegrityCheck(false);
$select->where('bug_status = ?', 'NEW')
       ->join('accounts',
              'accounts.account_name = bugs.reported_by',
              'account_name')
       ->where('accounts.account_name = ?', 'Bob');

$rows = $table->fetchAll($select);



Извлечение одной строки

                                   ,                ,               ,
fetchAll().

Example #28
                                                                                                                        Zend_Db    227

  1. $table = new Bugs();
  2.
  3. $select = $table->select()->where('bug_status = ?', 'NEW')
  4.                            ->order('bug_id');
  5.
  6. $row = $table->fetchRow($select);

                                               Zend_Db_Table_Row_Abstract.
                                                          , fetchRow()                                  NULL.

Получение метаданных таблицы

      Zend_Db_Table_Abstract                                                                                    .         info()
                                                  ,                    ,                                            .

Example #29

  1. $table = new Bugs();
  2.
  3. $info = $table->info();
  4.
  5. echo "The table name is " . $info['name'] . "\n";

              ,                                       info(),                      .

  •   name =>
  •   cols =>
  •   primary =>
  •   metadata =>                                      ,
                           .                               ,                                describeTable().
  •   rowClass =>                                              ,                                        ,
                                                               .                           Zend_Db_Table_Row.
  •   rowsetClass =>                                               ,                                             ,
                                                                               .                       Zend_Db_Table_Rowset.
  •   referenceMap =>                                                                                       .  .
             .
  •   dependentTables =>                                                   ,                                        .     .
                               .
  •   schema =>                        (               ,                               )                   .

Кэширование метаданных таблицы

              Zend_Db_Table_Abstract
                                                      . . .                                                ,
                                                                                                describeTable().

                       ,                                                                                                      ,

                                           .
       ,                           .
                                                                                     Zend_Db   228

                                     :

  •                Zend_Db_Table_Abstract::setDefaultMetadataCache() -
                                          ,                                  .
  •                    Zend_Db_Table_Abstract::__construct() -
                                                               .

                                             NULL   ( . .                        )
      Zend_Cache_Core.                                                   ,

              .

Example #30

                         ,                            ,
      :

  1. // Сначала создается объект кэша
  2. $frontendOptions = array(
  3.     'automatic_serialization' => true
  4.     );
  5.
  6. $backendOptions = array(
  7.     'cacheDir'                 => 'cacheDir'
  8.     );
  9.
  10.       $cache = Zend_Cache::factory('Core',
  11.                                    'File',
  12.                                    $frontendOptions,
  13.                                    $backendOptions);
  14.
  15.
  16.       // Далее, объект кэша устанавливается в качестве используемого
  17.       // во всех объектах таблиц
  18.       Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
  19.
  20.
  21.       // Класс таблицы
  22.       class Bugs extends Zend_Db_Table_Abstract
  23.       {
  24.           // ...
  25.       }
  26.
  27.
  28.       // Каждый экземпляр таблицы Bugs теперь использует
  29.       // кэширование метаданных по умолчанию
  30.       $bugs = new Bugs();

Example #31

                         ,
              :

  1. // Сначала создается объект кэша
  2. $frontendOptions = array(
                                                                                             Zend_Db       229

   3.     'automatic_serialization' => true
   4.     );
   5.
   6. $backendOptions = array(
   7.     'cacheDir'                 => 'cacheDir'
   8.     );
   9.
   10.       $cache = Zend_Cache::factory('Core',
   11.                                    'File',
   12.                                    $frontendOptions,
   13.                                    $backendOptions);
   14.
   15.       // Класс таблицы
   16.       class Bugs extends Zend_Db_Table_Abstract
   17.       {
   18.           // ...
   19.       }
   20.
   21.
   22.       // Экземпляр конфигурируется при инстанцировании
   23.       $bugs = new Bugs(array('metadataCache' => $cache));

Note:
                       ,                            describeTable(),                     ,             ,
         automatic_serialization             TRUE                     Zend_Cache_Core.

               ,                             Zend_Cache_Backend_File,
                             ,                                    .
                   Zend_Cache.

Расширение класса таблицы

Использование собственных классов строки и набора строк


Zend_Db_Table_Rowset,
Zend_Db_Table_Row.                                     ,                                 ,
                                     Zend_Db_Table_Rowset_Abstract
Zend_Db_Table_Row_Abstract             .


'rowClass'    'rowsetClass'            .                                                     .

Example #32

   1. class My_Row extends Zend_Db_Table_Row_Abstract
   2. {
   3.     ...
   4. }
   5.
   6. class My_Rowset extends Zend_Db_Table_Rowset_Abstract
   7. {
   8.     ...
   9. }
   10.
                                                                                          Zend_Db    230

   11.        $table = new Bugs(
   12.            array(
   13.                'rowClass'    => 'My_Row',
   14.                'rowsetClass' => 'My_Rowset'
   15.            )
   16.        );
   17.
   18.        $where = $table->getAdapter()->quoteInto('bug_status = ?', 'NEW')
   19.
   20.        // Возвращает объект типа My_Rowset,
   21.        // содержащий массив объектов типа My_Row
   22.        $rows = $table->fetchAll($where);

                                        ,                        setRowClass()   setRowsetClass().

                               ,               .

Example #33

   1. $table = new Bugs();
   2.
   3. $where = $table->getAdapter()->quoteInto('bug_status = ?', 'NEW')
   4.
   5. // Возвращает объект типа Zend_Db_Table_Rowset,
   6. // содержащий массив объектов типа Zend_Db_Table_Row.
   7. $rowsStandard = $table->fetchAll($where);
   8.
   9. $table->setRowClass('My_Row');
   10.      $table->setRowsetClass('My_Rowset');
   11.
   12.      // Возвращает объект типа My_Rowset,
   13.      // содержащий массив объектов типа My_Row.
   14.      $rowsCustom = $table->fetchAll($where);
   15.
   16.      // Объект $rowsStandard по прежнему существует и не изменился.

                                                                      Zend_Db_Table_Row
Zend_Db_Table_Rowset.

Определение собственной логики для добавления, обновления и удаления строк

                                   insert()   update()                       .
                           ,                             ,                                  .
                                                             .

Example #34

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bugs';
   4.
   5.     public function insert(array $data)
   6.     {
   7.         // добавление timestamp
   8.         if (empty($data['created_on'])) {
   9.             $data['created_on'] = time();
                                                                                                Zend_Db       231

   10.                          }
   11.                          return parent::insert($data);
   12.              }
   13.
   14.              public function update(array $data, $where)
   15.              {
   16.                  // добавление timestamp
   17.                  if (empty($data['updated_on'])) {
   18.                      $data['updated_on'] = time();
   19.                  }
   20.                  return parent::update($data, $where);
   21.              }
   22.         }

                                                  delete().

Определение собственных методов для поиска

                                                                                    ,
                                                                  .
                   fetchAll(),
                        ,                                                                            .
                                                                                                          .

Example #35

   1. class Bugs extends Zend_Db_Table_Abstract
   2. {
   3.     protected $_name = 'bugs';
   4.
   5.     public function findByStatus($status)
   6.     {
   7.         $where = $this->getAdapter()->quoteInto('bug_status = ?', $status);
   8.         return $this->fetchAll($where, 'bug_id');
   9.     }
   10.      }

Определение инфлекции в Zend_Db_Table

                                              ,
                                             ,                            .

           ,                                      - "BugsProducts",
                                             "bugs_products",
         $_name.                                                      "CamelCase"
                                                                      .

                                                                      ,                     $_name
                            .

Zend_Db_Table_Abstract                                                                  .
                   $_name                                     ,
              ,           .
                                                                                  Zend_Db     232

                                                                 ,
                                                                        .              SQL-
                        ,                             ,       Zend_Db_Table_Abstract
                   .

                                          ,                                        ,
                  _setupTableName()                     .
                                      ,             Zend_Db_Table_Abstract,
                                                          .

Example #36                                   ,

   1. abstract class MyAbstractTable extends Zend_Db_Table_Abstract
   2. {
   3.     protected function _setupTableName()
   4.     {
   5.         if (!$this->_name) {
   6.             $this->_name = myCustomInflector(get_class($this));
   7.         }
   8.         parent::_setupTableName();
   9.     }
   10.      }
   11.
   12.      class BugsProducts extends MyAbstractTable
   13.      {
   14.      }

                                                                                       .
Zend Framework                                            .
                                                                                             Zend_Db   233


Zend_Db_Table_Row
Введение

Zend_Db_Table_Row                     ,                                          Zend_Db_Table.
                                          ,
Zend_Db_Table_Row.
                         .

Zend_Db_Table_Row                                     » Row Data Gateway.

Извлечение строки

Zend_Db_Table_Abstract                            find()   fetchAll(),
Zend_Db_Table_Rowset,            fetchRow(),                                Zend_Db_Table_Row.

Example #1

   1. $bugs = new Bugs();
   2. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));

        Zend_Db_Table_Rowset                                    Zend_Db_Table_Row.
                                 Zend_Db_Table_Rowset.

Example #2

   1. $bugs = new Bugs();
   2. $rowset = $bugs->fetchAll($bugs->select()->where('bug_status = ?', 1));
   3. $row = $rowset->current();

Чтение значений столбцов из строки

Zend_Db_Table_Row_Abstract                            -         ,
                                              .

Example #3

   1.   $bugs = new Bugs();
   2.   $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
   3.
   4.   // Вывод значения столбца bug_description
   5.   echo $row->bug_description;

Note:                        Zend_Db_Table_Row
                                        ,                           .
Zend_Db_Table_Row                                                           .
                                                      ,    ,                          .
                                                                                  Zend_Db   234

Получение данных строки в виде массива

                                   ,                    toArray()        .
                                                    .

Example #4                                   toArray()

   1. $bugs = new Bugs();
   2. $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
   3.
   4. // Получение ассоциативного массива столбцов и их значений из объекта Row
   5. $rowArray = $row->toArray();
   6.
   7. // Теперь используется как обычный массив
   8. foreach ($rowArray as $column => $value) {
   9.     echo "Column: $column\n";
   10.          echo "Value: $value\n";
   11.      }

        ,                        toArray()                                           .
                                                ,                        ,
                                                                 .

Извлечение данных из связанных таблиц

        Zend_Db_Table_Row_Abstract
                 .                                  Zend_Db_Table
                                       .

Редактирование строк в БД

Изменение значений столбцов в строке

                             ,
            , . .       ,                                            .


                    ,                                        .
save().

Example #5

   1.   $bugs = new Bugs();
   2.   $row = $bugs->fetchRow($bugs->select()->where('bug_id = ?', 1));
   3.
   4.   // Изменение значения одного или более столбцов
   5.   $row->bug_status = 'FIXED';
   6.
   7.   // Обновление строки в БД с новыми значениями
   8.   $row->save();
                                                                                        Zend_Db   235

Вставка новой строки

                                                                           createRow()
         .                                                -                         ,
                          ,                         save().

Example #6

   1.   $bugs = new Bugs();
   2.   $newRow = $bugs->createRow();
   3.
   4.   // Установка значений столбцов
   5.   $newRow->bug_description = '...description...';
   6.   $newRow->bug_status = 'NEW';
   7.
   8.   // Вставка новой строки в БД
   9. $newRow->save();

                                                              ,
                 .

Example #7

   1. $data = array(
   2.     'bug_description' => '...description...',
   3.     'bug_status'      => 'NEW'
   4. );
   5.
   6. $bugs = new Bugs();
   7. $newRow = $bugs->createRow($data);
   8.
   9. // вставка новой строки в БД
   10.      $newRow->save();

Note:                         Zend_Db_Table     createRow()           fetchNew().
                               ,            ,                     -
                                    .

Изменение значений в нескольких столбцах

Zend_Db_Table_Row_Abstract                      setFromArray()        ,
                                                        ,
                      .                                                         ,
                          .

Example #8                                setFromArray()

   1.   $bugs = new Bugs();
   2.   $newRow = $bugs->createRow();
   3.
   4.   // Данные помещаются в ассоциативный массив
   5.   $data = array(
   6.       'bug_description' => '...description...',
   7.       'bug_status'      => 'NEW'
                                                                                                 Zend_Db   236

    8. );
    9.
    10.         // Одновременная установка значений всех столбцов
    11.         $newRow->setFromArray($data);
    12.
    13.         // Добавление новой строки в БД
    14.         $newRow->save();

Удаление строки

                                   delete()             .                                          ,
                                                    .

Example #9

    1.   $bugs = new Bugs();
    2.   $row = $bugs->fetchRow('bug_id = 1');
    3.
    4.   // Удаление строки
    5.   $row->delete();

                            save()                          ,                            .

Сериализация и десериализация строк

                                                                                             .
                                                                           ,
                        (            ,         ).               Zend_Db_Table_Row_Abstract
                .

Сериализация объекта строки

                               PHP serialize()                             ,
          Row                               .

Example #10

    1.   $bugs = new Bugs();
    2.   $row = $bugs->fetchRow('bug_id = 1');
    3.
    4.   // Преобразование объекта в сериализованную форму
    5.   $serializedRow = serialize($row);
    6.
    7.   // Теперь вы можете записать $serializedRow в файл и т.д.

Десериализация данных строки

                       unserialize()                                   ,
                               .                                               .

            :                                       .                              Row                 ,
                                                                       ,
(           ,                                 ).
                                                                                             Zend_Db       237

Example #11

   1. $rowClone = unserialize($serializedRow);
   2.
   3. // Теперь вы можете использовать свойства объекта, но только для чтения
   4. echo $rowClone->bug_description;

Note:                                                        ?
                                         ,                                   ,                .
                             ,                    ,
           ,                                       ,                         .
                                                                         ,                        e-mail
                         ,                                                           .   ,
                                 ,
                                     .

Восстановление соединения для объекта строки

                                              ,              setTable().
                    Zend_Db_Table_Abstract,                          .
                            ,                                                                              .
                                                                                 .

Example #12

   1. $rowClone = unserialize($serializedRow);
   2.
   3. $bugs = new Bugs();
   4.
   5. // Привязка строки к таблице с действующим соединением БД
   6. $rowClone->setTable($bugs);
   7.
   8. // Теперь вы можете производить изменения в строке и сохранять их
   9. $rowClone->bug_status = 'FIXED';
   10.      $rowClone->save();

Расширение класса строки

Zend_Db_Table_Row                                                ,
Zend_Db_Table_Row_Abstract.
                    Zend_Db_Table_Row_Abstract.          ,
                                   ,                                             $_rowClass
                   ,                                                                   .

Example #13

   1.   class MyRow extends Zend_Db_Table_Row_Abstract
   2.   {
   3.       // ...кастомизация
   4.   }
   5.
   6.   // Укажите свой класс строки в качестве используемого по умолчанию
   7.   // во всех экземплярах класса таблицы
                                                                                               Zend_Db      238

   8. class    Products extends Zend_Db_Table_Abstract
   9. {
   10.             protected $_name = 'products';
   11.             protected $_rowClass = 'MyRow';
   12.         }
   13.
   14.         // Или укажите свой класс строки для использования
   15.         // в конкретном экземпляре класса таблицы
   16.         $bugs = new Bugs(array('rowClass' => 'MyRow'));

Инициализация строки

                                                               ,                                ,
                                    init(),                                    ,
                   .
__construct,                                                                           .

Example #14                                        init()

   1. class MyApplicationRow extends Zend_Db_Table_Row_Abstract
   2. {
   3.     protected $_role;
   4.
   5.     public function init()
   6.     {
   7.         $this->_role = new MyRoleClass();
   8.     }
   9. }

Определение собственной логики для добавления, обновления и удаления в
Zend_Db_Table_Row

                                                  _insert(), _update()     _delete()
                           INSERT, UPDATE          DELETE.
                                              .

                                                                           ,
                                    ,
         insert(), update()   delete()                                 .           ,
                                                                   .

                                ,
                       :

Example #15

                                                                                                    .

                                        .                                                               .

         ,                                                                                 Zend_Log,
                                                                       .
                                                                                 Zend_Db   239

  1. class MyLoggingRow extends Zend_Db_Table_Row_Abstract
  2. {
  3.     protected function _insert()
  4.     {
  5.         $log = Zend_Registry::get('database_log');
  6.         $log->info(Zend_Debug::dump($this->_data,
  7.                                     "INSERT: $this->_tableClass",
  8.                                     false)
  9.                   );
  10.          }
  11.      }
  12.
  13.      // $loggingEnabled - свойство, используемое для примера и зависящее
  14.      // от конфигурации вашего приложения
  15.      if ($loggingEnabled) {
  16.          $bugs = new Bugs(array('rowClass' => 'MyLoggingRow'));
  17.      } else {
  18.          $bugs = new Bugs();
  19.      }

Example #16                    ,

                                                     .

                                        .

                                                             .

  1. class MyLoggingRow extends Zend_Db_Table_Row_Abstract
  2. {
  3.     protected function _insert()
  4.     {
  5.         $log = Zend_Registry::get('database_log');
  6.         $log->info(Zend_Debug::dump($this->_data,
  7.                                      "INSERT: $this->_tableClass",
  8.                                      false)
  9.                   );
  10.          }
  11.      }
  12.
  13.      class Bugs extends Zend_Db_Table_Abstract
  14.      {
  15.          protected $_name = 'bugs';
  16.          protected $_rowClass = 'MyLoggingRow';
  17.      }
  18.
  19.      class Products extends Zend_Db_Table_Abstract
  20.      {
  21.          protected $_name = 'products';
  22.          protected $_rowClass = 'MyLoggingRow';
  23.      }

Определение инфлекции в Zend_Db_Table_Row

                                    ,
                                   ,                     .
                                                                                 Zend_Db     240

      Zend_Db                                      .
Zend_Db_Table                                                    .

                                           ,                                      ,
                    _transformColumn()
                                          .

Example #17

                                                                        .
                 _transformColumn()                      ,
"       "                         .

    1. class MyInflectedRow extends Zend_Db_Table_Row_Abstract
    2. {
    3.     protected function _transformColumn($key)
    4.     {
    5.         $nativeKey = myCustomInflector($key);
    6.         return $nativeKey;
    7.     }
    8. }
    9.
    10.      class Bugs extends Zend_Db_Table_Abstract
    11.      {
    12.          protected $_name = 'bugs';
    13.          protected $_rowClass = 'MyInflectedRow';
    14.      }
    15.
    16.      $bugs = new Bugs();
    17.      $row = $bugs->createRow();
    18.
    19.      // Используются имена столбцов в формате CamelCase, преобразующая функция
    20.      // изменяет их представление на "родное"
    21.      $row->bugDescription = 'New description';

                                                                                         .
Zend Framework                                               .
                                                                                                     Zend_Db   241


Zend_Db_Table_Rowset
Введение

                                                   ,                 find()            fetchAll(),
                              Zend_Db_Table_Rowset_Abstract.                     (rowset)
            ,               Zend_Db_Table_Row_Abstract.
                                              ,                                              .

Получение набора строк

Zend_Db_Table_Abstract                            find()   fetchAll(),
Zend_Db_Table_Rowset_Abstract.

Example #1

   1. $bugs   = new Bugs();
   2. $rowset = $bugs->fetchAll("bug_status = 'NEW'");

Получение строк из набора

                                                                ,            ,                          .
                    ,                                  .

                                                                         ,                       ,
                                    .
                .            Zend_Db_Table_Rowset_Abstract                             Countable,
                        count()                                                    .

Example #2

   1.   $rowset     = $bugs->fetchAll("bug_status = 'FIXED'");
   2.
   3.   $rowCount = count($rowset);
   4.
   5.   if ($rowCount > 0) {
   6.       echo "found $rowCount rows";
   7.   } else {
   8.       echo 'no rows matched the query';
   9.   }

Example #3


current().                                                  ,
        .

   1. $bugs   = new Bugs();
   2. $rowset = $bugs->fetchAll("bug_id = 1");
   3. $row    = $rowset->current();
                                                                                                    Zend_Db       242

                                                            ,   current()                   NULL.

Example #4 >

        ,                       Zend_Db_Table_Rowset_Abstract,                        Iterator.               ,
                                                            ,                    foreach().
        ,                               ,                          Zend_Db_Table_Row_Abstract,
                                            .

   1. $bugs = new Bugs();
   2.
   3. // извлечение всех записей из таблицы
   4. $rowset = $bugs->fetchAll();
   5.
   6. foreach ($rowset as $row) {
   7.
   8.     // выводит 'Zend_Db_Table_Row' или подобное
   9.     echo get_class($row) . "\n";
   10.
   11.          // чтение столбца в строке
   12.          $status = $row->bug_status;
   13.
   14.          // изменение столбца в текущей строке
   15.          $row->assigned_to = 'mmouse';
   16.
   17.          // сохранение изменений в БД
   18.          $row->save();
   19.      }

getRow()                                                    ,                           ,                         ,
                                            .                          getRow()
                                                .                                                         ,
                         true                                             (
            false).                                                Zend_Db_Table_Row.
                         ,                          .                        :

   1. $bugs = new Bugs();
   2.
   3. // извлечение всех строк из таблицы
   4. $rowset = $bugs->fetchAll();
   5.
   6. // извлечение девятой строки:
   7. $row9->getRow(8);
   8.
   9. // и ее применение:
   10.      $row9->assigned_to = 'mmouse';
   11.      $row9->save();

             ,                                          ,                         ,                  ,
                 Zend_Db_Table_Row

Получение набора строк в виде массива

                                                                   ,                  toArray()
    .                            ,                                          .
                                                                                                                Zend_Db   243

                                      ,                                                        ,            -
               .

Example #5                                toArray()

  1. $bugs   = new Bugs();
  2. $rowset = $bugs->fetchAll();
  3.
  4. $rowsetArray = $rowset->toArray();
  5.
  6. $rowCount = 1;
  7. foreach ($rowsetArray as $rowArray) {
  8.     echo "row #$rowCount:\n";
  9.     foreach ($rowArray as $column => $value) {
  10.               echo "\t$column => $value\n";
  11.          }
  12.          ++$rowCount;
  13.          echo "\n";
  14.      }

           ,                                   toArray()                                                           .
                                                                   ,                               ,
                            .

Сериализация и десериализация наборов строк

                       Zend_Db_Table_Rowset_Abstract                                           .
       ,                                                   -
                                     .

Example #6

                       PHP-               serialize()                          ,
                                                               .

  1.       $bugs   = new Bugs();
  2.       $rowset = $bugs->fetchAll();
  3.
  4.       // Преобразование объекта в сериализованную форму
  5.       $serializedRowset = serialize($rowset);
  6.
  7.       // Теперь вы можете записать $serializedRowset в файл и т.п.

Example #7

                                    unserialize()                                      ,
                                           .                                               .

                   :                                                               .
                                ,                                          ,
                        ,                                      (       ,                               ).

  1. $rowsetDisconnected = unserialize($serializedRowset);
  2.
                                                                                                      Zend_Db      244

   3. // Теперь вы можете использовать свойства и методы объекта, но только для чтения
   4. $row = $rowsetDisconnected->current();
   5. echo $row->bug_description;

Note:                                                                                     ?
                                              ,                                   ,                   .
                             ,                            ,
           ,                                               ,                      .
                                                                              ,                           e-mail
                         ,                                                                    .   ,
                                      ,
                                          .

                                                       ,                    setTable().
                                 Zend_Db_Table_Abstract,                              .
                                                  ,
                         .                                                                    ,
                                                      .

Example #8

   1. $rowset = unserialize($serializedRowset);
   2.
   3. $bugs = new Bugs();
   4.
   5. // Переустановка таблицы для набора строк,
   6. // заодно восстанавливается соединение с БД
   7. $rowset->setTable($bugs);
   8.
   9. $row = $rowset->current();
   10.
   11.      // Теперь можно производить изменения в строке и сохранять их
   12.      $row->bug_status = 'FIXED';
   13.      $row->save();

                                                               setTable()
               ,                                          .

Расширение класса набора строк


Zend_Db_Table_Rowset_Abstract.
$_rowsetClass                                     ,
        .

Example #9

   1.   class MyRowset extends Zend_Db_Table_Rowset_Abstract
   2.   {
   3.       // ...кастомизация
   4.   }
   5.
   6.   // Укажите свой класс набора строк в качестве используемого по умолчанию
   7.   // во всех экземплярах класса таблицы
                                                                                 Zend_Db   245

  8. class    Products extends Zend_Db_Table_Abstract
  9. {
  10.             protected $_name = 'products';
  11.             protected $_rowsetClass = 'MyRowset';
  12.         }
  13.
  14.         // Или укажите свой класс набора строк для использования
  15.         // в конкретном экземпляре класса таблицы

                   Zend_Db_Rowset                                            .         ,
                                                   ,                             .         ,
                                                                         .

Example #10

  1. class MyBugsRowset extends Zend_Db_Table_Rowset_Abstract
  2. {
  3.     /**
  4.       * Находит в текущем наборе строку с наибольшим
  5.       * значением в столбце 'updated_at'
  6.       */
  7.     public function getLatestUpdatedRow()
  8.     {
  9.          $max_updated_at = 0;
  10.               $latestRow = null;
  11.               foreach ($this as $row) {
  12.                   if ($row->updated_at > $max_updated_at) {
  13.                       $latestRow = $row;
  14.                   }
  15.               }
  16.               return $latestRow;
  17.           }
  18.       }
  19.
  20.       class Bugs extends Zend_Db_Table_Abstract
  21.       {
  22.           protected $_name = 'bugs';
  23.           protected $_rowsetClass = 'MyBugsRowset';
  24.       }
                                                                               Zend_Db      246


Связи между таблицами Zend_Db_Table
Введение

                                                 .
                                                                         ,
           .

    Zend_Db_Table_Row                                                           .

Определение связей

                                        ,                         Zend_Db_Table_Abstract,
                                    .                         ,


                                             :

  1. class Accounts extends Zend_Db_Table_Abstract
  2. {
  3.     protected $_name            = 'accounts';
  4.     protected $_dependentTables = array('Bugs');
  5. }
  6.
  7. class Products extends Zend_Db_Table_Abstract
  8. {
  9.     protected $_name            = 'products';
  10.          protected $_dependentTables = array('BugsProducts');
  11.      }
  12.
  13.      class Bugs extends Zend_Db_Table_Abstract
  14.      {
  15.          protected $_name            = 'bugs';
  16.
  17.          protected $_dependentTables = array('BugsProducts');
  18.
  19.          protected $_referenceMap    = array(
  20.              'Reporter' => array(
  21.                  'columns'           => 'reported_by',
  22.                  'refTableClass'     => 'Accounts',
  23.                  'refColumns'        => 'account_name'
  24.              ),
  25.              'Engineer' => array(
  26.                  'columns'           => 'assigned_to',
  27.                  'refTableClass'     => 'Accounts',
  28.                  'refColumns'        => 'account_name'
  29.              ),
  30.              'Verifier' => array(
  31.                  'columns'           => array('verified_by'),
  32.                  'refTableClass'     => 'Accounts',
  33.                  'refColumns'        => array('account_name')
  34.              )
  35.          );
  36.      }
  37.
  38.      class BugsProducts extends Zend_Db_Table_Abstract
                                                                                                                 Zend_Db          247

   39.         {
   40.                protected $_name = 'bugs_products';
   41.
   42.                protected $_referenceMap          = array(
   43.                    'Bug' => array(
   44.                        'columns'                 => array('bug_id'),
   45.                        'refTableClass'           => 'Bugs',
   46.                        'refColumns'              => array('bug_id')
   47.                    ),
   48.                    'Product' => array(
   49.                        'columns'                 => array('product_id'),
   50.                        'refTableClass'           => 'Products',
   51.                        'refColumns'              => array('product_id')
   52.                    )
   53.                );
   54.
   55.         }

                       Zend_Db_Table                                                                                  ,
                   $_dependentTables                                               .
                    .                               ,                      .

Note:                                       $_dependentTables,
                                                        .    .
                            .

                   $_referenceMap                                              .                                  "
        ".                              ,                                                                    ,
                                                                                               .

                                    ,                                          $_referenceMap.
                                                    .                                                .
                       ,                                               ,                                 .

                                                : 'Reporter', 'Engineer', 'Verifier',              'Product'.

                                            $_referenceMap                                                   .
                                :

   •     columns =>                                     (   /    )
                .

                                    ,                                                      .

   •     refTableClass =>                                        .                             ,                              .

                                                                                                    ,
                                                                                                    .                     ,
                                                    ,           bugs                               products,
                                        accounts.
         $_referenceMap.
                                                                                                                                                        Zend_Db        248

   •    refColumns =>                                                                 ,
                                              .

                                                      ,                                                                           .
                                  ,                                                                   'columns'
                                            'refColumns'.

                                                                              .                                         refColumns,
                                                                  ,
                  .

   •    onDelete =>                                                   ,                               ,                                                            .
          .                                                                                                                                   .
   •    onUpdate =>                                                       ,                               ,
                                                                                              .   .
                                              .

Извлечение зависимых строк

                                      Row (                   )                                                                       ,
                                          ,                                                                        .                                     :

   1. $row->findDependentRowset($table, [$rule]);

                                              Zend_Db_Table_Rowset_Abstract,
            $table,                                  ,                                                                 $row.

                       $table                                                                                                     .
                                                  ,                                                                       .

Example #1

                                                                                                                       Accounts
Bugs,                                                                                     .

   1.   $accountsTable = new Accounts();
   2.   $accountsRowset = $accountsTable->find(1234);
   3.   $user1234 = $accountsRowset->current();
   4.
   5.   $bugsReportedByUser = $user1234->findDependentRowset('Bugs');

                      $rule                                                       .                                                               $_referenceMap
                                        .                                                                      ,
        ,                                                                                     .               ,                                    ,
        ,                                                 .

                                                                              ,                                                           ,
                              .                                           'Reporter'.

Example #2
                                                                                                          Zend_Db         249

                                                                     Accounts                                 Bugs,
                                                                 .                 ,
                  - 'Engineer'.

   1.   $accountsTable = new Accounts();
   2.   $accountsRowset = $accountsTable->find(1234);
   3.   $user1234 = $accountsRowset->current();
   4.
   5.   $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');

Example #3                                                                    Zend_Db_Table_Select

                                                                                 Accounts
Bugs,                                                                 .                                  3-
                                                 .

   1.   $accountsTable = new Accounts();
   2.   $accountsRowset = $accountsTable->find(1234);
   3.   $user1234 = $accountsRowset->current();
   4.   $select = $accountsTable->select()->order('name ASC')
   5.                                     ->limit(3);
   6.
   7.   $bugsAssignedToUser = $user1234->findDependentRowset('Bugs',
   8.                                                        'Engineer',
   9.                                                        $select);

                                                    ,                                                         -
              "             ". Zend_Db_Table_Row_Abstract                                    :
findDependentRowset('<TableClass>', '<Rule>'),                                                            ,
                                             :

   •    $row->find<TableClass>()
   •    $row->find<TableClass>By<Rule>()

                   <TableClass>     <Rule>
                     ,                                                    .

Note:                                        ,           ,       Ruby on Rails,                      ,
"             " (inflection),
                .               Zend_Db_Table_Row                                                                     .

                                             .

Example #4

                                                             ,                         ,
          .
                                                     .

   1. $accountsTable = new Accounts();
   2. $accountsRowset = $accountsTable->find(1234);
   3. $user1234 = $accountsRowset->current();
   4.
                                                                                                                        Zend_Db   250

  5.   // Используется правило связи по умолчанию
  6.   $bugsReportedBy = $user1234->findBugs();
  7.
  8.   // Задается правило связи
  9.   $bugsAssignedTo = $user1234->findBugsByEngineer();

Извлечение родительской строки

                                 Row                                                        ,
                             ,                                                   .                      :

  1. $row->findParentRow($table, [$rule]);

                                                                                                                    ,
                                  Row,           Rowset.

                      $table                                                                            .
                                         ,                                                      .

Example #5

                                                               Row                   Bugs   (       ,
                  'NEW')                                   Accounts,                                            ,
              .

  1.   $bugsTable = new Bugs();
  2.   $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW'));
  3.   $bug1 = $bugsRowset->current();
  4.
  5.   $reporter = $bug1->findParentRow('Accounts');

                     $rule                                 .                                                $_referenceMap
                                   .                                    ,
       ,                                                       .       ,                                    ,
       ,                                     .

                                                                   ,                                        ,
                                                     .                      'Reporter'.

Example #6

                                                               Row                   Bugs                                    ,
                                                           .                 ,
           - 'Engineer'.

  1.   $bugsTable = new Bugs();
  2.   $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?', 'NEW'));
  3.   $bug1 = $bugsRowset->current();
  4.
  5.   $engineer = $bug1->findParentRow('Accounts', 'Engineer');
                                                                                                          Zend_Db           251

                                                                         ,             "                  ".
Zend_Db_Table_Row_Abstract                             : findParentRow('<TableClass>', '<Rule>'),
                     Row,                                                              :

    •    $row->findParent<TableClass>([Zend_Db_Table_Select $select])
    •    $row->findParent<TableClass>By<Rule>([Zend_Db_Table_Select $select])

                    <TableClass>        <Rule>     -
                                  ,                                             .

Note:
                                                                .

Example #7

                                                                ,                          ,
           .
                                           .

    1.   $bugsTable = new Bugs();
    2.   $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?', 'NEW'));
    3.   $bug1 = $bugsRowset->current();
    4.
    5.   // Используется правило связи по умолчанию
    6.   $reporter = $bug1->findParentAccounts();
    7.
    8.   // Задается правило связи
    9.   $engineer = $bug1->findParentAccountsByEngineer();

Извлечение строк через связи "многие-ко-многим"

                           Row                                                                 ,
"         - -         "(                                                                   "        "),
                                                           ("        "          )                                   .
                      :

    1. $row->findManyToManyRowset($table,
    2.                            $intersectionTable,
    3.                            [$rule1,
    4.                                [$rule2,
    5.                                     [Zend_Db_Table_Select $select]
    6.                                ]
    7.                            ]);

                                      Zend_Db_Table_Rowset_Abstract,                                           $table,
                              "        - -      ".                              $row
                                                                                                                        .

                     $table                                                                "       - -         ".
                                               ,                                               .
                                                                                                                          Zend_Db   252

                   $intersectionTable
                    "        - -         ".                                                                       ,
                      .

Example #8                                                         "       -       -           "

                                                       Row                                 Accounts
                  Products,                                        ,
              .

    1.   $bugsTable = new Bugs();
    2.   $bugsRowset = $bugsTable->find(1234);
    3.   $bug1234 = $bugsRowset->current();
    4.
    5.   $productsRowset = $bug1234->findManyToManyRowset('Products',
    6.                                                    'BugsProducts');

                                  - $rule1     $rule2 -                                    .
           $_referenceMap                                     .

$rule1                                                                                                                        .
                                        BugsProducts         Bugs.

$rule2                                                                                                                    .
                                        Bugs     Products

                                                                                                              ,
                   ,                                                       $_referenceMap,
                  .                                                    ,                                              .

                                                   ,
                       .                                  $rule1                                   'Reporter',
$rule2 - 'Product'.

Example #9                                                         "       -       -           "


                                                       Row                                 Bugs
         , Products,                                   ,                                                 .

    1.   $bugsTable = new Bugs();
    2.   $bugsRowset = $bugsTable->find(1234);
    3.   $bug1234 = $bugsRowset->current();
    4.
    5.   $productsRowset = $bug1234->findManyToManyRowset('Products',
    6.                                                    'BugsProducts',
    7.                                                    'Bug');

                                                                               "           - -           ",
"                      ". Zend_Db_Table_Row_Abstract
findManyToManyRowset('<TableClass>', '<IntersectionTableClass>', '<Rule1>', '<Rule2>'),
                           ,                                                           :
                                                                                                              Zend_Db   253

   •    $row->find<TableClass>Via<IntersectionTableClass> ([Zend_Db_Table_Select $select])
   •    $row->find<TableClass>Via<IntersectionTableClass>By<Rule1> ([Zend_Db_Table_Select $select])
   •    $row->find<TableClass>Via<IntersectionTableClass>By<Rule1>And<Rule2> ([Zend_Db_Table_Select $select])

                    <TableClass>      <IntersectionTableClass>
                                           . <Rule1> <Rule2>
               ,                                                                 ,                .

Note:
                                                              .

Example #10                                                                                      "            -   -
      "

                                                                    "        -            "           ,
           ,                                          .

   1.   $bugsTable = new Bugs();
   2.   $bugsRowset = $bugsTable->find(1234);
   3.   $bug1234 = $bugsRowset->current();
   4.
   5.   // Используется правило связи по умолчанию
   6.   $products = $bug1234->findProductsViaBugsProducts();
   7.
   8.   // Задается правило связи
   9. $products = $bug1234->findProductsViaBugsProductsByBug();

Каскадные операции записи

Note:                DRI
                                        Zend_Db_Table                                                     ,
                                                            (declarative referential integrity -    . DRI).
           ,                                              MyISAM MySQL              SQLite,
DRI,                                                                              Zend_Db_Table.
                                DRI                                   ON DELETE ON UPDATE,
                                                                                                 Zend_Db_Table.
                                  DRI                                                    ,
                            .
           ,                                                                                  Zend_Db_Table.


           UPDATE    DELETE                                         .

Example #11

                                                              Products,
                                                             Bugs.

   1. $productsTable = new Products();
   2. $productsRowset = $productsTable->find(1234);
   3. $product1234    = $productsRowset->current();
   4.
                                                                                                                                 Zend_Db       254

   5. $product1234->delete();
   6. // Автоматически выполняется каскадное
   7. // удаление зависимых строк в таблице Bugs

             ,                                UPDATE
       ,                                              ,
                             ,                                                                                 .

                                              ,                                                                ,
                                 (sequence)                                        .                                                       ,
                                                                 ,   ,                    ,
                                         .

                                                      Zend_Db_Table                                                      $_referenceMap.
                                                                             'onDelete'           'onUpdate'              'cascade' (
            self::CASCADE).                       ,
                                         ,                                                                                         ,
                                                                         .

Example #12

                                                  Bugs                                        ,                            Products,
                                  ,               .              'onDelete'
self::CASCADE.

                                                                               ,                                                       .
           'onUpdate'                                                                  self::RESTRICT.
                         ,                                self::NO_ACTION                                          'onUpdate'.

   1. class BugsProducts extends Zend_Db_Table_Abstract
   2. {
   3.     ...
   4.     protected $_referenceMap    = array(
   5.         'Product' => array(
   6.              'columns'          => array('product_id'),
   7.              'refTableClass'    => 'Products',
   8.              'refColumns'       => array('product_id'),
   9.              'onDelete'         => self::CASCADE,
   10.                   'onUpdate'         => self::RESTRICT
   11.               ),
   12.               ...
   13.          );
   14.      }

Примечания относительно каскадных операций

                             ,                    Zend_Db_Table,                                           .

                 ,
                     ,                                       ,                                Zend_Db_Table,
                                                                                                    .
                                                                                                            Zend_Db            255

                         Zend_Db_Table
                                   .

                                                                                                    .
                                                                                       ,                                   .

    ,                                                                                           ,                     ,
                                                                         .             ,
                    ,                                              ,
,                                                      ,       ,                                            .
                                                                                                        ,
                                  .


                                      .
            "             "                    ,                                            .

                        Zend_Db_Table                                        Zend_Db_Table

                                                   ,                                  Zend_Db_Table                        ,
                              save()      delete()           Row.                                                         ,
                              ,            ,                                                ,
        .                                                  update()    delete()            Zend_Db_Adapter,
                ,                                           Zend_Db_Table,                     .

                                           INSERT.

                                               INSERT.
                                                                                  .
                                                                                                     Zend_Debug            256


Zend_Debug
Дамп переменных
                     Zend_Debug::dump()                                                               .
                                          ,                                                                   ,
                      -                                           ,
      .

Example #1                                    dump()

   1. Zend_Debug::dump($var, $label=null, $echo=true);

          $var                                                ,
Zend_Debug::dump().

          $label (         )                  ,
Zend_Debug::dump().                                                                                    -           ,
                                                                             .

                  $echo         ,                                                   Zend_Debug::dump()                 .
                 TRUE,                            .                                              ,
                                              .

                                    ,         Zend_Debug::dump()
          PHP » var_dump().                                              -              ,             var_dump()
                                        » htmlspecialchars()                       (X)HTML            <pre>.

Tip

Отладка с применением Zend_Log

Zend_Debug::dump()                                                                           .
                                                      .

                                                                      Zend_Log
                                  .               ,                                                        DEBUG
             Zend_Log_Writer_Stream                       ,                      Zend_Debug::dump().
                                                                                                                                      Zend_Dom                257


Zend_Dom
Введение
                     Zend_Dom                                                                                                          DOM.
                                                                     Zend_Dom_Query,
                                        DOM                                                    XPath       CSS.

Zend_Dom_Query
Zend_Dom_Query                                                                                             XML    (X)HTML
                 XPath CSS.                                                    ,
                  MVC,                                                                                              ,
                                                                 (                 , XHTML-           ,                               ).

                             CSS                                                                                        -
                                                          XML-                       .                                                       ,
                                                                                                            Javascript,
                                                         CSS (                               » $$()       Prototype » dojo.query           Dojo
                                                                        ).

Теория работы

            ,                                   Zend_Dom_Query,                                                   Zend_Dom_Query,
                                                            ,                                                               ,                     .
                            ,                                                      query()       queryXpath().
                           Zend_Dom_Query_Result,                                                                                 .

                                                   Zend_Dom_Query                                            DOMDocument + DOMXPath
                                                                                     CSS.
       ,                                :

   •                            :                                             : 'div', 'a', 'span', 'h2' . .
   •                                :                                        class               : '.error', 'div.error', 'label.required'       . .
                                                                                  ,                                                               ,
                                                                                                .
   •       id-              :                        ID-                                : '#content', 'div#nav' . .
   •                                        :                                                   .                                                     :
                 o                                   :                                                                          .
                      'div[bar="baz"]'                                                        div                   "bar",
                                "baz".
                 o                         :                                             ,                                                        .
                               'div[bar~="baz"]'                                                            div                 "bar",
                                       "baz".                        '<div bar="foo baz">'                                                                ,
                      '<div bar="foo bazbat">'                        .
                                                                                                                Zend_Dom         258

              o                                     :                                .           'div[bar*="baz"]'
                                                   div                 "bar",
                       "baz".
     •                                         :               '>'                                                         .
          'div > span'                                                 'span',                                          'div'.
                                                                                 ,                          .
     •                                :                                                                             ,
                                                     . 'div .foo span #one'
          'one',                                                                 'span',
                                                              'foo',
                         'div'.           ,                                                                'One'
                   :
1.                <div>
              2. <table>
              3.      <tr>
              4.           <td class="foo">
              5.               <div>
              6.                   Lorem ipsum <span class="bar">
              7.                       <a href="/foo/bar" id="one">One</a>
              8.                       <a href="/foo/baz" id="two">Two</a>
              9.                       <a href="/foo/bat" id="three">Three</a>
              10.                            <a href="/foo/bla" id="four">Four</a>
              11.                        </span>
              12.                    </div>
              13.                </td>
              14.            </tr>
              15.       </table>
              16.       </div>

                          ,
                                                                                                                .
Zend_Dom_Query_Result                                        Countable, Iterator,
DOMNode                           DOMElement.                                                     ,
                   HTML-          ,                      :

     1.   $dom = new Zend_Dom_Query($html);
     2.   $results = $dom->query('.foo .bar a');
     3.
     4.   $count = count($results); // получение числа соответствий: 4
     5.   foreach ($results as $result) {
     6.       // переменная $result имеет тип DOMElement
     7.   }

Zend_Dom_Query                                                       XPath                 queryXpath().
                                                 XPath
                              Zend_Dom_Query_Result.

Доступные методы

                              Zend_Dom_Query                                                                    .

Zend_Dom_Query

            Zend_Dom_Query                                             :
                                                                                                Zend_Dom      259

  •   setDocumentXml($document):                                                   HTML,
                                  .
  •   setDocumentXhtml($document):                                                     XHTML,
                                  .
  •   setDocumentHtml($document):                                                  HTML,
                                  .
  •   setDocument($document):                                                  .
      Zend_Dom_Query                                             .
  •   getDocument():                                      ,              .
  •   getDocumentType():                              ,                  .
                                 Zend_Dom_Query: DOC_XML, DOC_XHTML          DOC_HTML.
  •   query($query):                                                                             CSS.
  •   queryXpath($xPathQuery):                                                                   XPath.

Zend_Dom_Query_Result

                         , Zend_Dom_Query_Result                         Iterator        Countable,
                                      foreach                 count().             ,
                   :

  •   getCssQuery():                   -            CSS,
      (       ).
  •   getXpathQuery():                     XPath,                                                         .
      Zend_Dom_Query                                                         CSS                XPath,
                                                .
  •   getDocument():                    DOMDocument,                                        .
                                                                                           Zend_Exception     260


Zend_Exception
Использование исключений
                  ,                       Zend Framework,
Zend_Exception.

Example #1

   1. try {
   2.     Zend_Loader::loadClass('nonexistantclass');
   3. } catch (Zend_Exception $e) {
   4.     echo "Caught exception: " . get_class($e) . "\n";
   5.     echo "Message: " . $e->getMessage() . "\n";
   6.     // other code to recover from the failure.
   7. }

                                      ,                                          ,       ,
                        ,       ,                                           Zend_Exception,
                                                  Zend Framework.

Basic usage
Zend_Exception is the base class for all exceptions thrown by Zend Framework. This class extends the base
Exception class of PHP.

Example #1 Catch all Zend Framework exceptions

   1. try {
   2.     // your code
   3. } catch (Zend_Exception $e) {
   4.     // do something
   5. }

Example #2 Catch exceptions thrown by a specific component of Zend Framework

   1. try {
   2.     // your code
   3. } catch (Zend_Db_Exception $e) {
   4.     // do something
   5. }




Previous Exceptions
Since Zend Framework 1.10, Zend_Exception implements the PHP 5.3 support for previous exceptions. Simply
put, when in a catch() block, you can throw a new exception that references the original exception, which helps
provide additional context when debugging. By providing this support in Zend Framework, your code may now be
forwards compatible with PHP 5.3.
                                                                                       Zend_Exception   261

Previous exceptions are indicated as the third argument to an exception constructor.

Example #1 Previous exceptions

   1. try {
   2.     $db->query($sql);
   3. } catch (Zend_Db_Statement_Exception $e) {
   4.     if ($e->getPrevious()) {
   5.         echo '[' . get_class($e)
   6.              . '] has the previous exception of ['
   7.              . get_class($e->getPrevious())
   8.              . ']' . PHP_EOL;
   9.     } else {
   10.               echo '[' . get_class($e)
   11.                   . '] does not have a previous exception'
   12.                   . PHP_EOL;
   13.          }
   14.
   15.          echo $e;
   16.          // displays all exceptions starting by the first thrown
   17.          // exception if available.
   18.      }
                                                                                                                                     Zend_Filter               262


Zend_Filter
Введение
                  Zend_Filter                                                                                                            .
                                                                                                        ,
                                                                                                                ,                                          .

Что есть фильтр?

                                                                                                                                             .
                                                                                         .
                  ,                                                       .                                                  -                        -
                                                ,                                        . .

                                                                                                                                     .
                               -                                      -                                             HTML (HTML entities).
              ,                                                                                                      (      ,
    -             ),                                                                           HTML,
                           ,                                                                                                     .
                                                    HTML                                                             -
                .              ,                                          HTML,                     ,
(             , "&"                                   "&amp;").                                                                                       -
                       "                    "                                     Zend_Filter
                                                                      .

Основы использования фильтров

                                                              Zend_Filter_Interface,
                                                      filter().

                                                                                                                         -                           (&)
                                   (").

    1. $htmlEntities = new Zend_Filter_HtmlEntities();
    2.
    3. echo $htmlEntities->filter('&'); // &amp;
    4. echo $htmlEntities->filter('"'); // &quot;

Использование статического метода get()

                                                                                                                                     ,
                                          Zend_Filter::get(),
        .                                                                                                   ,
            filter().                                                         ,
                                                           Zend_Filter.              get()                                                       ,
                                                           filter()                             .

    1. echo Zend_Filter::get('&', 'HtmlEntities');
                                                                                                           Zend_Filter   263

                                                                         ,
                        .

   1. echo Zend_Filter::get('"', 'HtmlEntities', array(ENT_QUOTES));

                                get()                                                             .
                                                                     ,
                                                     filter(),                                             .

Zend_Filter_Input
                                   .                                                 Zend_Filter_Input.

Цепочки фильтров
                                            ,
                                        .               ,
                ,                                                                          . Zend_Filter
                    ,                                                        .
                                                             :

   1.   // Создание цепочки фильтров и добавление в нее фильтров
   2.   $filterChain = new Zend_Filter();
   3.   $filterChain->addFilter(new Zend_Filter_Alpha())
   4.               ->addFilter(new Zend_Filter_StringToLower());
   5.
   6.   // Фильтрация имени пользователя
   7.   $username = $filterChain->filter($_POST['username']);

                                                 ,                                        Zend_Filter.
                                                                                 ,
                            .

            ,                                   Zend_Filter_Interface,                                               .
                                                                       Zend_Filter   264


Написание фильтров
Zend_Filter                                                        ,
                                          .
Zend_Filter_Interface.

Zend_Filter_Interface                            filter(),
       .                 ,                           ,
              Zend_Filter::addFilter().

                                  ,                            :

   1. class MyFilter implements Zend_Filter_Interface
   2. {
   3.     public function filter($value)
   4.     {
   5.         // Выполнение преобразований над $value,
   6.         // результатом которых является $valueFiltered
   7.
   8.         return $valueFiltered;
   9.     }
   10.      }

                                                     :

   1. $filterChain = new Zend_Filter();
   2. $filterChain->addFilter(new MyFilter());
                                                                                                         Zend_Form      265


Zend_Form
Zend_Form
               Zend_Form                                                      -                 .
                    :

   •                                                    ,
   •
   •                                       ,
   •
   •

                                                    Zend Framework-                                  ,
Zend_Config, Zend_Validate, Zend_Filter, Zend_Loader_PluginLoader, ,                                , Zend_View.

Zend_Form - Быстрый старт
                                                            ,
                   Zend_Form.

Создание объекта формы

                                                                Zend_Form:

   1. $form = new Zend_Form;

                                                                                    Zend_Form,
                        ,                  Zend_Form.

                                   action      method (                                                     ),
                                                    setAction()      setMethod():

   1. $form->setAction('/resource/process')
   2.      ->setMethod('post');

                                                                action            "/resource/process"
                            - HTTP POST.
       .

                                           HTML-                         <form>,                          setAttrib()
 setAttribs().               ,                                                              ,
           "id":

   1. $form->setAttrib('id', 'login');
                                                                                                                            Zend_Form       266

Добавление элементов в форму

                                                          . Zend_Form                                                                   ,
                                                        XHTML-                                              Zend_View.
                :

  •    button (             )
  •    checkbox (                                    ,                                               multiCheckbox)
  •    hidden (                                     )
  •    image (                      )
  •    password (               )
  •    radio (                          )
  •    reset (                      )
  •    select (                                              -           ,       multi-select)
  •    submit (                                     )
  •    text (                       )
  •    textarea (                                        )

                                                                         -
                                            ,                                                    ,                  Zend_Form
                                                    .

                        :

  1.   // Инстанцирование элемента и его передача объекту формы:
  2.   $form->addElement(new Zend_Form_Element_Text('username'));
  3.
  4.   // Передача типа элемента объекту формы
  5.   $form->addElement('text', 'username');

                                                                                                      .               ,
                                                ,                    ,                 , ,            ,         .                       (a)
                                                    , (b)                                        ,
               Zend_Form,                           ( )
                    .

                                                                                                            .
        Zend_Validate_*                                                      :

  1.   $username = new Zend_Form_Element_Text('username');
  2.
  3.   // Передача объекта Zend_Validate_*:
  4.   $username->addValidator(new Zend_Validate_Alnum());
  5.
  6.   // Передача имени валидатора:
  7. $username->addValidator('alnum');

                                                                 ,                                                              ,
                                                                                   :

  1. // Передача шаблона
  2. $username->addValidator('regex', false, array('/^[a-z]/i'));
                                                                                                              Zend_Form              267

(                                                             ,                                   ,
                  ,                                                                           ;                        false.)

                                                                                          .
                          ,                                                                           .                      :

    1. // Указание того, что элемент обязателен для заполнения:
    2. $username->setRequired(true);

                                                  ,
'NotEmpty',                         ,                                     .

                                                          ,                   .
                                                      :

    1. $username->addFilter('StringToLower');

              ,                                                                       ,               :

    1. $username->addValidator('alnum')
    2.          ->addValidator('regex', false, array('/^[a-z]/'))
    3.          ->setRequired(true)
    4.          ->addFilter('StringToLower');
    5.
    6. // или в более компактной форме:
    7. $username->addValidators(array('alnum',
    8.         array('regex', false, '/^[a-z]/i')
    9.     ))
    10.          ->setRequired(true)
    11.          ->addFilters(array('StringToLower'));



              .                         (b)                                   .                                    ,
          Zend_Form::addElement()                                     ,
                      .                                                                                   .                      ,
                                              ,                                   :

    1. $form->addElement('text', 'username', array(
    2.     'validators' => array(
    3.         'alnum',
    4.         array('regex', false, '/^[a-z]/i')
    5.     ),
    6.     'required' => true,
    7.     'filters' => array('StringToLower'),
    8. ));

Note:                         ,                                   ,                                                          ,
                                  Zend_Form_Element                                                                      ;
                                                              .
                                                                                                                    Zend_Form       268

Визуализация формы

                                                        .                                                           Zend_View
                                                                                                                .
                              :                                     render()                                            echo.

   1.   // Явный вызов render() с передачей объекта вида:
   2.   echo $form->render($view);
   3.
   4.   // Предполагается, что объект вида уже был установлен ранее через setView():
   5.   echo $form;

                  Zend_Form                                                                     ,
ViewRenderer,               ,
                  MVC Zend Framework- .                                                                                   :

   1. <?php echo $this->form ?>

                Zend_Form                  "                    "                                           .
                                                            ,                                                       ,
                          .
                      .                    Zend_Form_Element
                  ;                                                                    :

   1. $element->addDecorators(array(
   2.     'ViewHelper',
   3.     'Errors',
   4.     array('HtmlTag', array('tag' => 'dd')),
   5.     array('Label', array('tag' => 'dt')),
   6. ));

                                                                :

   1. <dt><label for="username" class="required">Username</dt>
   2. <dd>
   3.     <input type="text" name="username" value="123-abc" />
   4.     <ul class="errors">
   5.         <li>'123-abc' has not only alphabetic and digit characters</li>
   6.         <li>'123-abc' does not match against pattern '/^[a-z]/i'</li>
   7.     </ul>
   8. </dd>

                                                    ,                                       ,
        ;                                                                                           .


                                      <form>.                             action           method
                  <form>          -    ,                                       ,
setAttribs().

                                                ,                                                       ,
                          order,                                                   .                                            ,
            :
                                                                                                                     Zend_Form   269

    1. $element->setOrder(10);

                                                                         :

    1. $form->addElement('text', 'username', array('order' => 10));

Проверка корректности данных формы

            ,                                        ,                                           ,                               .
                                                                                                         ,
                    .                                    ,                                                       ,
                                                               null.

                                ?                            $_POST, $_GET,
(           ,                       -       ):

    1. if ($form->isValid($_POST)) {
    2.     // успех
    3. } else {
    4.     // неудача
    5. }



AJAX-               .               isValidPartial()                                                                     .
                isValid()                        ,                                                   -               ,
                                                                                             :

    1. if ($form->isValidPartial($_POST)) {
    2.     // все предоставленные элементы прошли все проверки на корректность
    3. } else {
    4.     // один или более элементов не прошли проверку на корректность
    5. }

                                                                                 processAjax().
isValidPartial(),                                                                            JSON,
                                .

                                                                                     ,
                                :

    1. $values = $form->getValues();

        ,                                                      ,                 :

    1. $unfiltered = $form->getUnfilteredValues();

Получение статуса ошибки

                            ,                                                            ?                   ,
                        ,                                                    ,
                :
                                                                                                 Zend_Form            270

   1. if (!$form->isValid($_POST)) {
   2.     echo $form;
   3.
   4.     // или присвойте ее объекту вида и произведите его рендеринг...
   5.     $this->view->form = $form;
   6.     return $this->render('form');
   7. }

                                  ,                                   . getErrors()
                                                    (                                                            ).
getMessages()                                                                                        (
                                                                      '                    '/'
       ').                                ,                               .

Объединяя изложенное

                                                .                                                        :

   •   username
   •   password
   •   submit

                              ,                                                                              -
                  ,                   ,                   6                       20             ,                ,
                                                              .
             6        .                                                       ,
                          .

                                              Zend_Form                                :

   1. $form = new Zend_Form();
   2. $form->setAction('/user/login')
   3.      ->setMethod('post');
   4.
   5. // Создание и конфигурирование элемента username
   6. $username = $form->createElement('text', 'username');
   7. $username->addValidator('alnum')
   8.          ->addValidator('regex', false, array('/^[a-z]+/'))
   9.          ->addValidator('stringLength', false, array(6, 20))
   10.               ->setRequired(true)
   11.               ->addFilter('StringToLower');
   12.
   13.      // Создание и конфигурирование элемента password
   14.      $password = $form->createElement('password', 'password');
   15.      $password->addValidator('StringLength', false, array(6))
   16.               ->setRequired(true);
   17.
   18.      // Добавление элементов в форму:
   19.      $form->addElement($username)
   20.           ->addElement($password)
   21.           // addElement() используется в качестве "фабрики"
   22.           // для создания кнопки 'Login':
   23.           ->addElement('submit', 'login', array('label' => 'Login'));

                                                                  :
                                                                                                 Zend_Form      271

      1. class UserController extends Zend_Controller_Action
      2. {
      3.     public function getForm()
      4.     {
      5.         // здесь должен быть код для создания формы, приведенный выше
      6.         return $form;
      7.     }
      8.
      9.     public function indexAction()
      10.          {
      11.              // рендеринг user/form.phtml
      12.              $this->view->form = $this->getForm();
      13.              $this->render('form');
      14.          }
      15.
      16.          public function loginAction()
      17.          {
      18.              if (!$this->getRequest()->isPost()) {
      19.                  return $this->_forward('index');
      20.              }
      21.              $form = $this->getForm();
      22.              if (!$form->isValid($_POST)) {
      23.                  // проверка на корректность не пройдена, выводим форму снова
      24.                  $this->form = $form;
      25.                  return $this->render('form');
      26.              }
      27.
      28.              $values = $form->getValues();
      29.              // аутентификация...
      30.          }
      31.      }

...                                       :

      1. <h2>Please login:</h2>
      2. <?= $this->form ?>

                                  ,                                          -
                                                             (           ,         Zend_Auth).

Использование объекта Zend_Config

          Zend_Form                                  ,                  Zend_Config.
Zend_Config                           ,                          setConfig().               ,
                         ,                    INI.       -           ,
                              ,                                              ,
'development'.     -      ,                                                      ('user')          ('login'):

      1.   [development]
      2.   ; общие метаданные для формы
      3.   user.login.action = "/user/login"
      4.   user.login.method = "post"
      5.
      6.   ; элемент username
      7.   user.login.elements.username.type = "text"
      8.   user.login.elements.username.options.validators.alnum.validator = "alnum"
      9.   user.login.elements.username.options.validators.regex.validator = "regex"
                                                                                      Zend_Form      272

      10.           user.login.elements.username.options.validators.regex.options.pattern = "/^[a-
            z]/i"
      11.       user.login.elements.username.options.validators.strlen.validator =
          "StringLength"
      12.       user.login.elements.username.options.validators.strlen.options.min = "6"
      13.       user.login.elements.username.options.validators.strlen.options.max = "20"
      14.       user.login.elements.username.options.required = true
      15.       user.login.elements.username.options.filters.lower.filter = "StringToLower"
      16.
      17.       ; элемент password
      18.       user.login.elements.password.type = "password"
      19.       user.login.elements.password.options.validators.strlen.validator =
          "StringLength"
      20.       user.login.elements.password.options.validators.strlen.options.min = "6"
      21.       user.login.elements.password.options.required = true
      22.
      23.       ; элемент кнопки
      24.       user.login.elements.submit.type = "submit"

                                                     :

      1. $config = new Zend_Config_Ini($configFile, 'development');
      2. $form   = new Zend_Form($config->user->login);

...                                  .

Заключение

              ,
                        Zend_Form.                                                          .
                                                                                                                Zend_Http    273


Zend_Http
Zend_Http_Client - Введение
Введение

Zend_Http_Client                                                                  HTTP-            . Zend_Http_Client
                                                                     ,                          HTTP-       ,
                      ,       ,    HTTP-                                               .
            (                                                  )                       Zend_Http_Response,
                                                           (       . Zend_Http_Response).

                                                     URL (                                              Zend_Uri_Http)
                                              .
          setUri()        setConfig().

Example #1                                        Zend_Http_Client

    1. <?php
    2.     require_once 'Zend/Http/Client.php';
    3.
    4.     $client = new Zend_Http_Client('http://example.org', array(
    5.          'maxredirects' => 0,
    6.          'timeout'       => 30));
    7.
    8.     // Этот код делает то же самое:
    9.     $client = new Zend_Http_Client();
    10.           $client->setUri('http://example.org');
    11.           $client->setConfig(array(
    12.               'maxredirects' => 0,
    13.               'timeout'       => 30));
    14.
    15.      ?>

Параметры конфигурации

                           setConfig()                                                                             .
                                                               ,                                                         .

                                                                         Zend_Http_Client


maxredirects                        (0 =                                     integer       5
                                   )
                                                        RFC
strictredirects                                                              boolean false
                                     (     . HTTP Redirections)
useragent                                                                    string        'Zend_Http_Client'
                  (                                    )
timeout                                                                      integer       10
                                                                                                    Zend_Http          274

                                                              Zend_Http_Client

                                                                      float (1.1
httpversion                       HTTP                                           1.1
                                                                      or 1.0)
                                                        (     .
adapter                                                               mixed     'Zend_Http_Client_Adapter_Socket'
               Zend_Http_Client - Connection Adapters)
                                                 keep-alive
                       .
keepalive                         ,                                   boolean false

                      .

Выполнение базовых HTTP-запросов

                          HTTP-                                       request()                     ,
                          ,                   :

Example #2                                   GET

   1. <?php
   2.     require_once 'Zend/Http/Client.php';
   3.
   4.     $client = new Zend_Http_Client('http://example.org');
   5.     $response = $client->request();
   6. ?>

          request()                                    -                               .                            GET,
                                                                                                              [1]
POST, PUT, HEAD, DELETE, TRACE, OPTIONS           CONNECT,                                          HTTP.
http://www.w3.org/Protocols/rfc2616/rfc2616.html .
     : Zend_Http_Request::GET, Zend_Http_Request::POST . .

                                      ,                                                                 setMethod().
     setMethod()                  ,                                            GET (       .             ).

Example #3                                     ,                  GET

   1. <?php
   2.     // Выполнение запроса POST
   3.     $response = $client->request('POST');
   4.
   5.     // Еще один способ сделать то же самое:
   6.     $client->setMethod(Zend_Http_Client::POST);
   7.     $response = $client->request();
   8. ?>

Добавление параметров GET и POST

                           GET HTTP-                              ,
                                 URL                                          setParameterGet().
                            GET                                                                 .
                                                                                                   Zend_Http      275

setParameterGet()                                                            =>           ,               ,
                                           GET.

Example #4                             GET

      1. <?php
      2.     // Установка параметра GET с использованием метода setParameterGet
      3.     $client->setParameterGet('knight', 'lancelot');
      4.
      5.     // Эвивалентный код с установкой через URL:
      6.     $client->setUri('http://example.com/index.php?knight=lancelot');
      7.
      8.     // Добавление нескольких параметров в одном вызове
      9.     $client->setParameterGet(array(
      10.              'first_name' => 'Bender',
      11.              'middle_name' => 'Bending'
      12.              'made_in'     => 'Mexico',
      13.          ));
      14.      ?>

                           GET                                                    ,                POST
                                      POST.                        POST
                         GET                             setParameterPost().

Example #5                             POST

      1. <?php
      2.     // Установка параметра POST
      3.     $client->setParameterPost('language', 'fr');
      4.
      5.     // Установка нескольких параметров POST,
      6.     // один из них - с несколькими значениями
      7.     $client->setParameterPost(array(
      8.          'language' => 'es',
      9.          'country'   => 'ar',
      10.               'selection' => array(45, 32, 80)
      11.           ));
      12.      ?>

          ,                        POST,                                     POST,                        GET.
                    ,                             POST     -POST                                      ,
                               .                                     POST,                        POST
                .

Получение последних запроса и ответа

Zend_Http_Client
     ,                                    .         Zend_Http_Client->getLastRequest()
                                       HTTP-        ,                                 ,                       .
              , Zend_Http_Client->getLastResponse()                          HTTP-            ,
                       ,             Zend_Http_Response.

[1]     . RFC 2616 - .
                                                                                                           Zend_Json         276


Zend_Json
Введение
Zend_Json                                                                      PHP JSON                              JSON
    PHP.                                              JSON             »                          JSON.

JSON (JavaScript Object Notation)                                                                JavaScript
                           .                 JSON                                            JavaScript,
                                                                                   JavaScript,     XML.

Основы применения
                  Zend_Json                                                                        (public static)
        :    Zend_Json::encode()           Zend_Json::decode().

   1.   <?php
   2.   // Получение значения:
   3.   $phpNative = Zend_Json::decode($encodedValue);
   4.
   5.   // Преобразование для возвращения клиенту:
   6.   $json = Zend_Json::encode($phpNative);
   7.   ?>


Объекты JSON
                     PHP                         JSON,
             JSON.

JSON                                              ,                        ,
                                .                                  ,                            Zend_Json::encode()
Zend_Json_Encoder::encode()
             ;                                                                      ,
                 .

                                    JSON                                                    ,                   Javascript
                                                          PHP.                                                          ,
                                                                               /                     JSON;
         ,                                                                              .

                     Zend_Json                                   JSON                                  .
                            ,                         :

   1.   <?php
   2.   // Декодировать объект как объект
   3.   $phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
   4.   ?>
                                                                                                   Zend_Json      277

                 ,                                  ,                             StdClass                  ,
                                 /                      JSON.

                Zend Framework                  ,                                                  ,
                     JSON.                                                            ,
                                            ,                                 Zend_Json.


XML to JSON conversion
Zend_Json provides a convenience method for transforming XML formatted data into JSON format. This feature
was inspired from an » IBM developerWorks article.

Zend_Json includes a static function called Zend_Json::fromXml(). This function will generate JSON from a given
XML input. This function takes any arbitrary XML string as an input parameter. It also takes an optional boolean
input parameter to instruct the conversion logic to ignore or not ignore the XML attributes during the conversion
process. If this optional input parameter is not given, then the default behavior is to ignore the XML attributes.
This function call is made as shown below:

   1. // fromXml function simply takes a String containing XML contents
   2. // as input.
   3. $jsonContents = Zend_Json::fromXml($xmlStringContents, true);

Zend_Json::fromXml() function does the conversion of the XML formatted string input parameter and returns the
equivalent JSON formatted string output. In case of any XML input format error or conversion logic error, this
function will throw an exception. The conversion logic also uses recursive techniques to traverse the XML tree. It
supports recursion upto 25 levels deep. Beyond that depth, it will throw a Zend_Json_Exception. There are several
XML files with varying degree of complexity provided in the tests directory of Zend Framework. They can be
used to test the functionality of the xml2json feature.

The following is a simple example that shows both the XML input string passed to and the JSON output string
returned as a result from the Zend_Json::fromXml() function. This example used the optional function parameter
as not to ignore the XML attributes during the conversion. Hence, you can notice that the resulting JSON string
includes a representation of the XML attributes present in the XML input string.

XML input string passed to Zend_Json::fromXml() function:

   1. <?xml version="1.0" encoding="UTF-8"?>
   2. <books>
   3.     <book id="1">
   4.         <title>Code Generation in Action</title>
   5.         <author><first>Jack</first><last>Herrington</last></author>
   6.         <publisher>Manning</publisher>
   7.     </book>
   8.
   9.     <book id="2">
   10.              <title>PHP Hacks</title>
   11.              <author><first>Jack</first><last>Herrington</last></author>
   12.              <publisher>O'Reilly</publisher>
   13.          </book>
   14.
   15.          <book id="3">
   16.              <title>Podcasting Hacks</title>
   17.              <author><first>Jack</first><last>Herrington</last></author>
                                                                                                     Zend_Json   278

   18.                  <publisher>O'Reilly</publisher>
   19.             </book>
   20.         </books>

JSON output string returned from Zend_Json::fromXml() function:

   1. {
   2.      "books" : {
   3.         "book" : [ {
   4.            "@attributes" : {
   5.               "id" : "1"
   6.            },
   7.            "title" : "Code Generation in Action",
   8.            "author" : {
   9.               "first" : "Jack", "last" : "Herrington"
   10.                 },
   11.                 "publisher" : "Manning"
   12.              }, {
   13.                 "@attributes" : {
   14.                     "id" : "2"
   15.                 },
   16.                 "title" : "PHP Hacks", "author" : {
   17.                     "first" : "Jack", "last" : "Herrington"
   18.                 },
   19.                 "publisher" : "O'Reilly"
   20.              }, {
   21.                 "@attributes" : {
   22.                     "id" : "3"
   23.                 },
   24.                 "title" : "Podcasting Hacks", "author" : {
   25.                     "first" : "Jack", "last" : "Herrington"
   26.                 },
   27.                 "publisher" : "O'Reilly"
   28.              }
   29.           ]}
   30.        }

More details about this xml2json feature can be found in the original proposal itself. Take a look at the »
Zend_xml2json proposal.
                                                                                                         Zend_Layout             279


Zend_Layout
Введение
Zend_Layout                                            "                                " (Two Step View pattern),
                                                                                                ,
                                   .                                                                                 ,
Zend Framework                                                                  .

                         Zend_Layout               :

   •                                                                                               MVC Zend Framework-
           .
   •                                                                                                                     .
   •                                   ,                                            ,
       (             )                         .
   •                                       ,                                                              ;
                                                                                        .
   •                                                                        (               ),        ViewRenderer,
                                                               .
   •                                                           MVC Zend Framework- .

Zend_Layout - Быстрый старт
                                                                                Zend_Layout:       MVC         .

Скрипты макетов

                                                           .                                     Zend_View (
                           Zend_View_Interface,                            ).
                              Zend_Layout- ,
                 ,                                                                                                           .

       :

   1. <!DOCTYPE html
   2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   4. <html>
   5. <head>
   6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   7.     <title>My Site</title>
   8. </head>
   9. <body>
   10.       <?php
   11.           // извлечение содержимого ключа 'content'
   12.           // с использованием помощника макета:
   13.           echo $this->layout()->content;
   14.
   15.           // извлечение содержимого ключа 'foo'
                                                                                            Zend_Layout       280

    16.             // с использованием помощника меток заполнения:
    17.             echo $this->placeholder('Zend_Layout')->foo;
    18.
    19.             // извлечение объекта макета и получение различных переменных из него
    20.             $layout = $this->layout();
    21.             echo $layout->bar;
    22.             echo $layout->baz;
    23.         ?>
    24.         </body>
    25.         </html>

             Zend_Layout           Zend_View                   ,
                                       ,
    .                                                                ,
                              ,            <head>,            . .:

    1. <!DOCTYPE html
    2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4. <html>
    5. <head>
    6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    7.     <?= $this->headTitle() ?>
    8.     <?= $this->headScript() ?>
    9.     <?= $this->headStyle() ?>
    10.       </head>
    11.       <body>
    12.           <?= $this->render('header.phtml') ?>
    13.
    14.           <div id="nav"><?= $this->placeholder('nav') ?></div>
    15.
    16.           <div id="content"><?= $this->layout()->content ?></div>
    17.
    18.           <?= $this->render('footer.phtml') ?>
    19.       </body>
    20.       </html>

Использование Zend_Layout с MVC Zend Framework-а

Zend_Controller                                                                                           -
                                   . Zend_View                                  . Zend_Layout
                                                                         MVC.

Zend_Layout::startMvc()                         Zend_Layout
(              ).                                    -               ,
                                       ,                                                ,
                                                                                    .            ,
                                                                                ,
     layout.

                          ,                              Zend_Layout                         MVC:

    1.    <?php
    2.    // В вашем файле загрузки:
    3.    Zend_Layout::startMvc();
    4.    ?>
                                                                                                        Zend_Layout        281

startMvc()                                                         Zend_Config                             .
                                          Zend_Layout.

                                                                                                               :

   1. <?php
   2. class FooController extends Zend_Controller_Action
   3. {
   4.     public function barAction()
   5.     {
   6.          // отключение макета для данного действия
   7.          $this->_helper->layout->disableLayout();
   8.     }
   9.
   10.           public function bazAction()
   11.           {
   12.               // использование другого скрипта макета с этим действием
   13.               $this->_helper->layout->setLayout('foobaz');
   14.           };
   15.      }
   16.      ?>

                                                                                                 layout.
                                                               ,
                                .                                                            :

   1. <?php $this->layout()->setLayout('foo'); // установка другого макета ?>

                                                                               MVC               Zend_Layout,
                                    getMvcInstance():

   1. <?php
   2. // Возвращает null, если до этого не был вызван startMvc()
   3. $layout = Zend_Layout::getMvcInstance();
   4. ?>

       ,            -                             Zend_Layout-
                        :
                    ,                              'default'                           'content'.
                                                                                                    .

                            ,                                                FooController::indexAction(),

                                              NavController::menuAction(),
       'nav'                    .         ,
CommentController::fetchAction()                                         ,
                                              (                                                                       ).
                                                                                 :

   1. <body>
   2.     <!-- рендеринг /nav/menu -->
   3.     <div id="nav"><?= $this->layout()->nav ?></div>
   4.
   5.     <!-- рендеринг /foo/index + /comment/fetch -->
                                                                     Zend_Layout       282

   6.      <div id="content"><?= $this->layout()->content ?></div>
   7. </body>

                                 ,
ActionStack,
                                                   "       ".

Использование Zend_Layout как отдельной компоненты

                         Zend_Layout                                          ,
                        MVC.               ,
               :

   •                                           .
   •                                                   .

                   Zend_Layout                                                     ,
                                                       ,
                                       :

   1. <?php
   2. $layout = new Zend_Layout();
   3.
   4. // Установка пути к скриптам макета:
   5. $layout->setLayoutPath('/path/to/layouts');
   6.
   7. // установка переменных:
   8. $layout->content = $content;
   9. $layout->nav     = $nav;
   10.
   11.      // выбор другого скрипта вида:
   12.      $layout->setLayout('foo');
   13.
   14.      // рендеринг конечного макета
   15.      echo $layout->render();
   16.      ?>
                                                        Zend_Layout           283

Пример макета

                                       .           ,          ,
                           .
   .   ,   .   ,   .   ,       .




                                                       CSS.           ,
                                               ,                          ,
                                   ,               ,    .
                                           .
                                                                                                                       Zend_Layout            284


Опции конфигурирования Zend_Layout
Zend_Layout                                                                       .
                                      ,                                                       Zend_Config
startMvc(),                                                 setOptions()                                       Zend_Config
setConfig().

   •    layout:                                .
                  ,                                                           .                                        'layout',
                                          'layout.phtml'.                 - setLayout() getLayout().
   •    layoutPath:                                             .               : setLayoutPath() getLayoutPath().
   •    contentKey:                                ,                                                 (
                           MVC).                                                    'content'.      - setContentKey()
        getContentKey().
   •    mvcSuccessfulActionOnly:                                                                            MVC.
                           ,                                            true,                                                         (

        ErrorHandler).                                                  true.                  - setMvcSuccessfulActionOnly()
        getMvcSuccessfulActionOnly().
   •    view:                 ,                                           .                                          MVC
        Zend_Layout                                                                   ,                        ViewRenderer,
                                                                    .                     - setView()   getView().
   •    helperClass:                                        ,            Zend_Layout
                       MVC.                 Zend_Layout_Controller_Action_Helper_Layout.
                   - setHelperClass() getHelperClass().
   •    pluginClass:                  -          ,                             Zend_Layout
                       MVC.                 Zend_Layout_Controller_Plugin_Layout.                                                         -
        setPluginClass() getPluginClass().
   •    inflector:                ,                                                                                               ,
                                                                                             Zend_Layout.               -
        setInflector()            getInflector().

Note: helperClass         pluginClass                                      startMvc()
                                            helperClass         pluginClass                                        ,
                                           startMvc().                                                  ,
                      .

Примеры

                                                                                                                              :

   1.   <?php
   2.   $options = array(
   3.       'layout'      => 'foo',
   4.       'layoutPath' => '/path/to/layouts',
   5.       'contentKey' => 'CONTENT', // игнорируется, если не используется MVC
   6.   );
   7.   ?>

   1. <?php
                                                                                          Zend_Layout   285

   2.   /**
   3.   [layout]
   4.   layout = "foo"
   5.   layoutPath = "/path/to/layouts"
   6.   contentKey = "CONTENT"
   7.   */
   8.   $config = new Zend_Config_Ini('/path/to/layout.ini', 'layout');
   9.   ?>

Example #1                                          startMvc()

                 ,                          startMvc()
Zend_Config                                                  Zend_Layout.

                     :

   1.   <?php
   2.   // Использование конструктора:
   3.   $layout = new Zend_Layout($options);
   4.
   5.   // Использование startMvc():
   6.   $layout = Zend_Layout::startMvc($options);
   7.   ?>

                                      :

   1.   <?php
   2.   $config = new Zend_Config_Ini('/path/to/layout.ini', 'layout');
   3.
   4.   // Использование конструктора:
   5.   $layout = new Zend_Layout($config);
   6.
   7.   // Использование startMvc():
   8.   $layout = Zend_Layout::startMvc($config);
   9.   ?>

             ,                                                   Zend_Layout.

Example #2                   setOption()    setConfig()

                                           Zend_Layout           ,                             .
setOptions()     setConfig()                                          :

   1.   <?php
   2.   // Использование массива опций:
   3.   $layout->setOptions($options);
   4.
   5.   // Использование объекта Zend_Config:
   6.   $layout->setConfig($options);
   7.   ?>

                         ,                      ,      ,    pluginClass     helperClass
             ,                                                    ,
        startMvc().
                                                                                                                      Zend_Layout      286

Example #3

            ,                                                                                         .
fluent interface,              ,                                                                                      :

    1. <?php
    2. $layout->setLayout('foo')
    3.        ->setLayoutPath('/path/to/layouts')
    4.        ->setContentKey('CONTENT');
    5. ?>

Использование Zend_Layout для опытных разработчиков
                                                              Zend_Layout                                     ,
                                                             ,                                       . .

                                         :

    •                                  . Zend_Layout                                                              ,
                        Zend_View_Interface.
    •                                    -            . Zend_Layout
               -               ,                                                             ,
               .                                                  .
    •                                         . Zend_Layout
                    ,                                                                 , . .
                                             .
    •                                                                     . Zend_Layout

                                                                                                          .

Собственные объекты вида

Zend_Layout                                                         ,                                Zend_View_Interface
                        Zend_View_Abstract                                               .
                                                         /startMvc()                             ,                        setView():

    1.   <?php
    2.   $view = new My_Custom_View();
    3.   $layout->setView($view);
    4.   ?>

Note:                          Zend_View
        Zend_Layout                                                       ,               Zend_View_Interface,
                                   ,                                               Zend_View- ,         ,
                                    .                ,      Zend_Layout
                                                 .
                                                                 Zend_View,                                                       ,
                                                                              .
                           Zend_Layout                                  render()                                            ,
                                                                    ,                                                       .
                     Zend_Layout   287

                 ,
'Zend_Layout',                     :
                                                                                                            Zend_Layout      288

   1.   <?php
   2.   $placeholders = new Zend_View_Helper_Placeholder();
   3.   $layoutVars   = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
   4.   ?>

Собственные плагины фронт-контроллера

                                       MVC, Zend_Layout                                             -          ,
                                          ,                                                                    .
                                                               ,                                                   ,
                                                                               pluginClass              startMvc().

        ,                                        ,
Zend_Controller_Plugin_Abstract                                                                                        .
                                                                   .

                                          Zend_Layout_Controller_Plugin_Layout.

Собственные помощники действий

                                          MVC Zend_Layout
                      .                                       Zend_Layout_Controller_Action_Helper_Layout
                                                                                                                   .

                                                                       ,                                                     ,
                  Zend_Controller_Action_Helper_Abstract,
helperClass          startMvc().

Собственное определение пути к скрипту макета: использование инфлектора

Zend_Layout                   Zend_Filter_Inflector                                                ,
                                   .                                                    'CamelCaseToDash', 'StringToLower'
            'phtml'                                                        .        :

   •    'foo'                          'foo.phtml'.
   •    'FooBarBaz'                            'foo-bar-baz.phtml'.

                                             -                                                  /
              Zend_Layout,                                                              ,
Zend_Layout           ,
Zend_Layout::setInflector().

Example #1                                           Zend_Layout

                                                     Zend_Layout
                          ,                                                                 .

   1. <?php
   2. // Установка шаблона:
   3. $layout->setInflectorTarget('layouts/:script.:suffix');
   4.
                                                                                                                Zend_Layout       289

    5. // Установка суффикса скрипта макета:
    6. $layout->setViewSuffix('php');
    7. ?>

Example #2                                                             Zend_Layout

                                                                   .                 Zend_Layout
':script.:suffix'; ':script'                                               ,                        ':suffix'
                                                        .

                  ,                    ,                                                  'html',
                                           CamelCased
                        .                     ,                                             'layouts'.

    1. <?php
    2. $layout->getInflector()->setTarget('layouts/:script.:suffix')
    3.                        ->setStaticRule('suffix', 'html')
    4.                        ->setFilterRule(array('CamelCaseToUnderscore'));
    5. ?>

Example #3

                                                                                                         .               ,
                                   ,                                                                                          .
Zend_Layout                                   .

    1.   <?php
    2.   $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
    3.   $inflector->addRules(array(
    4.       ':script' => array('CamelCaseToUnderscore'),
    5.       'suffix' => 'html'
    6.   ));
    7.   $layout->setInflector($inflector);
    8.   ?>

Note:
                                                                                                             Zend_Layout.
                               ,                                                                                    ,
            ,                                                                         ,                              .
                               enableInflection()           disableInflection().
                                                                                                                     Zend_Loader      290


Zend_Loader
Динамическая загрузка файлов и классов
        Zend_Loader                                   ,                                                                           .

Tip

Zend_Loader vs. require_once()

         Zend_Loader                                          ,                                                               -
          ,                                       ,                                         ,                         .
                               ,                                           ,                           Zend_Loader            -
                                                                                                PHP,      ,   » require_once().

Загрузка файлов

                          Zend_Loader::loadFile()                                PHP.
      PHP.                                    PHP-                    » include().                               FALSE
              -            ,                                                .

Example #1                                                loadFile()

   1. Zend_Loader::loadFile($filename, $dirs=null, $once=false);

              $filename                                     ,                                                    .
                                              $filename. $filename                                                        -
          ,       ("-"),                          ("_")         (".").                            $dirs
                      .

              $dirs                       ,                                                                .
NULL,                                            include_path.                                                                        ,
                                                          (                    ),                include_path.

              $once                                               .                 TRUE,         Zend_Loader::loadFile()
                                   PHP-              » include_once(),                                            » include().

Загрузка классов

                          Zend_Loader::loadClass($class, $dirs)                                           PHP
                                .

Example #2                                                loadClass()

   1. Zend_Loader::loadClass('Container_Tree',
   2.     array(
   3.         '/home/production/mylib',
   4.         '/home/production/myapp'
   5.     )
                                                                                                                                Zend_Loader   291

   6. );

      ,                        ,
                                   ,                                 ,                                                '.php'.
  Windows                                          'Container\\Tree.php'.

     $dirs                                               ,      Zend_Loader::loadClass()
       ,                                             .                                                        .
              $dirs,                                         include_path.

                           ,                                                    ,            Zend_Loader::loadClass()
              Zend_Exception.

                                         Zend_Loader::loadFile(),
                   -                           ,             ('-'),                             ('_')             ('.').

Проверка на возможность чтения из файла

                       Zend_Loader::isReadable($pathname)                                            TRUE,
                                                         ,                                  FALSE.

Example #3                                                     isReadable()

   1. if (Zend_Loader::isReadable($filename)) {
   2.     // делаем что-либо с файлом $filename
   3. }

        $filename                                        .                                                                 .
                 PHP-                     » is_readable().                    Zend_Loader::isReadable()
 include_path,                         is_readable()                                .

Использование автозагрузчика

     Zend_Loader                           ,                                                                          PHP SPL.
Zend_Loader::autoload()                                                                 .                    Zend_Loader
      registerAutoload()                                                    autoload().                                     PHP
                      spl_autoload,                                   registerAutoload()
Zend_Exception.

Example #4

   1. Zend_Loader::registerAutoload();

                                                                                           Zend Framework
          .       autoload()                                                   Zend_Loader::loadClass(),
                       .

                                   Zend_Loader,                                                  registerAutoload()
                                      ,                                                             autoload().
                                                                                  Zend_Loader   292

Example #5

                                                  PHP
       loadClass()   autoload(),          autoload()                  self::loadClass().
     autoload()                                        self::loadClass()
                 ,             .

  1. class My_Loader extends Zend_Loader
  2. {
  3.     public static function loadClass($class, $dirs = null)
  4.     {
  5.         parent::loadClass($class, $dirs);
  6.     }
  7.
  8.     public static function autoload($class)
  9.     {
  10.              try {
  11.                  self::loadClass($class);
  12.                  return $class;
  13.              } catch (Exception $e) {
  14.                  return false;
  15.              }
  16.          }
  17.      }
  18.
  19.      Zend_Loader::registerAutoload('My_Loader');

                                              .     registerAutoload()
             ,                                    TRUE.                         FALSE,
                                   SPL.
                                                                                                                   Zend_Loader           293


Автозагрузчик
Zend_Loader_Autoloader                                                                                 .
                    :

   •                                                                                  (
                                                              ).
   •
                       (
        spl_autoload,                                                                                       ,
                                 ).
   •                                                                   (optimistic matching)
                                                                            .

Zend_Loader_Autoloader                                             ,                                                           .
                                                                                                                           ,
               .

Использование автозагрузчика

                                                                          ,                                     spl_autoload.
                           ,                 getInstance():

   1. $autoloader = Zend_Loader_Autoloader::getInstance();

                                                              ,                                                                "Zend_"
 "ZendX_".                                            ,                                                                            ,
                                                      ,                              registerNamespace().                        ,
                                                 "My_",                                                                    :

   1. $autoloader->registerNamespace('My_');

Note:
                   ,                                                                               "My_",          "My".           -
    ,     Zend_Loader_Autoloader                                                               ,                       ,
                                                                                          .
                                                  ,
                       .

                                                                                    ,
                           (                                  ). Zend_Loader_Autoloader
           ,                                                                  .

          ,                                                                                 eZcomponents
                               Zend Framework.            ,                                        eZcomponents
                   ,                                  ,                       pushAutoloader():

   1. $autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
                                                                                                     Zend_Loader          294

                                     ,                                      eZcomponents              ,
                    "ezc".

                                         unshiftAutoloader()
                .

               Zend_Loader_Autoloader
              ,                   Zend_Loader::loadClass().                                                       ,
         .            ,                 ,                                                        .
   ,                suppressNotFoundWarnings():

   1. $autoloader->suppressNotFoundWarnings(true);

         ,                                      ,                                                         .           ,
             PEAR                                                     ,
                             ,                                            PEAR.
setFallbackAutoloader()                     ,
                    :

   1. $autoloader->setFallbackAutoloader(true);

Итерфейс автозагрузчика

                                                                                               , Zend Framework
                       ,                                                                   -
Zend_Loader_Autoloader_Interface:

   1. interface Zend_Loader_Autoloader_Interface
   2. {
   3.     public function autoload($class);
   4. }

                                 ,                                                    Zend_Loader_Autoloader-
pushAutoloader()        unshiftAutoloader():

   1. // Предполагается, что Foo_Autoloader реализует Zend_Loader_Autoloader_Interface:
   2. $foo = new Foo_Autoloader();
   3.
   4. $autoloader->pushAutoloader($foo, 'Foo_');

Справка по автозагрузчику

                                                    ,                     Zend_Loader_Autoloader.

                                                        Zend_Loader_Autoloader-


                                                                                                              -
getInstance()                              Zend_Loader_Autoloader
                                                                                                 Zend_Loader_Autoloa
                                                                                                 der.
                                                                                        Zend_Loader               295

                                        Zend_Loader_Autoloader-




                                                                                         spl_autoload.

                                                                                                  .


                                                                                              -

                                                                                  Zend_Loader_Autoloa
                                                                                  der
resetInstance()                 void
                                                                                          ,




                                                                                                              .
                                                             •    $class,

                                                                     .
autoload($class)                string|false

                                                                            .       .



                                                             •    $callback,
setDefaultAutoloader($callbac
k)                              Zend_Loader_Autoloader
                                                                     .


                                                                                                      .




getDefaultAutoloader()          callback
                                                                                                      ;

                                                                                  Zend_Loader::loadCla
                                                                                  ss().

                                                             •    $autoloaders,
setAutoloaders(array
$autoloaders)                   Zend_Loader_Autoloader
                                                                     .

                                                                                                          .
                                                                                   Zend_Loader                    296

                                        Zend_Loader_Autoloader-




                                                                                PHP.

getAutoloaders()                Array
                                                                                                      .

                                                             •    $namespace,                     ,
getNamespaceAutoloaders($name
space)                          Array

                                                                                                              .




                                                                                                 .
                                                             •    $namespace,
                                                                                       $namespace
registerNamespace($namespace)   Zend_Loader_Autoloader                                            ,
                                                                    .

                                                                                       ;
                                                                                              ,


                                                                                       .




                                                             •    $namespace,                     .
unregisterNamespace($namespac                                                   $namespace
e)                              Zend_Loader_Autoloader
                                                                    .                  ,



                                                                                                          ;

                                                                                       ,
                                                                                  Zend_Loader                  297

                                       Zend_Loader_Autoloader-




                                                                                               .

                                                                                                           ,
getRegisteredNamespace()       Array

                                                                                                       .


                                                                                   ,

                                                                                               ,




                                                                          "                 "
                                                                          ("file not found").
                                                            •    $flag,
suppressNotFoundWarnings($fla boolean|Zend_Loader_Autol
g = null)                     oader                                 .
                                                                          null,

                                                                                       ,

                                                                                           .

                                                                                       ,




                                                                                                   (


                                                                          method chaining).
                                                            •    $flag,
                                                                                                   ,
setFallbackAutoloader($flag)   Zend_Loader_Autoloader
                                                                    .
                                                                                     Zend_Loader                 298

                                         Zend_Loader_Autoloader-

                                                                                                 ,




                                                                                         .

                                                                                                     ,


                                                                                                 ,




isFallbackAutoloader()         Boolean




                                                                                         .

                                                                                false.

                                                                                                         ,


                                                                                                     .
                                                              •    $class,
getClassAutoloaders($class)    Array
                                                                      .
                                                                                                     ,

                                                                                             (

                                                                                                             )
                                                                                                     .
                                                              •    $callback,
unshiftAutoloader($callback,
$namespace = '')               Zend_Loader_Autoloader
                                                                      .
                                                                                    Zend_Loader              299

                                      Zend_Loader_Autoloader-


                                                                     PHP
                                                           •    $namespace,
                                                                                                     .
                                                                  .
                                                                                                         ,

                                                                          ,


                                                                                (optimistic matching),

                                                                      .


                                                                                             .

                                                           •    $callback,

                                                                  .

                                                                     PHP
                                                           •    $namespace,                          .

                                                                  .                                      ,
pushAutoloader($callback,
$namespace = '')              Zend_Loader_Autoloader

                                                                          ,

                                                                                (optimistic matching),


                                                                      .

                                                                                             .
                                                           •    $callback,

                                                                  .

                                                                     PHP                             .
removeAutoloader($callback,                                •    $namespace,
$namespace = '')              Zend_Loader_Autoloader
                                                                  .           , (                )           ,
                                                  300

Zend_Loader_Autoloader-

                                      (   )   .
                          (



                              )


                                  .
                                                                                                                      Zend_Mail     301


Zend_Mail
Введение
Начало работы

Zend_Mail                                                                                                                  ,
MIME-                                                   .
Zend_Mail_Transport_Sendmail (                                                  )          Zend_Mail_Transport_Smtp.

Example #1

                                                                                               ,                    ,
                                   .                                                ,        Zend_Mail_Transport_Sendmail,
                             :

   1.   $mail = new Zend_Mail();
   2.   $mail->setBodyText('This is the text of the mail.');
   3.   $mail->setFrom('somebody@example.com', 'Some Sender');
   4.   $mail->addTo('somebody_else@example.com', 'Some Recipient');
   5.   $mail->setSubject('TestSubject');
   6.   $mail->send();

Note:
         ,                                                      Zend_Mail,
             ,                     (                ,              setFrom())                    (                /
HTML).

                                                                                             "get"                              ,
                                                .                                                         API-                 .
         ,               getRecipients()                                                                               ,
                     .

                                 Zend_Mail
                                                                        (\n).
                                                                ,                                .
                                            ,                       .

Конфигурирование транспорта, используемого по умолчанию

                         Zend_Mail                                         Zend_Mail_Transport_Sendmail.
                             PHP-                   » mail().                                    » mail()
             ,
                 .
                                       Zend_Mail,                                             send()             Zend_Mail.

Example #2                                                                              Zend_Mail_Transport_Sendmail

                                        ,                               Return-Path                  » mail().
                                                                                                     Zend_Mail       302

   1.     $tr = new Zend_Mail_Transport_Sendmail('-freturn_to_me@example.com');
   2.     Zend_Mail::setDefaultTransport($tr);
   3.
   4.     $mail = new Zend_Mail();
   5.     $mail->setBodyText('This is the text of the mail.');
   6.     $mail->setFrom('somebody@example.com', 'Some Sender');
   7.     $mail->addTo('somebody_else@example.com', 'Some Recipient');
   8.     $mail->setSubject('TestSubject');
   9.     $mail->send();

Note:
                                                                                         » mail(),         PHP
                                  (safe mode).

Отправка через SMTP
                                                                  SMTP,
send(),                                          Zend_Mail      Zend_Mail_Transport_Smtp.
                          Zend_Mail::send()                                        SMTP:

Example #1                                    SMTP

   1. $tr = new Zend_Mail_Transport_Smtp('mail.example.com');
   2. Zend_Mail::setDefaultTransport($tr);

          setDefaultTransport()               Zend_Mail_Transport_Smtp
                             .                                                                             ,
                                         Zend_Mail                           .
                                                               —                                 SMTP            »
mail(),                                             . .

Отправка нескольких сообщений за одно SMTP-соединение
                         SMTP-
                        .                                                        SMTP-                 .
                                  RSET                                   .

Example #1                                                   SMTP-

   1. // Создание транспорта
   2. $transport = new Zend_Mail_Transport_Smtp('localhost');
   3.
   4. // Цикл с отправкой сообщений
   5. for ($i = 0; $i > 5; $i++) {
   6.     $mail = new Zend_Mail();
   7.     $mail->addTo('studio@peptolab.com', 'Test');
   8.     $mail->setFrom('studio@peptolab.com', 'Test');
   9.     $mail->setSubject(
   10.              'Demonstration - Sending Multiple Mails per SMTP Connection'
   11.          );
   12.          $mail->setBodyText('...Your message here...');
   13.          $mail->send($transport);
   14.      }
                                                                                  Zend_Mail         303

                                                                       ,
                                                            send().
                              ,                                  .

Example #2

   1. // Создание транспорта
   2. $transport = new Zend_Mail_Transport_Smtp();
   3.
   4. $protocol = new Zend_Mail_Protocol_Smtp('localhost');
   5. $protocol->connect();
   6. $protocol->helo('localhost');
   7.
   8. $transport->setConnection($protocol);
   9.
   10.      // Цикл с отправкой сообщений
   11.      for ($i = 0; $i > 5; $i++) {
   12.          $mail = new Zend_Mail();
   13.          $mail->addTo('studio@peptolab.com', 'Test');
   14.          $mail->setFrom('studio@peptolab.com', 'Test');
   15.          $mail->setSubject(
   16.              'Demonstration - Sending Multiple Mails per SMTP Connection'
   17.          );
   18.          $mail->setBodyText('...Your message here...');
   19.
   20.          // Управление соединением вручную
   21.          $protocol->rset();
   22.          $mail->send($transport);
   23.      }
   24.
   25.      $protocol->quit();
   26.      $protocol->disconnect();


Использование различных транспортов
             ,                                                                    ,
                                           send()                          setDefaultTransport().
                     send()                                       ,                           :

Example #1

   1.   $mail = new Zend_Mail();
   2.   // построение сообщения...
   3.   $tr1 = new Zend_Mail_Transport_Smtp('server@example.com');
   4.   $tr2 = new Zend_Mail_Transport_Smtp('other_server@example.com');
   5.   $mail->send($tr1);
   6.   $mail->send($tr2);
   7.   $mail->send(); // опять используется транспорт по умолчанию

Note:

Zend_Mail_Transport_Interface.
                                                                                         Zend_Mail   304


Сообщение в формате HTML
                                                    HTML
        setBodyHTML()                      setBodyText().                     MIME
              text/html.                                  ,           HTML-     ,
                MIME-               multipart/alternative:

Example #1                                  HTML

   1.   $mail = new Zend_Mail();
   2.   $mail->setBodyText('My Nice Test Text');
   3.   $mail->setBodyHtml('My Nice <b>Test</b> Text');
   4.   $mail->setFrom('somebody@example.com', 'Some Sender');
   5.   $mail->addTo('somebody_else@example.com', 'Some Recipient');
   6.   $mail->setSubject('TestSubject');
   7.   $mail->send();


Вложения

addAttachment().              Zend_Mail                 ,
(application/octet-stream),                                  base64                          .

addAttachment().

Example #1

   1.   $mail = new Zend_Mail();
   2.   // Формирование сообщения...
   3.   $mail->createAttachment($someBinaryString);
   4.   $mail->createAttachment($myImage,
   5.                            'image/gif',
   6.                            Zend_Mime::DISPOSITION_INLINE,
   7.                            Zend_Mime::ENCODING_8BIT);

                                             MIME,                                       ,
                                   createAttachment()                                .
createAttachment()                 Zend_Mime_Part:

   1.   $mail = new Zend_Mail();
   2.
   3.   $at = $mail->createAttachment($myImage);
   4.   $at->type        = 'image/gif';
   5.   $at->disposition = Zend_Mime::DISPOSITION_INLINE;
   6.   $at->encoding    = Zend_Mime::ENCODING_8BIT;
   7.   $at->filename    = 'test.gif';
   8.
   9.   $mail->send();

                                                            Zend_Mime_Part
addAttachment():

   1. $mail = new Zend_Mail();
                                                                                                 Zend_Mail       305

   2.
   3. $at = new Zend_Mime_Part($myImage);
   4. $at->type        = 'image/gif';
   5. $at->disposition = Zend_Mime::DISPOSITION_INLINE;
   6. $at->encoding    = Zend_Mime::ENCODING_8BIT;
   7. $at->filename    = 'test.gif';
   8.
   9. $mail->addAttachment($at);
   10.
   11.      $mail->send();


Добавление получателей
                                                    :

   •    addTo():                                                                  "To"
   •    addCc():                                                       "Cc"
   •    addBcc():                                   ,

getRecipients()                               . clearRecipients()                   .

Note:
addTo()   addCc()                                               ,
           .                                                                  ,
           .

Контроль за разделителями MIME
  multipart-                      MIME
                              .                                                              ,
                        .                     ,                     setMimeBoundary(),
                    :

Example #1                             MIME

   1. $mail = new Zend_Mail();
   2. $mail->setMimeBoundary('=_' . md5(microtime(1) . $someId++));
   3. // формирование сообщения...


Дополнительные заголовки
                                                                                                  addHeader().
                                   ,                                                     .
                                  ,                                                                :

Example #1

   1.   $mail = new Zend_Mail();
   2.   $mail->addHeader('X-MailGenerator', 'MyCoolApplication');
   3.   $mail->addHeader('X-greetingsTo', 'Mom', true); // Несколько
   4.   $mail->addHeader('X-greetingsTo', 'Dad', true);
                                                                                                                    Zend_Mail        306

                                   Reply-To                                   setReplyTo($email, $name=null),
                                                                          (e-mail      ).

Наборы символов
Zend_Mail                                                                                                       .
                                                                                 Zend_Mail.                               iso-
8859-1.                                                                                                                          ,
                                          .
                       .

Note:
                                                                                                 .

Кодировка
                                        HTML                                                                   quoted-printable,
                                    base64                 setHeaderEncoding().
            base64,                                                                                        addAttachment()
                                                             MIME.                7Bit    8Bit
                                                       .

                               ,                     (subject)             -                         . Zend_Mime
                                                                       quoted-printable                                          RFC-
2045.                      ,        iconv_mime_encode            mb_encode_mimeheader
                                               .                                                                      ,
                 ,                                                                                          76             .
                                                                                                            base64,
                           :

   1.   // По умолчанию используется Zend_Mime::ENCODING_QUOTEDPRINTABLE
   2.   $mail = new Zend_Mail('UTF-8');
   3.
   4.   // Переключение на base64
   5.   $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);

Zend_Mail_Transport_Smtp                               ,                                               ,
                       SMTP.

SMTP-аутентификация
Zend_Mail                                          SMTP-                     ,
                       'auth'                                                       Zend_Mail_Transport_Smtp.
                                                              - PLAIN, LOGIN      CRAM-MD5,
                      'username'        'password'                                   .

Example #1                                                 Zend_Mail_Transport_Smtp

   1. $config = array('auth' => 'login',
                                                                                                   Zend_Mail     307

   2.                 'username' => 'myusername',
   3.                 'password' => 'password');
   4.
   5. $transport = new Zend_Mail_Transport_Smtp('mail.server.com', $config);
   6.
   7. $mail = new Zend_Mail();
   8. $mail->setBodyText('This is the text of the mail.');
   9. $mail->setFrom('sender@test.com', 'Some Sender');
   10.      $mail->addTo('recipient@test.com', 'Some Recipient');
   11.      $mail->setSubject('TestSubject');
   12.      $mail->send($transport);

Note:
                                                        ,                                      .           ,
    ,                  CRAM-MD5,                       'auth' => 'crammd5'
Zend_Mail_Transport_Smtp.

Securing SMTP Transport
Zend_Mail also supports the use of either TLS or SSL to secure a SMTP connection. This can be enabled be
passing the 'ssl' parameter to the configuration array in the Zend_Mail_Transport_Smtp constructor with a value of
either 'ssl' or 'tls'. A port can optionally be supplied, otherwise it defaults to 25 for TLS or 465 for SSL.

Example #1 Enabling a secure connection within Zend_Mail_Transport_Smtp

   1. $config = array('ssl' => 'tls',
   2.                 'port' => 25); // Optional port number supplied
   3.
   4. $transport = new Zend_Mail_Transport_Smtp('mail.server.com', $config);
   5.
   6. $mail = new Zend_Mail();
   7. $mail->setBodyText('This is the text of the mail.');
   8. $mail->setFrom('sender@test.com', 'Some Sender');
   9. $mail->addTo('recipient@test.com', 'Some Recipient');
   10.      $mail->setSubject('TestSubject');
   11.      $mail->send($transport);
                                                                                                           Zend_Navigation                        308


Zend_Navigation
Введение
Zend_Navigation                                                                  -                          .                                 ,
                                               ,"                   " (breadcrumbs),                                              ,
                                                    ,                          .

Страницы и контейнеры

                                Zend_Navigation:

Страницы

          (Zend_Navigation_Page) Zend_Navigation                                                                                      ,
                           -       .                                 ,
        ,        ,            ,                         - label (            ), title (                     )       . .

                                                                                   .

Контейнеры

             (Zend_Navigation_Container) Zend_Navigation                               -                                              .
                               ,            ,                                .
                 » SPL RecursiveIterator Countable,                  ,                                               SPL-
              ,       ,    RecursiveIteratorIterator.

                                                                                               .

Note: Zend_Navigation_Page             Zend_Navigation_Container,                          ,
                       .

Разделение данных (модели) и отображения (вида)

                             Zend_Navigation                                                                                  .
                                                                                           .                    ,
                         ,                                                                             ,                  ,               ,
     CSS,            ,         lastmod   (                               )       priority          (            )
       . .


         .
                                                                                                                         Zend_Navigation                    309


Страницы
Zend_Navigation                                             :

      •                MVC,                            Zend_Navigation_Page_Mvc
      •                URI,                           Zend_Navigation_Page_Uri

              MVC                                      -
               MVC (action, controller, module, route, params).                                    URI
                          uri,
                                                             .

Общие функциональные возможности страниц

                                         Zend_Navigation_Page,
                                                       .

                                                                             set.                                        ,                       order
                         setOrder(),     reset_params       -          setResetParams().
                                          ,
          .

                                                     Zend_Navigation_Page
                 .




                                                                                                           ,                      ,"                "
label         String                          NULL
                                                                "     ".
                                                                                           ,
id            String | int                    NULL                                                                           ,
                                                                                                   id                                    .
                                                                       CSS,
class         String                          NULL                                                                   ,
                                                                           .
                                                                                                                 ,
title         String                          NULL
                                                                                                                                 title                  .
                                                                                                                                     ,
target        String                          NULL
                                                                                               .
                                                                                   "                                             "               (forward
                                                                relations)                               , . .
                                                                                       ,                                                                .
rel           Array                           array()
                                                                                                                                                        -
                                                                               ,                                                             ,
                                                                                                           Zend_Navigation                         310




                                                                    .                                                 -
                                                              'alternate' =>
                                                   'format/plain.html'.
                                                                                                                               -
                                                                                                                          .
                                                                                                                  .

                                                                rel             rev
                                                            .
                                                                       "                         "         (reverse relations)
                                                                    , . .                                      ,
rev         Array                        array()
                                                                                                      ,               .
                                                                                  ,         rel.
                                                                                  ,
                                                                                          Zend_Form.
                                                                                                                                               ,
                                                                        ,                                             ,
                                                                                                              ,
order       String | int | NULL          NULL                       order                    -                                         ,
                                                                    , -100.                                               ,
                                                                                                                          int.
                                                                                      NULL
                                                                ,
                                                              .
            String |                                        ACL,
resource    Zend_Acl_Resource_Interface | NULL                .
            NULL                                                                                     ACL                                       .
                                                                                ACL,
privilege   String | NULL                NULL                           .
                                                                                                     ACL                                       .

                                                                                      .                                       FALSE
active      bool                         FALSE                              ,                        MVC

                                                   $page->isActive().


                                         TRUE
                                                                                                                                           .
visible     bool

                                                        .
                                                                                                                                   .
                                                                                             Zend_Config,
pages       Array | Zend_Config | NULL   NULL                                                  ,
                                                                                                  ,
                                                                            Zend_Navigation_Page.
                                                                                           Zend_Navigation       311




                                                                                Zend_Navigation_Page
                                                                                           .

Note:

"              "           __set($name, $value), __get($name), __isset($name)   __unset($name).
                                                                                           ,
          $page->toArray().                        ,
                   /                                   ,                          ,
           .
                           ,                                                                      $page-
>set($name, $value)                                        $page->get($name),
"              "       .

Example #1

                               ,                                                      .

    1.   $page = new Zend_Navigation_Page_Mvc();
    2.   $page->foo = 'bar';
    3.   $page->meaning = 42;
    4.
    5.   echo $page->foo;
    6.
    7.   if ($page->meaning != 42) {
    8.       // должны быть какие-либо действия
    9.   }

Zend_Navigation_Page_Mvc

MVC pages are defined using MVC parameters known from the Zend_Controller component. An MVC page will
use Zend_Controller_Action_Helper_Url internally in the getHref() method to generate hrefs, and the isActive()
method will intersect the Zend_Controller_Request_Abstract params with the page's params to determine if the
page is active.

                                    MVC page options
    Key      Type Default                             Description
action       String NULL Action name to use when generating href to the page.
controller   String NULL Controller name to use when generating href to the page.
module       String NULL Module name to use when generating href to the page.
params       Array array() User params to use when generating href to the page.
route        String NULL Route name to use when generating href to the page.
reset_params bool TRUE     Whether user params should be reset when generating href to the page.
                                                                                             Zend_Navigation    312

Note: The three examples below assume a default MVC setup with the default route in place.
The URI returned is relative to the baseUrl in Zend_Controller_Front. In the examples, the baseUrl is '/' for
simplicity.

Example #2 getHref() generates the page URI

This example show that MVC pages use Zend_Controller_Action_Helper_Url internally to generate URIs when
calling $page->getHref().

   1. // getHref() returns /
   2. $page = new Zend_Navigation_Page_Mvc(array(
   3.     'action'     => 'index',
   4.     'controller' => 'index'
   5. ));
   6.
   7. // getHref() returns /blog/post/view
   8. $page = new Zend_Navigation_Page_Mvc(array(
   9.     'action'     => 'view',
   10.          'controller' => 'post',
   11.          'module'     => 'blog'
   12.      ));
   13.
   14.      // getHref() returns /blog/post/view/id/1337
   15.      $page = new Zend_Navigation_Page_Mvc(array(
   16.          'action'     => 'view',
   17.          'controller' => 'post',
   18.          'module'     => 'blog',
   19.          'params'     => array('id' => 1337)
   20.      ));

Example #3 isActive() determines if page is active

This example show that MVC pages determine whether they are active by using the params found in the request
object.

   1. /*
   2. * Dispatched request:
   3. * - module:     default
   4. * - controller: index
   5. * - action:     index
   6. */
   7. $page1 = new Zend_Navigation_Page_Mvc(array(
   8.     'action'      => 'index',
   9.     'controller' => 'index'
   10.      ));
   11.
   12.      $page2 = new Zend_Navigation_Page_Mvc(array(
   13.          'action'      => 'bar',
   14.          'controller' => 'index'
   15.      ));
   16.
   17.      $page1->isActive(); // returns true
   18.      $page2->isActive(); // returns false
   19.
   20.      /*
   21.      * Dispatched request:
   22.      * - module:      blog
                                                                                              Zend_Navigation       313

   23.         * - controller: post
   24.         * - action:     view
   25.         * - id:         1337
   26.         */
   27.         $page = new Zend_Navigation_Page_Mvc(array(
   28.             'action'     => 'view',
   29.             'controller' => 'post',
   30.             'module'     => 'blog'
   31.         ));
   32.
   33.         // returns true, because request has the same module, controller and action
   34.         $page->isActive();
   35.
   36.         /*
   37.         * Dispatched request:
   38.         * - module:     blog
   39.         * - controller: post
   40.         * - action:     view
   41.         */
   42.         $page = new Zend_Navigation_Page_Mvc(array(
   43.             'action'     => 'view',
   44.             'controller' => 'post',
   45.             'module'     => 'blog',
   46.             'params'     => array('id' => null)
   47.         ));
   48.
   49.         // returns false, because page requires the id param to be set in the request
   50.         $page->isActive(); // returns false

Example #4 Using routes

Routes can be used with MVC pages. If a page has a route, this route will be used in getHref() to generate the URL
for the page.

Note: Note that when using the route property in a page, you should also specify the default params that the route
defines (module, controller, action, etc.), otherwise the isActive() method will not be able to determine if the page
is active. The reason for this is that there is currently no way to get the default params from a
Zend_Controller_Router_Route_Interface object, nor to retrieve the current route from a
Zend_Controller_Router_Interface object.

   1. // the following route is added to the ZF router
   2. Zend_Controller_Front::getInstance()->getRouter()->addRoute(
   3.     'article_view', // route name
   4.     new Zend_Controller_Router_Route(
   5.          'a/:id',
   6.          array(
   7.              'module'     => 'news',
   8.              'controller' => 'article',
   9.              'action'     => 'view',
   10.                   'id'         => null
   11.                )
   12.           )
   13.      );
   14.
   15.      // a page is created with a 'route' option
   16.      $page = new Zend_Navigation_Page_Mvc(array(
   17.           'label'      => 'A news article',
   18.           'route'      => 'article_view',
                                                                                             Zend_Navigation          314

   19.               'module'       =>   'news',      //   required for isActive(), see note above
   20.               'controller'   =>   'article',   //   required for isActive(), see note above
   21.               'action'       =>   'view',      //   required for isActive(), see note above
   22.               'params'       =>   array('id'   =>   42)
   23.         ));
   24.
   25.         // returns: /a/42
   26.         $page->getHref();

Zend_Navigation_Page_Uri

Pages of type Zend_Navigation_Page_Uri can be used to link to pages on other domains or sites, or to implement
custom logic for the page. URI pages are simple; in addition to the common page options, a URI page takes only
one option — uri. The uri will be returned when calling $page->getHref(), and may be a String or NULL.

Note: Zend_Navigation_Page_Uri will not try to determine whether it should be active when calling $page-
                                                                                 you have to manually call
>isActive(). It merely returns what currently is set, so to make a URI page active
$page->setActive() or specifying active as a page option when constructing.


                   URI page options
Key Type Default                Description
uri String NULL  URI to page. This can be any string or NULL.

Creating custom page types

When extending Zend_Navigation_Page, there is usually no need to override the constructor or the methods
setOptions() or setConfig(). The page constructor takes a single parameter, an Array or a Zend_Config object,
which is passed to setOptions() or setConfig() respectively. Those methods will in turn call set() method, which
will map options to native or custom properties. If the option internal_id is given, the method will first look for
a method named setInternalId(), and pass the option to this method if it exists. If the method does not exist, the
option will be set as a custom property of the page, and be accessible via $internalId = $page->internal_id;
or $internalId = $page->get('internal_id');.

Example #5 The most simple custom page

The only thing a custom page class needs to implement is the getHref() method.

   1. class My_Simple_Page extends Zend_Navigation_Page
   2. {
   3.     public function getHref()
   4.     {
   5.         return 'something-completely-different';
   6.     }
   7. }

Example #6 A custom page with properties

When adding properties to an extended page, there is no need to override/modify setOptions() or setConfig().

   1. class My_Navigation_Page extends Zend_Navigation_Page
   2. {
   3.     private $_foo;
                                                                                                Zend_Navigation           315

   4.       private $_fooBar;
   5.
   6.       public function setFoo($foo)
   7.       {
   8.           $this->_foo = $foo;
   9.       }
   10.
   11.              public function getFoo()
   12.              {
   13.                  return $this->_foo;
   14.              }
   15.
   16.              public function setFooBar($fooBar)
   17.              {
   18.                  $this->_fooBar = $fooBar;
   19.              }
   20.
   21.              public function getFooBar()
   22.              {
   23.                  return $this->_fooBar;
   24.              }
   25.
   26.              public function getHref()
   27.              {
   28.                  return $this->foo . '/' . $this->fooBar;
   29.              }
   30.         }
   31.
   32.         // can now construct using
   33.         $page = new My_Navigation_Page(array(
   34.             'label'   => 'Property names are mapped to setters',
   35.             'foo'     => 'bar',
   36.             'foo_bar' => 'baz'
   37.         ));
   38.
   39.         // ...or
   40.         $page = Zend_Navigation_Page::factory(array(
   41.             'type'    => 'My_Navigation_Page',
   42.             'label'   => 'Property names are mapped to setters',
   43.             'foo'     => 'bar',
   44.             'foo_bar' => 'baz'
   45.         ));

Creating pages using the page factory

All pages (also custom classes), can be created using the page factory, Zend_Navigation_Page::factory(). The
factory can take an array with options, or a Zend_Config object. Each key in the array/config corresponds to a
page option, as seen in the section on Pages. If the option uri is given and no MVC options are given (action,
controller, module, route), an URI page will be created. If any of the MVC options are given, an MVC page
will be created.

If type is given, the factory will assume the value to be the name of the class that should be created. If the value is
mvc or uri and MVC/URI page will be created.

Example #7 Creating an MVC page using the page factory

   1. $page = Zend_Navigation_Page::factory(array(
                                                                                              Zend_Navigation   316

   2.     'label' => 'My MVC page',
   3.     'action' => 'index'
   4. ));
   5.
   6. $page = Zend_Navigation_Page::factory(array(
   7.     'label'       => 'Search blog',
   8.     'action'      => 'index',
   9.     'controller' => 'search',
   10.          'module'      => 'blog'
   11.      ));
   12.
   13.      $page = Zend_Navigation_Page::factory(array(
   14.          'label'       => 'Home',
   15.          'action'      => 'index',
   16.          'controller' => 'index',
   17.          'module'      => 'index',
   18.          'route'       => 'home'
   19.      ));
   20.
   21.      $page = Zend_Navigation_Page::factory(array(
   22.          'type'    => 'mvc',
   23.          'label' => 'My MVC page'
   24.      ));

Example #8 Creating a URI page using the page factory

   1. $page = Zend_Navigation_Page::factory(array(
   2.     'label' => 'My URI page',
   3.     'uri'   => 'http://www.example.com/'
   4. ));
   5.
   6. $page = Zend_Navigation_Page::factory(array(
   7.     'label' => 'Search',
   8.     'uri'    => 'http://www.example.com/search',
   9.     'active' => true
   10.      ));
   11.
   12.      $page = Zend_Navigation_Page::factory(array(
   13.          'label' => 'My URI page',
   14.          'uri'   => '#'
   15.      ));
   16.
   17.      $page = Zend_Navigation_Page::factory(array(
   18.          'type'   => 'uri',
   19.          'label' => 'My URI page'
   20.      ));

Example #9 Creating a custom page type using the page factory

To create a custom page type using the factory, use the option type to specify a class name to instantiate.

   1. class My_Navigation_Page extends Zend_Navigation_Page
   2. {
   3.     protected $_fooBar = 'ok';
   4.
   5.     public function setFooBar($fooBar)
   6.     {
   7.         $this->_fooBar = $fooBar;
   8.     }
                                                      Zend_Navigation   317

9. }
10.
11.    $page = Zend_Navigation_Page::factory(array(
12.        'type'    => 'My_Navigation_Page',
13.        'label'   => 'My custom page',
14.        'foo_bar' => 'foo bar'
15.    ));
                                                                                                  Zend_Paginator       318


Zend_Paginator
Введение
Zend_Paginator -
                               .

                     ,                                                     :

   •                                                                 ,

   •                                       ,
   •

   •                                 Zend_Paginator                                    Zend Framework-        ,
                                                                                             Zend_View, Zend_Db
       . .

Использование
Разбиение наборов данных на страницы

                                               Zend_Paginator
      .                                                                                            .           Zend
Framework                                                 :

                                                          Zend_Paginator

Array                         PHP-
DbSelect                         Zend_Db_Select,
                                 Zend_Db_Table_Select,
DbTableSelect Zend_Db_Table_Rowset_Abstract.
                         ,   ,         ,             .
Iterator                         » Iterator
                            Zend_Paginator                                         .
Null
                                                                               .

Note:                                  ,                                       ,              DbSelect and
DbTableSelect                                         ,
        .

                 .
             .           .   setRowCount()            DbSelect                                                     .

                                     Zend_Paginator                                                     :
                                                                                                 Zend_Paginator       319

   1. $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));

                                                                    factory()                             ,
                    Zend Framework:

   1. $paginator = Zend_Paginator::factory($array);

Note:                                        Null
                                     .

               ,                                                                                 ,
                                                     ,                                  ,
                     :

   1. $paginator->setCurrentPageNumber($page);

                                                                                                URL.
                                                          Zend_Controller_Router_Interface                        ,
                                                .

                                         ,                                                             INI:

   1.   routes.example.route = articles/:articleName/:page
   2.   routes.example.defaults.controller = articles
   3.   routes.example.defaults.action = view
   4.   routes.example.defaults.page = 1
   5.   routes.example.reqs.articleName = \w+
   6.   routes.example.reqs.page = \d+

                              MVC-                  Zend Framework- ,
                                :

   1. $paginator->setCurrentPageNumber($this->_getParam('page'));

                          ,                                             .

                                              Zend_Paginator                    .                      Zend_View
                         ViewRenderer,                                              :

   1. $this->view->paginator = $paginator;

Адаптеры DbSelect и DbTableSelect

                                                                    ,
                                                                                            .

                                 DbSelect     DbTableSelect
        .                                                                                                     .
                                                                            ,
                              getItems().
                                                                                                 Zend_Paginator   320

                                                               ,                       .
                                                                             COUNT-                  ,
                                                    .                  ,
                                ,                                  ,
               count(),                                            .

                                                                                   ,
                                        .
                                                                                                 .
                                                              COUNT-           .             ,
                                                          ,
           ,                        :

  1. $adapter = new Zend_Paginator_Adapter_DbSelect($db->select()->from('posts'));
  2. $adapter->setRowCount(
  3.     $db->select()
  4.        ->from(
  5.             'item_counts',
  6.             array(
  7.                Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN => 'post_count'
  8.             )
  9.          )
  10.      );
  11.
  12.      $paginator = new Zend_Paginator($adapter);



                                            .
                                                                                       .

Рендеринг страниц через скрипты видов

                                    (                                      Zend_Paginator)
                                                .

        Zend_Paginator         SPL-                 » IteratorAggregate,
                                 .

  1. <html>
  2. <body>
  3. <h1>Example</h1>
  4. <?php if (count($this->paginator)): ?>
  5. <ul>
  6. <?php foreach ($this->paginator as $item): ?>
  7.   <li><?php echo $item; ?></li>
  8. <?php endforeach; ?>
  9. </ul>
  10.       <?php endif; ?>
  11.
  12.       <?php echo $this->paginationControl($this->paginator,
  13.                                           'Sliding',
  14.                                           'my_pagination_control.phtml'); ?>
  15.       </body>
  16.       </html>
                                                                                                                                                         Zend_Paginator               321

                                 ,                                                                       . PaginationControl
Zend_Paginator,                                            ,                                                                                 .

                                                                             .
                                                                         ,                                                               .                                ,
                                                                                                                                                 :
      .    ,             .   ,   .            ,        .




                                      ,                                                                       "next"                                 ?                        ,
                                                                     .                                                                                               (
                     ,               , Yahoo!)                                                                                                           "next"
                                                                 .
                                                  ,                                                                        (    "                            "       ),
                 Google.

Zend Framework                                                                                   :

                                                                                                     Zend_Paginator


                                                                         .
All                                                                                                                    .                                                          ,
                                                                                                               .
                                                               Google,
Elastic
                                                                                     ,                                                                           .
                                                                                         ,
Jumping
                                                                                                     .
                                                               Yahoo!,
Sliding                                                                          ,                                 .
                                          .


                     ,                                                                                             (           $this).                       ,
                                                                                         URL
                 .

                                                                                             ,                                                           ,
                                                      PaginationControl:

      1.       Zend_Paginator::setDefaultScrollingStyle('Sliding');
      2.       Zend_View_Helper_PaginationControl::setDefaultViewPartial(
      3.           'my_pagination_control.phtml'
      4.       );
      5.       $paginator->setView($view);

                                                                ,
                                                               echo:
                                                                               Zend_Paginator    322

   1. <?php echo $this->paginator; ?>

Note:         ,                  Zend_Paginator                        .            ,   Smarty
                            :

   1. $smarty->assign('pages', $paginator->getPages());

                                                            ,              :

   1. {$pages->pageCount}

Примеры постраничной навигации

        ,                                         Zend_Paginator:

                                          :

   1. <!--
   2. См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=searchpagination
   3. -->
   4.
   5. <?php if ($this->pageCount): ?>
   6. <div class="paginationControl">
   7. <!-- Ссылка на предыдущую страницу -->
   8. <?php if (isset($this->previous)): ?>
   9.   <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
   10.          &lt; Previous
   11.        </a> |
   12.      <?php else: ?>
   13.        <span class="disabled">&lt; Previous</span> |
   14.      <?php endif; ?>
   15.
   16.      <!-- Нумерованные ссылки на страницы -->
   17.      <?php foreach ($this->pagesInRange as $page): ?>
   18.        <?php if ($page != $this->current): ?>
   19.          <a href="<?php echo $this->url(array('page' => $page)); ?>">
   20.               <?php echo $page; ?>
   21.          </a> |
   22.        <?php else: ?>
   23.          <?php echo $page; ?> |
   24.        <?php endif; ?>
   25.      <?php endforeach; ?>
   26.
   27.      <!-- Ссылка на следующую страницу -->
   28.      <?php if (isset($this->next)): ?>
   29.        <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
   30.          Next &gt;
   31.        </a>
   32.      <?php else: ?>
   33.        <span class="disabled">Next &gt;</span>
   34.      <?php endif; ?>
   35.      </div>
   36.      <?php endif; ?>

                                  :

   1. <!--
                                                                        Zend_Paginator   323

2. См. http://developer.yahoo.com/ypatterns/pattern.php?pattern=itempagination
3. -->
4.
5. <?php if ($this->pageCount): ?>
6. <div class="paginationControl">
7. <?php echo $this->firstItemNumber; ?> - <?php echo $this->lastItemNumber; ?>
8. of <?php echo $this->totalItemCount; ?>
9.
10.      <!-- Ссылка на первую страницу -->
11.      <?php if (isset($this->previous)): ?>
12.        <a href="<?php echo $this->url(array('page' => $this->first)); ?>">
13.          First
14.        </a> |
15.      <?php else: ?>
16.        <span class="disabled">First</span> |
17.      <?php endif; ?>
18.
19.      <!-- Ссылка на предыдущую страницу -->
20.      <?php if (isset($this->previous)): ?>
21.        <a href="<?php echo $this->url(array('page' => $this->previous)); ?>">
22.          &lt; Previous
23.        </a> |
24.      <?php else: ?>
25.        <span class="disabled">&lt; Previous</span> |
26.      <?php endif; ?>
27.
28.      <!-- Ссылка на следующую страницу -->
29.      <?php if (isset($this->next)): ?>
30.        <a href="<?php echo $this->url(array('page' => $this->next)); ?>">
31.          Next &gt;
32.        </a> |
33.      <?php else: ?>
34.        <span class="disabled">Next &gt;</span> |
35.      <?php endif; ?>
36.
37.      <!-- Ссылка на последнюю страницу -->
38.      <?php if (isset($this->next)): ?>
39.        <a href="<?php echo $this->url(array('page' => $this->last)); ?>">
40.          Last
41.        </a>
42.      <?php else: ?>
43.        <span class="disabled">Last</span>
44.      <?php endif; ?>
45.
46.      </div>
47.      <?php endif; ?>

                                          :

1. <?php if ($this->pageCount): ?>
2. <select id="paginationControl" size="1">
3. <?php foreach ($this->pagesInRange as $page): ?>
4.   <?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
5.   <option value="<?php
6.         echo $this->url(array('page' => $page));?>"<?php echo $selected ?>>
7.     <?php echo $page; ?>
8.   </option>
9. <?php endforeach; ?>
10.      </select>
11.      <?php endif; ?>
                                                                                               Zend_Paginator       324

   12.
   13.         <script type="text/javascript"
   14.              src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js">
   15.         </script>
   16.         <script type="text/javascript">
   17.         $('paginationControl').observe('change', function() {
   18.             window.location = this.options[this.selectedIndex].value;
   19.         })
   20.         </script>

Список свойств

                                                                                       :

                                   ,

first            integer                          ( . . 1)
firstItemNumber integer
firstPageInRange integer                      ,
current          integer
currentItemCount integer
itemCountPerPage integer
last             integer
lastItemNumber integer
lastPageInRange integer                               ,
next             integer
pageCount        integer
pagesInRange     array                 ,
previous         integer
totalItemCount   integer

Конфигурация
Zend_Paginator                                            :

                                                              Zend_Paginator

setCurrentPageNumber                                                  (                        1).
                                                                                                                (
setItemCountPerPage
                                           10).

                               (                               10).            ,
setPageRange
                                                  ,
                                                                               (           ,         Elastic)
setView                                                                            .
                                                                                                       Zend_Paginator         325


Расширенное использование
Создание собственных адаптеров к источникам данных

                                                                    ,                 Zend Framework-
                             .                                                          .

                                               Zend_Paginator_Adapter_Interface.                                          :

    •   count()
    •   getItems($offset, $itemCountPerPage)

                ,                                 ,
                                                            .                          -                  .

               -                SPL-                      » Countable,
        count(). Zend_Paginator                                                                               .           ,
        Zend_Paginator                            countAllItems()
          count().

        getItems()                         .
                                                                .
                        :

    1. return array_slice($this->_array, $offset, $itemCountPerPage);

                                 ,                                  Zend Framework (
Zend_Paginator_Adapter_Interface),                                               ,
      .

Создание своих стилей прокрутки

                                                                        Zend_Paginator_ScrollingStyle_Interface,
                                               , getPages():

    1. public function getPages(Zend_Paginator $paginator, $pageRange = null);

                                                                                                   "              "
( . .               ,                                                   ).

                                                                                  (
Zend_Paginator_ScrollingStyle_Elastic),                                                    -                          :

    1. return $paginator->getPagesInRange($lowerBound, $upperBound);

                                                      .                                        -

            .
                                                                                     Zend_Paginator       326

         ,                                         ,                 Zend_Paginator- ,
                                        .                    :

   1. $prefix = 'My_Paginator_ScrollingStyle';
   2. $path   = 'My/Paginator/ScrollingStyle/';
   3. Zend_Paginator::addScrollingStylePrefixPath($prefix, $path);

Возможности кэширования

                 Zend_Paginator- ,                                      ,
                         ,                   .                                           setCache()
             Zend_Cache_Core.

   1.   $paginator = Zend_Paginator::factory($someData);
   2.   $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
   3.   $bO = array('cache_dir'=>'/tmp');
   4.   $cache = Zend_cache::factory('Core', 'File', $fO, $bO);
   5.   Zend_Paginator::setCache($cache);

             ,      Zend_Paginator               Zend_Cache_Core,                                     .
                                                                               ,
                 Zend_Cache_Core.                                    setCacheEnable().

   1.   $paginator = Zend_Paginator::factory($someData);
   2.   // $cache является экземпляром
   3.   Zend_Paginator::setCache($cache);
   4.   // ... ниже в коде
   5.   $paginator->setCacheEnable(false);
   6.   // теперь кэширование отключено

           ,                                           ,
     .                                       .
clearPageItemCache($pageNumber).                                                         ,
                .                                                ,                           :

   1. $paginator = Zend_Paginator::factory($someData);
   2. Zend_Paginator::setCache($cache);
   3. $items = $paginator->getCurrentItems();
   4. // теперь страница 1 в кэше
   5. $page3Items = $paginator->getItemsByPage(3);
   6. // теперь и страница 3 в кэше
   7.
   8. // очищение кэша результатов для страницы 3
   9. $paginator->clearPageItemCache(3);
   10.
   11.      // очищение всего кэша
   12.      $paginator->clearPageItemCache();

                                                                             ,
                                    :

   1.   $paginator = Zend_Paginator::factory($someData);
   2.   Zend_Paginator::setCache($cache);
   3.   // извлечение некоторых элементов
   4.   $items = $paginator->getCurrentItems();
                                                                                          Zend_Paginator   327

   5.
   6. // весь кэш будет очищен:
   7. $paginator->setItemCountPerPage(2);

                                                                .
getPageItemCache():

   1.   $paginator = Zend_Paginator::factory($someData);
   2.   $paginator->setItemCountPerPage(3);
   3.   Zend_Paginator::setCache($cache);
   4.
   5.   // извлечение некоторых элементов
   6.   $items = $paginator->getCurrentItems();
   7.   $otherItems = $paginator->getItemsPerPage(4);
   8.
   9.   // просмотр сохраненных в кэше элементов в виде двухмерного массива:
   10.        var_dump($paginator->getPageItemCache());

Интерфейс Zend_Paginator_AdapterAggregate


         ,                                                                                  ,
                                           ,                                          .
                                   "   -       "               "        -            ",
Zend_Paginator_Adapter_Abstract.
Zend_Paginator_AdapterAggregate,
IteratorAggregate              SPL.

   1. interface Zend_Paginator_AdapterAggregate
   2. {
   3.     /**
   4.      * Возвращайте из этого метода полностью сконфигурированный адаптер.
   5.      *
   6.      * @return Zend_Paginator_Adapter_Abstract
   7.      */
   8.     public function getPaginatorAdapter();
   9. }

                ,
Zend_Paginator_Adapter_Abstract.                     Zend_Paginator::factory
Zend_Paginator                                     Zend_Paginator_AdapterAggregate
                .
                                                                                             Zend_Registry   328


Zend_Registry
Использование реестра
                                                                                         .
                                                                               .
                                                            .

                                -                                           Zend_Registry.
                            ,                               ,                  ,
             ArrayObject.

Установка значений в реестре

       ,                                    ,                                 set().

Example #1                                  set()

  1. <?php
  2.
  3. Zend_Registry::set('index', $value);
  4.
  5. ?>

                                        ,                               .                               ,
                                                        ,                                      set().

                                                                ,                    .

Получение значений из реестра

       ,                            ,                                       get().

Example #2                                  get()

  1. <?php
  2.
  3. $value = Zend_Registry::get('index');
  4.
  5. ?>

      getInstance()                                                 .

                                                    .

Example #3

  1. <?php
  2.
  3. $registry = Zend_Registry::getInstance();
                                                                                         Zend_Registry   329

  4.
  5. foreach ($registry as $index => $value) {
  6.     echo "Registry index $index contains:\n";
  7.     var_dump($value);
  8. }
  9.
  10.      ?>

Создание объекта реестра

                                                                    ,
                                                            .

                 ,                                                      ,
             .                                , . .
                                      .

                                      new                                   .
                                  ,                    .

Example #4

  1. <?php
  2.
  3. $registry = new Zend_Registry(array('index' => $value));
  4.
  5. ?>

                                                                                         ArrayObject,
                                          ,                             setInstance().

Example #5

  1.   <?php
  2.
  3.   $registry = new Zend_Registry(array('index' => $value));
  4.
  5.   Zend_Registry::setInstance($registry);
  6.
  7.   ?>

       setInstance()                          Zend_Exception,
                                                    .

Доступ к реестру как к массиву

                                                                ,
                              .

Example #6

  1. <?php
  2.
                                                                                 Zend_Registry       330

   3.   $registry = Zend_Registry::getInstance();
   4.
   5.   $registry['index'] = $value;
   6.
   7.   var_dump( $registry['index'] );
   8.
   9.   ?>

Доступ к реестру как к объекту

                                   ,               ,                                             .
                                                           ,       ArrayObject::ARRAY_AS_PROPS,
                                          .                          ,
                               .                               ,         ,
        PHP              ,                             .

Example #7

   1. <?php
   2.
   3. // в загрузочном коде:
   4. $registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
   5. Zend_Registry::setInstance($registry);
   6. $registry->tree = 'apple';
   7.
   8. .
   9. .
   10.      .
   11.
   12.      // в различных функциях и где-либо еще в приложении:
   13.      $registry = Zend_Registry::getInstance();
   14.
   15.      echo $registry->tree; // выводит "apple"
   16.
   17.      $registry->index = $value;
   18.
   19.      var_dump($registry->index);
   20.
   21.      ?>

Проверка существования индекса

                  ,                                                          ,
isRegistered().

Example #8                                    isRegistered()

   1. <?php
   2.
   3. if (Zend_Registry::isRegistered($index)) {
   4.     $value = Zend_Registry::get($index);
   5. }
   6.
   7. ?>
                                                                                                   Zend_Registry   331

            ,                                                          ,                            isset(),
                             .

Example #9                                          isset()

   1. <?php
   2.
   3. $registry = Zend_Registry::getInstance();
   4.
   5. // используется синтаксис доступа к массиву
   6. if (isset($registry['index'])) {
   7.     var_dump( $registry['index'] );
   8. }
   9.
   10.      // используется синтаксис доступа к объекту (должен быть включен)
   11.      if (isset($registry->index)) {
   12.          var_dump( $registry->index );
   13.      }
   14.
   15.      ?>

Создание подклассов

                                                         Zend_Registry.
                                     ,                       ,                     Zend_Registry
                                                .                                      setClassName()
                    .                                         Zend_Registry.

Example #10

   1. <?php
   2.
   3. Zend_Registry::setClassName('My_Registry');
   4.
   5. Zend_Registry::set('index', $value);
   6.
   7. ?>

                                 ,                                             ,
        ,               ,                                         .
                    .

Уничтожение статического реестра

                                            ,                                                             .
                        _unsetInstance().

Note:
                        _unsetInstance(),
                .
                                                                                                               Zend_Search_Lucene                  332

                                                ,       ,                   ,                           setInstance()
setClassName()              ,                                                                                      .
                                                                                                .

Example #11                                                     _unsetInstance()

   1.   <?php
   2.   Zend_Registry::set('index', $value);
   3.   Zend_Registry::_unsetInstance();
   4.   // изменение класса
   5.   Zend_Registry::setClassName('My_Registry');
   6.   Zend_Registry::set('index', $value);
   7.   ?>


Zend_Search_Lucene
Обзор
Введение

Zend_Search_Lucene                                                                                                                         ,
                            PHP 5.
                    ,                                                                                              -       ,
                   PHP. Zend_Search_Lucene                                                                     :

   •                            —
   •                                       :                    ,                           ,                                          ,
                                          [1]
                                    . .
   •                                                (               :               ,       ,              )

Zend_Search_Lucene                                          Apache Lucene.                                                         .
http://lucene.apache.org/java/docs/.

Объекты документа и поля

Zend_Search_Lucene                                                                                                             .
                                ,                                       ,                                                  .

                                          Zend_Search_Lucene_Document,
Zend_Search_Lucene_Field,                                                                   .

               ,                                                                                    .

        .

                                                                    .                   ,
                     ,                                      .                   ,                                      ,                       ,
        HTML       . .
                                                                          Zend_Search_Lucene   333

     Zend_Search_Lucene_Field
                                .

1. <?php
2. $doc = new Zend_Search_Lucene_Document();
3.
4. // Данные поля не разбиваются на лексемы,
5. // но индексируются и полностью сохраняются в индексе.
6. // Сохраненные данные поля могут быть получены из индекса.
7. $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype',
8.                                                  'autogenerated'));
9.
10.      // Данные поля не разбиваются на лексемы и не индексируются,
11.      // но полностью сохраняются в индексе.
12.      $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
13.                                                          time()));
14.
15.      // Бинарное поле, данные которого не разбиваются на лексемы и не индексируются,
16.      // но сохраняются в индексе.
17.      $doc->addField(Zend_Search_Lucene_Field::Binary('icon',
18.                                                       $iconData));
19.
20.      // Данные поля разбиваются на лексемы, индексируются
21.      // и полностью сохраняются в индексе.
22.      $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
23.                                                    'Document annotation text'));
24.
25.      // Данные поля разбиваются на лексемы и индексируются,
26.      // но не сохраняются в индексе.
27.      $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
28.                                                         'My document content'));
29.
30.      ?>

                    (               Zend_Search_Lucene_Field::Binary())
       $encoding.                                                 .

                                           ,                                 .

1.   <?php
2.   $doc = new Zend_Search_Lucene_Document();
3.   $doc->addField(Zend_Search_Lucene_Field::Text('title', $title, 'iso-8859-1'));
4.   $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents, 'utf-8'));
5.   ?>

                        ,                           .         :

1.   <?php
2.   setlocale(LC_ALL, 'de_DE.iso-8859-1');
3.   ...
4.   $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents));
5.   ?>

                                                         UTF-8.                   UTF-8
                            .
                                                                                                                         Zend_Search_Lucene      334

                        (   .        )                                                                                  .
                                                                                                            'ASCII//TRANSLIT'.
       ,                                                                                        .

                                                 .

Java Lucene                                                                    "contents". Zend_Search_Lucene
                                             ,                                              .                                    .
           .

Значение типов полей

   •            Keyword                                                                 ,                            ,
                                         ,                                                                  .
                                                                       .
           Keyword Zend_Search_Lucene.
   •                 UnIndexed                                             ,                                                                 .
           timestamp,                        ,                                                                                               —
                                 ,                                     UnIndexed.
   •            Binary                                                                              ,
                                 .                                                                                           ,
                                     —               ,             ,           .
   •            Text                 ,                                                                       .
                                                     ,                              —                                            ,
                                                           .
   •            UnStored                                                                    ,                                            .
                                                                   ,                                    .
                 ,                                                             ,                                                     ,
                      ,                                    UnStored.               UnStored                      ,
           Zend_Search_Lucene                                                        .
                                                         UnStored                                                        ,
                                             .

                                                     Zend_Search_Lucene_Field

           Keyword
           UnIndexed
           Binary
           Text
           UnStored

HTML-документы

Zend_Search_Lucene                                                                  HTML.
                  HTML-                                        .

   1. <?php
   2. $doc = Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
   3. $index->addDocument($doc);
                                                                                                            Zend_Search_Lucene       335

      4.       ...
      5.       $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
      6.       $index->addDocument($doc);
      7.       ?>

     Zend_Search_Lucene_Document_Html                                          DOMDocument::loadHTML()
DOMDocument::loadHTMLFile()                                            HTML-            ,               HTML
                                                                   XHTML.                                ,
                 ,                     "meta http-equiv"             .

           Zend_Search_Lucene_Document_Html                                     ,                                    -       .

       'title'                                       /html/head/title.                                      ,
                                                 .

        'body'                                           .                                              ,
       .

                loadHTML()       loadHTMLFile()              Zend_Search_Lucene_Document_Html
                                   .                           true,
                                             .
                         ,                               .

           -                                                                        .
                 'name',                    -                 'content',                                                 ,
                                                  , ,                      ,                                                     -
           -                 ,                     (keywords).

                                                                                            .

      1.<?php
      2.$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
      3.$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
      4.                                                   time()));
      5.$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
      6.                                                   time()));
      7.$doc->addField(Zend_Search_Lucene_Field::Text('annotation',
      8.                                              'Document annotation text'));
      9.$index->addDocument($doc);
      10.     ?>

                                                                                                ,
       Zend_Search_Lucene_Document_Html::getLinks()
Zend_Search_Lucene_Document_Html::getHeaderLinks():

      1.       <?php
      2.       $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
      3.       $linksArray = $doc->getLinks();
      4.       $headerLinksArray = $doc->getHeaderLinks();
      5.       ?>

[1]
                                                                                        ,           ,
                     .
Zend_Search_Lucene   336
                                                                                    Zend_Search_Lucene   337


Индексация
Создание нового индекса

                                                                        Zend_Search_Lucene     Java
Lucene.                                           .

                                PHP                   ,                         ,
           Zend_Search_Lucene                 .

   1. <?php
   2. // Создание индекса
   3. $index = Zend_Search_Lucene::create('/data/my-index');
   4.
   5. $doc = new Zend_Search_Lucene_Document();
   6.
   7. // Сохранение URL документа для того, чтобы идентифицировать его
   8. // в результатах поиска
   9. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
   10.
   11.      // Индексирование содержимого документа
   12.      $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
   13.
   14.      // Добавление документа в индекс
   15.      $index->addDocument($doc);
   16.      ?>

                                                                    .

Обновление индекса
                                                                            .
             ,                  create()                  open():

   1.   <?php
   2.   // Открытие существующего индекса
   3.   $index = Zend_Search_Lucene::open('/data/my-index');
   4.
   5.  $doc = new Zend_Search_Lucene_Document();
   6.  // Сохраниение URL документа для того, чтобы идентифицировать его в результатах
       поиска.
   7. $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
   8. // Индексация содержимого документа.
   9. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
   10.
   11.       // Добавление документа в индекс.
   12.       $index->addDocument($doc);
   13.       ?>

Обновление документов

                       Lucene                                           .
                                    .
                                                                                                   Zend_Search_Lucene       338

        Zend_Search_Lucene::delete()                                                                                  .
                                               ("       ")               'id':

   1.   <?php
   2.   $removePath = ...;
   3.   $hits = $index->find('path:' . $removePath);
   4.   foreach ($hits as $hit) {
   5.       $index->delete($hit->id);
   6.   }
   7.   ?>

Получение размера индекса

  Zend_Search_Lucene                                                       .

        Zend_Search_Lucene::maxDoc()                             ,                             ,
                               .                                                                      ,
                 .                           - Zend_Search_Lucene::count().

Zend_Search_Lucene::numDocs()                                                                                 .

   1.   <?php
   2.   $indexSize = $index->count();
   3.   $documents = $index->numDocs();
   4.   ?>

        Zend_Search_Lucene::isDeleted($id)                                                                ,
        .

   1.   <?php
   2.   for ($count = 0; $count < $index->maxDoc(); $count++) {
   3.       if ($index->isDeleted($count)) {
   4.           echo "Document #$id is deleted.\n";
   5.       }
   6.   }
   7.   ?>



                                   .

Оптимизация индекса

            Lucene                     .                                                                          .

                             Lucene                                                   .
                            .                        .                                    (»
http://lucene.apache.org/java/docs/fileformats.html).
                  .

                                                             ,                                                          .
                                                                               .
             .                                      ,
                                                                     (             'segments').
                                      Zend_Search_Lucene   339


Zend_Search_Lucene::optimize().   .
                                                                                                            Zend_Search_Lucene              340

   1.   <?php
   2.   // Открытие существующего индекса
   3.   $index = Zend_Search_Lucene::open('/data/my-index');
   4.
   5.   // Оптимизация индекса
   6.   $index->optimize();
   7.   ?>

                                                                                                                                        .

                                                                                ,
                                   .
                               ,                                                                        . .

Опция автоматической оптимизации MaxBufferedDocs

MaxBufferedDocs                                                                     ,                            ,
                                                                    .

MaxBufferedDocs                                                                          $index->getMaxBufferedDocs()
$index->setMaxBufferedDocs($maxBufferedDocs)                                    .

                                           10.

Опция автоматической оптимизации MaxMergeDocs

MaxMergeDocs
                           addDocument().                               ( . .                 ,   10.000)
                                                 ,
                                       .
                       .

MaxMergeDocs                                                                            $index->getMaxMergeDocs()         $index-
>setMaxMergeDocs($maxMergeDocs)                             .

                                           PHP_INT_MAX.

Опция автоматической оптимизации MergeFactor

MergeFactor                ,                                                                           addDocument().
       ,                                                ,                                                      ,
                                                                ,                                              .
         ,                                                                          ,                                          ,
                                                                                                   .                  ,
             (> 10)                                                                       ,             (< 10) —                    ,
                                             .

MergeFactor                                                                                             ,
                                            .
                               ,                                                    .
        "failed to open stream: Too many open files".                                                                                       .
                                                                                                                     Zend_Search_Lucene                     341

MergeFactor                                                                                $index->getMergeFactor()                 $index-
>setMergeFactor($mergeFactor)                                    .

                                                   10.

Lucene Java       Luke (Lucene Index Toolbox - » http://www.getopt.org/luke/)
                         .

Ограничения

                                           .

    32-                                                                                         2   .

Поиск по индексу
Построение запросов

                                                                                 .
                                    .
                               Zend_Search_Lucene.

                                                                             :

   1.                                                                                                                                               ,

                       .                   ,                                                            ,                                               ,
                                                                         .
   2.                                                                                                            ,
                   .                                                                                        ,
                                                                         .                 ,                                                    ,
                                                                                                                                            .
                                                         ,               ,             ,                        . .,
                                               .
   3.                                                                                                                       .                       ,
              ,                        ,                                         . ,
                                                             .                                                          ,
                                                                     ,                                                  ,                               ,
                                 .
   4.                                                                                               .                           ,
                                                                                                                                    ,
                           .

                                                                                                                                        :

   1. <?php
   2. require_once('Zend/Search/Lucene.php');
   3.
   4. $index = Zend_Search_Lucene::open('/data/my_index');
   5.
                                                                                   Zend_Search_Lucene           342

   6. $index->find($query);

      Zend_Search_Lucene::find()
                                             Zend_Search_Lucene_Search_Query.

                  ,
                              .                      ,                         ,
      ,                                                                .

                                                                   ,
          ,                                . .

                                       ,             API
              .       , API
                        .

Парсинг запроса

      Zend_Search_Lucene_Search_QueryParser::parse()
                                                 .


                                                               .

                                                                                                        ,
                                   .

   1. <?php
   2. $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
   3.
   4. $pathTerm = new Zend_Search_Lucene_Index_Term('/data/doc_dir/' . $filename, 'path');
   5. $pathQuery = new Zend_Search_Lucene_Search_Query_Term($pathTerm);
   6.
   7. $query = new Zend_Search_Lucene_Search_Query_Boolean();
   8. $query->addSubquery($userQuery, true /* required */);
   9. $query->addSubquery($pathQuery, true /* required */);
   10.
   11.      $hits = $index->find($query);

      Zend_Search_Lucene_Search_QueryParser::parse()                                                        ,
                                                           .

   1. <?php
   2. $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr, 'iso-8859-5');

                       ,                                                   .


Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding():

   1. <?php
   2. Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('iso-8859-5');
                                                                                Zend_Search_Lucene   343

   3. ...
   4. $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);

Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding()
                                           (                     "              ").

Результаты поиска
                                               Zend_Search_Lucene_Search_QueryHit.
                 : $hit->document -                            , $hit->score -   "        "
      .                               ("       "                                 ).

       Zend_Search_Lucene_Search_QueryHit
Zend_Search_Lucene_Document                         .                                 "       "
                                                :                .

   1. <?php
   2. require_once('Zend/Search/Lucene.php');
   3.
   4. $index = Zend_Search_Lucene::open('/data/my_index');
   5.
   6. $hits = $index->find($query);
   7.
   8. foreach ($hits as $hit) {
   9.     echo $hit->score;
   10.          echo $hit->title;
   11.          echo $hit->author;
   12.      }
   13.      ?>

                                                              UTF-8.

                          Zend_Search_Lucene_Document
Zend_Search_Lucene_Search_QueryHit.                                                          ,
               getDocument()                                                  getFieldValue():

   1. <?php
   2. require_once('Zend/Search/Lucene.php');
   3.
   4. $index = Zend_Search_Lucene::open('/data/my_index');
   5.
   6. $hits = $index->find($query);
   7. foreach ($hits as $hit) {
   8.     // возвращает объект для этого "хита"
   9.     echo $document = $hit->getDocument();
   10.
   11.          // возвращает объект Zend_Search_Lucene_Field
   12.          // из Zend_Search_Lucene_Document
   13.          echo $document->getField('title');
   14.
   15.          // возвращает строковое значение объекта Zend_Search_Lucene_Field
   16.          echo $document->getFieldValue('title');
   17.
   18.          // делает то же самое, что и getFieldValue()
   19.          echo $document->title;
                                                                                                                    Zend_Search_Lucene           344

   20.                   }
   21.                   ?>

     ,                                                 Zend_Search_Lucene_Document,                                                      .
                                                                    ,
                                                       (        , LuceneIndexCreation.jar).

                              ,                                             (                     — 'path')
                                                                .

Ранжирование результата

Zend_Search_Lucene                                                                                ,            Java Lucene.
                                                                      (              ). "     "                                                  ,
                     ,                                          ,                                     ,
             .

                                           ,                ,                                                                 ,
                                               .

         ,                                             ,                                          score:

   1.        <?php
   2.        $hits = $index->find($query);
   3.
   4.        foreach ($hits as $hit) {
   5.            echo $hit->id;
   6.            echo $hit->score;
   7.        }

                                                                    Zend_Search_Lucene_Search_Similarity.                                .
                                       .                                  .

Сортировка результатов поиска

                                                                                 .
     (           )                                 ,                                          .

$index->find()                                                                                        :

   1. <?php
   2. $index->find($query [, $sortField [, $sortType [, $sortOrder]]] [, $sortField2 [,
      $sortType [, $sortOrder]]] ...);

$sortField                                                                                                           .

$sortType                                                                       SORT_REGULAR      (                                          ,
                                           ), SORT_NUMERIC (                                              ), SORT_STRING (
                                  ).
                                                                                                                            Zend_Search_Lucene             345

$sortOrder                                                                               SORT_ASC     (                                            ,
                                             ), SORT_DESC (                                                ).

    1. <?php
    2. $index->find($query, 'quantity', SORT_NUMERIC, SORT_DESC);

    1. <?php
    2. $index->find($query, 'fname', SORT_STRING, 'lname', SORT_STRING);

    1. <?php
    2. $index->find($query, 'name', SORT_STRING, 'quantity', SORT_NUMERIC, SORT_DESC);

                             ,                                                  ,                                                  .
                                                                    ,                                                                                  .

Подсветка результатов поиска

         Zend_Search_Lucene_Search_Query::highlightMatches()                                                                           HTML-
                                  ,                                                                         :

    1.   <?php
    2.   $query = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
    3.   $hits = $index->find($query);
    4.   ...
    5.   $highlightedHTML = $query->highlightMatches($sourceHTML);

         highlightMatches()                                             HTML                              Zend_Search_Lucene_Document_Html
(   .            "HTML-                               ").                                                                         HTML-        ,
                                 .

Язык запросов
Java Lucene              Zend_Search_Lucene                                                                     .

                                                  ,                                            ,                                       .

                                                                                    Java Lucene                         »     .

Элементы

                                                                .                                                   :                      ,
                 .

                                     –                      ,                 : "test"     "hello".

         –                                   ,                                             ,               : "hello dolly".

                 –                       ,                                ,              : "(hello dolly)".


             (       .       ).
                                                                                                                              Zend_Search_Lucene                  346

Поля

Lucene                                           ,                          .                               ,
                                                       .                                                                                  ,
                                                                                             .

                                                     Java Lucene                    ,
       .

               Zend_Search_Lucene                                                            ,                                                            :

   1. <?php
   2. $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
   3. ...
   4. Zend_Search_Lucene::setDefaultSearchField('contents');

               NULL                  ,                                                            .                                                           .

                                     ,                                                      ":"                                                .

                                             ,                Lucene                                  - 'title' (             )   'text' (        ), 'text'
                       ,                                             .                                                                        "The Right
Way",                                                "don't go this way",                               :

   1. title:"The Right Way" AND text:go




   1. title:"Do it right" AND go

     'text'                              ,                                              ,                                             .

           :                                                                    ,                                   ,
                                 .                            ,

   1. title:Do it right

                             'title'                  "Do".         "it"    "right"                                               ,
                 ,                                                          ,                                   ,
                     NULL.

Модификаторы элементов

Lucene
      .
                                                                                                                    [1]
Zend_Search_Lucene                                                                      "~"                               .
                                                                                                                                  Zend_Search_Lucene             347

Поиск по критерию близости

Lucene                                             ,                                                                                                     .
    ,                                                                   ,                                          "~"                           .           ,
          ,                                            "Zend"   "Framework"                            10           ,
      :

   1. "Zend Framework"~10

Усиление элемента

Java Lucene           Zend_Search_Lucene
                  ,                                                                          .                 ,                                     ,
                                    "^"                                                                                  .
              ,                                                                .

                                                                                                           .                 ,

   1. PHP framework

          ,                        'PHP'                                           ,                       ,                             ^
                                                                     :

   1. PHP^4 framework

                                                                     ,                                                       'PHP'.
                                           ,                                   :

   1. "PHP framework"^4 "Zend Framework"

                                                                1.                          ,
                               ,                                          1(             , 0.2).

Булевы операторы

                                                                                                                                     . Lucene
AND, "+", OR, NOT "-"                                                    . Java Lucene                 ,
               , Zend_Search_Lucene                                               .

           AND, OR, NOT "+", "-"                                                                                                             .
Java Lucene, Zend_Search_Lucene                                                                    .

                                   AND/OR/NOT,                                     AND/OR
                           .                                                                                                     NOT.                AND
                                               ,        OR.          Zend_Search_Lucene                                           Java Lucene.

AND

                  AND          ,                                                                                                 "           AND".
                                                                                                Zend_Search_Lucene     348

                          ,                      "PHP framework"    "Zend Framework"                       :

      1. "PHP framework" AND "Zend Framework"

OR

            OR                                                               .

                              ,                  "PHP framework"      "Zend Framework"                         :

      1. "PHP framework" OR "Zend Framework"

NOT

            NOT                                  ,                               NOT.   "        AND",
                                          NOT,
             .

                              ,                  "PHP framework",           "Zend Framework",                      :

      1. "PHP framework" AND NOT "Zend Framework"

Операторы &&, ||, и !

            &&, ||,   !                                       AND, OR       NOT.

+

"+"              ,                                                      ,                       "+".

                              ,                                "Zend"                       "Framework",
        :

      1. +Zend Framework

-

"-"                               ,                                                         .

                              ,                  "PHP framework",           "Zend Framework",                      :

      1. "PHP framework" -"Zend Framework"

Отсутствие оператора

                                      ,
            .

                                                      OR.
                                                                                                            Zend_Search_Lucene           349

                     ,                                                          .                                      ,
                                         ,                                                                        .

                                     ,                                  "PHP framework"                               "Zend
Framework",                                  :

     1. +"PHP framework" "Zend Framework"



       Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)
Zend_Search_Lucene_Search_QueryParser::getDefaultOperator().

                                Zend_Search_Lucene_Search_QueryParser::B_AND
Zend_Search_Lucene_Search_QueryParser::B_OR.

Групирование

Java Lucene              Zend_Search_Lucene
                 .                                   ,
                                                 :

     1. +(framework OR library) +php

Zend_Search_Lucene                                                                                      .

Группирование полей

Lucene
                     .

                                 ,                           "return"          "pink panther"                              :

     1. title:(+return +"pink panther")

Zend_Search_Lucene                                                                                  .

Экранирование специальных символов

Lucene                                                                                  ,
             .                                           :

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

+    -                                                                              .

             ,                                               ,             \                    .             ,                (1+1):2
                             :

     1. \(1\+1\)\:2
                    Zend_Search_Lucene   350

[1]
      "~"       ,
            .
                                                                                  Zend_Search_Lucene      351


API для построения запросов
                                                                                               API.

                                                           ,                       API.
                                               .

  1. <?php
  2. $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString);

Исключения, бросаемые парсером запросов

                                                       :

  •    Zend_Search_Lucene_Exception         ,                                                         .
  •    Zend_Search_Lucene_Search_QueryParserException
             .

                                       Zend_Search_Lucene_Search_QueryParserException
                           .

  1.   <?php
  2.   try {
  3.       $query = Zend_Search_Lucene_Search_QueryParser::parse($queryString);
  4.   } catch (Zend_Search_Lucene_Search_QueryParserException $e) {
  5.       echo "Query syntax error: " . $e->getMessage() . "\n";
  6.   }

                           (      )                            find()          Zend_Search_Lucene.

Простой запрос (запрос по одному ключевому слову)

                                                               .

                 :

  1. word1




                         API:

  1.   <?php
  2.   $term = new Zend_Search_Lucene_Index_Term('word1', 'field1');
  3.   $query = new Zend_Search_Lucene_Search_Query_Term($term);
  4.   $hits = $index->find($query);

         ,                       ('field1'),                            . Zend_Search_Lucene
                     ,                             .

  1. <?php
                                                                                                    Zend_Search_Lucene       352

    2. $term = new Zend_Search_Lucene_Index_Term('word1'); // Search 'word1' through all
       indexed fields
    3. $query = new Zend_Search_Lucene_Search_Query_Term($term);
    4. $hits = $index->find($query);

Составной запрос (запрос по нескольким ключевым словам)

                                                                                        .

                                                                            "           ", "             "
"                     ".

    •    "                          "                           ,               ,                                        ,
                                                        ;
    •    "                         "                            ,               ,                            ,
                                                        ;
    •                  "                           "                                                             (
                                          )             .               ,
                           ,                                        .

               ,                                                                                     ,
                                               ,                                    ,
               ,                                                                    .

                                                                                    .

                                   :

    1. +word1 author:word2 -word3

    •    '+'
    •    '-'
    •                          'field:'                     ,                                   .                    ,
                                          'contents'.



                                                                        :

    1.   <?php
    2.   $query = new Zend_Search_Lucene_Search_Query_MultiTerm();
    3.
    4.   $query->addTerm(new Zend_Search_Lucene_Index_Term('word1'), true);
    5.   $query->addTerm(new Zend_Search_Lucene_Index_Term('word2'), null);
    6.   $query->addTerm(new Zend_Search_Lucene_Index_Term('word3'), false);
    7.
    8.   $hits        = $index->find($query);

             $signs                                                             :

    •    TRUE                                                                           .
    •    FALSE                                                                              .
                                                                                  Zend_Search_Lucene   353

   •     NULL                                                    .

Фразовый запрос

                                                      .

                                                                                  ,             .

                                                                             .(
                                                 .         ,
                "   "                                                                 ).
                                                                         :

   1. <?php
   2. $query1 = new Zend_Search_Lucene_Search_Query_Phrase();
   3.
   4. // Добавление 'word1' в относительную позицию 0.
   5. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word1'));
   6.
   7. // Добавление 'word2' в относительную позицию 1.
   8. $query1->addTerm(new Zend_Search_Lucene_Index_Term('word2'));
   9.
   10.      // Добавление 'word3' в относительную позицию 3.
   11.      $query1->addTerm(new Zend_Search_Lucene_Index_Term('word3'), 3);
   12.
   13.      ...
   14.
   15.      $query2 = new Zend_Search_Lucene_Search_Query_Phrase(
   16.                      array('word1', 'word2', 'word3'), array(0,1,3));
   17.
   18.      ...
   19.
   20.      // Запрос без промежутков.
   21.      $query3 = new Zend_Search_Lucene_Search_Query_Phrase(
   22.                      array('word1', 'word2', 'word3'));
   23.
   24.      ...
   25.
   26.      $query4 = new Zend_Search_Lucene_Search_Query_Phrase(
   27.                      array('word1', 'word2'), array(0,1), 'annotation');



Zend_Search_Lucene_Search_Query_Phrase::addTerm().

                        Zend_Search_Lucene_Search_Query_Phrase
           :

   1. <?php
   2. Zend_Search_Lucene_Search_Query_Phrase([array $terms[, array $offsets[, string
      $field]]]);

$terms                           ,                                   .
NULL,                            .
                                                                                    Zend_Search_Lucene           354

$offsets                                                ,                                                .
                                 NULL,                                        array(0, 1, 2, 3, ...).

$field                   ,                                  ,                              .
                    NULL,                                                 .            Zend_Search_Lucene
               'contents'            ,                          ,
                                                ,                               .

               :

   1. <?php
   2. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'));

                     'zend framework'.

   1. <?php
   2. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'download'),
      array(0, 2));

                     'zend ????? download',                                    'zend platform download', 'zend
studio download', 'zend core download', 'zend framework download'       . .

   1. <?php
   2. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('zend', 'framework'), null,
      'title');

                     'zend framework'        'title'.

         Zend_Search_Lucene_Search_Query_Phrase::addTerm()                                     —
           Zend_Search_Lucene_Index_Term
                             :

   1. <?php
   2. Zend_Search_Lucene_Search_Query_Phrase::addTerm(Zend_Search_Lucene_Index_Term $term[,
      integer $position]);

$term                                               .                                      ,
                        ,                                           .

$position                                .

   1.    <?php
   2.    $query = new Zend_Search_Lucene_Search_Query_Phrase();
   3.    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'));
   4.    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'));

                     'zend framework'.

   1. <?php
   2. $query = new Zend_Search_Lucene_Search_Query_Phrase();
   3. $query->addTerm(new Zend_Search_Lucene_Index_Term('zend'), 0);
   4. $query->addTerm(new Zend_Search_Lucene_Index_Term('framework'), 2);
                                                                                                              Zend_Search_Lucene      355

                     'zend ????? download',                                                       'zend platform download', 'zend
studio download', 'zend core download', 'zend framework download'                    . .

   1.    <?php
   2.    $query = new Zend_Search_Lucene_Search_Query_Phrase();
   3.    $query->addTerm(new Zend_Search_Lucene_Index_Term('zend', 'title'));
   4.    $query->addTerm(new Zend_Search_Lucene_Index_Term('framework', 'title'));

                      'zend framework'                  'title'.

                                                                                                  ,
                  .                            ,                                 .
                         WITHIN               NEAR

         ,                                    ,
                                  .               ,
     (                                                                      ).                            ,
                          ,                                                                ,                   ,    .

                                                                            ,                         ,                 ,
                              .                                                                           ,
              .

                                                                                       :

   1. <?php
   2. // Запрос без пропусков.
   3. $query = new Zend_Search_Lucene_Search_Query_Phrase(array('word1', 'word2'));
   4.
   5. // Поиск 'word1 word2', 'word1 ... word2'
   6. $query->setSlop(1);
   7. $hits1 = $index->find($query);
   8.
   9. // Поиск 'word1 word2', 'word1 ... word2',
   10.      // 'word1 ... ... word2', 'word2 word1'
   11.      $query->setSlop(2);
   12.      $hits2 = $index->find($query);


Кодировки
Поддержка UTF-8 и однобайтных наборов символов

Zend_Search_Lucene                                                    UTF-8.                                                unicode
          Modified UTF-8              Java.           Zend_Search_Lucene
            . [1]

                                                                                               API Zend_Search_Lucene.
                                                                   UTF-8.
                                                                                    Zend_Search_Lucene   356

Используемый по умолчанию анализатор текста

                 ,                                                (
          )           ctype_alpha()                                                           .

ctype_alpha()                           UTF-8,
'ASCII//TRANSLIT'                 .                                                   . [2]

Совместимый с UTF-8 анализатор текста

Zend_Search_Lucene                                UTF-8
             .

      1. <?php
      2. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
      3.     new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

                                                             UTF-8,
              UTF-8           .

                                        :

      •                                          ASCII                ;
      •                                 ;

  -                                                      ,                                        .

                                                                          strtolower().

      1. <?php
      2. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
      3.
      4. ...
      5.
      6. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
      7.      new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
      8.
      9. ...
      10.
      11.       $doc = new Zend_Search_Lucene_Document();
      12.
      13.       $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
          strtolower($contents)));
      14.
      15.       // Поле заголовка для поиска
      16.       // (индексируется, но не сохраняется в индексе)
      17.       $doc->addField(Zend_Search_Lucene_Field::UnStored('title', strtolower($title)));
      18.
      19.       // Поле заголовка для возвращения в результатах поиска
      20.       // (не индексируется, но сохраняется)
      21.       $doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));

                                                                 :
                                                                                            Zend_Search_Lucene       357

      1. <?php
      2. setlocale(LC_CTYPE, 'de_DE.iso-8859-1');
      3.
      4. ...
      5.
      6. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
      7.     new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());
      8.
      9. ...
      10.
      11.      $hits = $index->find(strtolower($query));

[1]
      Zend_Search_Lucene                                         Basic Multilingual Plane ( 0x0000     0xFFFF)
                                                (      ,                        0xFFFF). Java 2
                                                      (16         ),                      0xD800-0xDBFF,
               0xDC00-0xDFFF.                                                         UTF-8               .
                                UTF-8                                                                .
[2]
                        'ASCII//TRANSLIT'                                                                        .

Расширяемость
Анализ текста

         Zend_Search_Lucene_Analysis_Analyzer
                                   .

       Zend_Search_Lucene_Analysis_Analyzer::getDefault()
Zend_Search_Lucene_Analysis_Analyzer::setDefault()
                              .

                  ,
                            : Zend_Search_Lucene_Analysis_Analyzer_Common_Text
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive (             ).
                                                .
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive
           .

                                            :

      1. <?php
      2. Zend_Search_Lucene_Analysis_Analyzer::setDefault(
      3.     new Zend_Search_Lucene_Analysis_Analyzer_Common_Text());
      4. ...
      5. $index->addDocument($doc);

Zend_Search_Lucene_Analysis_Analyzer_Common                                         ,
                                       ,                               .
                        reset()        nextToken(),                                     $_input
                           (NULL                        ).

          nextToken()                                 normalize()                           .
                                                             .
                                                                     Zend_Search_Lucene     358

                                              ,
        :

Example #1

  1. <?php
  2. /** Это созданный пользователем текстовый анализатор, который интерпретирует слова с
      цифрами как один элемент. */
  3.
  4. /** Zend_Search_Lucene_Analysis_Analyzer hierarchy */
  5. require_once 'Zend/Search/Lucene/Analysis/Analyzer.php';
  6.
  7. class My_Analyzer extends Zend_Search_Lucene_Analysis_Analyzer_Common
  8. {
  9.      private $_position;
  10.
  11.           /**
  12.             * Установка позиции в начальное состояние
  13.             */
  14.           public function reset()
  15.           {
  16.                $this->_position = 0;
  17.           }
  18.
  19.           /**
  20.             * API для разбиения на лексемы
  21.             * Получение следующей лексемы
  22.             * Возвращает null, если достигнут конец потока
  23.             *
  24.             * @return Zend_Search_Lucene_Analysis_Token|null
  25.             */
  26.           public function nextToken()
  27.           {
  28.                if ($this->_input === null) {
  29.                    return null;
  30.                }
  31.
  32.                while ($this->_position < strlen($this->_input)) {
  33.                    // пропуск пробела
  34.                    while ($this->_position < strlen($this->_input) &&
  35.                           !ctype_alnum( $this->_input[$this->_position] )) {
  36.                        $this->_position++;
  37.                    }
  38.
  39.                    $termStartPosition = $this->_position;
  40.
  41.                    // чтение лексемы
  42.                    while ($this->_position < strlen($this->_input) &&
  43.                           ctype_alnum( $this->_input[$this->_position] )) {
  44.                        $this->_position++;
  45.                    }
  46.
  47.                    // Пустая лексема, конец потока
  48.                    if ($this->_position == $termStartPosition) {
  49.                        return null;
  50.                    }
  51.
  52.                    $token = new Zend_Search_Lucene_Analysis_Token(
  53.                                              substr($this->_input,
  54.                                                     $termStartPosition,
                                                                             Zend_Search_Lucene   359

   55.                                                        $this->_position -
         $termStartPosition),
   56.                                                 $termStartPosition,
   57.                                                 $this->_position);
   58.                       $token = $this->normalize($token);
   59.                       if ($token !== null) {
   60.                           return $token;
   61.                       }
   62.                       // Продолжение, если лексема пропущена
   63.                   }
   64.
   65.                   return null;
   66.               }
   67.           }
   68.
   69.           Zend_Search_Lucene_Analysis_Analyzer::setDefault(
   70.               new My_Analyzer());

Фильтрация лексем

                Zend_Search_Lucene_Analysis_Analyzer_Common
        .

        Zend_Search_Lucene_Analysis_TokenFilter                                               .
                                                                    .

                                                     normalize(),
                              ,                                .

                                                          :

   •     Zend_Search_Lucene_Analysis_TokenFilter_LowerCase
   •     Zend_Search_Lucene_Analysis_TokenFilter_ShortWords
   •     Zend_Search_Lucene_Analysis_TokenFilter_StopWords

       LowerCase
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive,
            .

ShortWords       StopWords
                 :

   1.    <?php
   2.    $stopWords = array('a', 'an', 'at', 'the', 'and', 'or', 'is', 'am');
   3.    $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords($stopWords);
   4.
   5.    $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
   6.    $analyzer->addFilter($stopWordsFilter);
   7.
   8.    Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);

   1. <?php
   2. $shortWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_ShortWords();
   3.
   4. $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
                                                                                        Zend_Search_Lucene            360

    5. $analyzer->addFilter($shortWordsFilter);
    6.
    7. Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);

               Zend_Search_Lucene_Analysis_TokenFilter_StopWords                                      -
                          .       -                                           :

    1.   <?php
    2.   $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords();
    3.   $stopWordsFilter->loadFromFile($my_stopwords_file);
    4.
    5.   $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
    6.   $analyzer->addFilter($stopWordsFilter);
    7.
    8.   Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);