Создание классов экшенов.
Файлы классов экшенов размещаются в файловой структуре приложения в каталоге wa-apps/{APP_ID}/lib/actions/
.
Для каждого модуля рекомендуется создавать отдельный
подкаталог и размещать файлы по следующей схеме:
wa-apps/{APP_ID}/lib/actions/{MODULE}/{имяФайла}.php
.
Экшены можно разделить на два типа по способу группировки логики действий в классы:
- множественные
- одиночные
Множественные экшены
Если страницы, генерируемые экшенами, похожи между собой и несложны по структуре, то удобно такие экшены реализовывать в одном файле. Такая организация экшенов встречается во многих фреймворках, в частности в Zend Framework.
Для этого вида организации существует базовый класс waViewActions
.
В коде приложения класс множественного экшена нужно наследовать от этого базового класса.
Названия методов, реализующих экшены, должны заканчиваться суффиксом
Action
.
Пример кода класса множественного экшена:
<?php class guestbookBackendActions extends waViewActions { // Действие по умолчанию public function defaultAction() { ... } // Действие delete public function deleteAction() { ... } }
Одиночные экшены
Если логика отдельной страницы сложна и требует внутреннего разделения на несколько частей,
то лучше вынести такой экшен в отдельный класс. Это позволит избежать
образования классов типа
waViewActions
очень большого размера.
Классы одиночных экшенов наследуются от системного класса waViewAction
.
Метод, реализующий действие, должен называться
execute
.
Пример кода класса одиночного экшена:
<?php class myappOrderShowAction extends waViewAction { public function execute() { ... } }
Реализация логики экшена
В большинстве случаев задача экшена в упрощенном варианте сводится к следующей схеме: получить данные от модели и передать их в шаблонизатор для отображения в браузере пользователя .
Передача данных в шаблонизатор
В процессе формирования кода страницы шаблонизатор использует данные, полученные от экшена. Данные для отображения на странице передаются в шаблон в коде экшена с помощью следующей конструкции:
$this->view->assign('var', $var);
Пример кода экшена, иллюстрирующий передачу в шаблон данных, полученных от модели:
<?php class guestbookFrontendAction extends waViewAction { public function execute() { // Создаем экземпляр модели для получения данных из БД $model = new guestbookModel(); // Получаем записи гостевой книги из БД $records = $model->order('datetime DESC')->fetchAll(); // Передаем записи в шаблон $this->view->assign('records', $records); } }
Создание классов контроллеров
В ряде случаев логики, встроенной в контроллер по умолчанию, недостаточно. Например, когда шаблон (а значит и выполняемый набор экшенов) формируемой страницы зависит от ряда условий или когда результатом запроса не является генерация HTML-кода (например, выполняется перенаправление пользователя на другой URL). В таких случаях требуется создание класса специализированного контроллера.
Для создания контроллеров существует два базовых класса: waController
и waViewController
.
Если логика обработки запроса не предусматривает формирование веб-страницы, то соответствующий
класс контроллера необходимо наследовать от базового класса
waController
; в противном случае класс контроллера наследуется
от
waViewController
. Метод, реализующий обработку запроса должен называться
execute
.
Реализация логики контроллера
Наиболее распространенная схема работы контроллера без генерации страницы: после выполнения необходимых операций перенаправить браузер пользователя на другой URL. Такая схема часто используется, когда выполняется запрос на внесение изменений в данные (удаление или создание новой либо сохранение отредактированных данных). В этом случае браузер отправляет на сервер POST-запрос, сервер обрабатывает полученные данные и затем перенаправляет пользователя на страницу, позволяющую увидеть только что сохраненные данные.
Перенаправление на другой адрес
Перенаправление браузера на новый URL выполняется в коде контроллера с помощью следующей конструкции:
$this->redirect('some_url');
Пример кода класса контроллера с использованием перенаправления:
<?php class someappRecordSaveController extends waController { public function execute() { ... $this->redirect('some_url'); } }
Вызов экшенов
Вызов экшена в коде контроллера производится с помощью конструкции вида
$this->executeAction($action);
Пример контроллера с формированием кода новой страницы:
<?php class someappRecordDoController extends waViewController { public function execute() { if (waRequest::getMethod() == 'post') { $this->executeAction(new someappRecordPostAction()); } else { $this->executeAction(new someappRecordGetAction()); } } }