View занимается отображением данных. Подсистема View начиная с релиза 2007.3 вынесена из WEB_APP в отдельный пакет View.
В качестве шаблонизатора в Limb3 по-умолчанию используется шаблонная система WACT.
Со view связаны 2 понятия:
$view - это по сути контейнер с данными, который всегда доступен через toolkit.
lmbView - базовый абстрактный класс для реализации $view. lmbWactView - наследник от lmbView, в качестве шаблонизатора использует WACT.
То, что по-умолчанию в Limb3 в качестве $view создается экземпляр lmbWactView определяется реализацией метода lmbWebAppTools :: getView(). Переопределив этот метод, вы можете поменять шаблонизатор.
lmbView содержит следующие методы:
lmbWactView дополнительно содержит следующиме методы:
В будущих релизах, возможно, методы setFormDatasource и setFormErrors перейдут в класс lmbView.
Советуем прочитать страницу Использование цепочки фильтров для организации Front-Controller, так как там объясняется, как и где происходит реальный рендеринг шаблона.
Здесь мы немного повторимся и немного уточним: рендеринг шаблона происходит в фильтре lmbViewRenderingFilter, но это происходит лишь в том случае, если $response является пустым. $response считается пустым, если ни были вызваны следующие методы класса lmbHttpResponse:
Отметим также, что именно в фильтре lmbViewRenderingFilter в шаблон попадают следующие объекты:
Последний факт позволяет использовать в WACT-шаблонах следующие конструкции:
<active_record:fetch using='limb/cms/src/model/lmbCmsNode' target='node' one='true'> <fetch:param record_id='{$#request.id}'/> </active_record:fetch> <core:datasource id='node'> [...] </core:datasource> или <core:datasource from='#toolkit.user'> Имя = $name, Логин = $login [...] </core:datasource>
В lmbWebAppTools есть также метод renderTemplate($template_path), который производит рендеринг view «насильно», однако переменные $toolkit, $request и $session в этом случае не передает.
Существует 2 основных способа передачи данных в шаблоны:
В приложениях, построенных на Limb3, возможно использовать оба способа.
По мере накопления практики мы пришли к следующему балансу между push view и pull view:
Такая выработанная схема позволила нам отказаться от иерархии View - классов, когда каждому действию или контроллеру соответствует еще 1 View класс (такая архитектура наблюдается в некоторых фреймворках).
push view - это концепция, по которой отображение (View) ведет себя достаточно пассивно по отношению к данным, ожидая, что все данные, которые необходимо будет отобразить, должны придти из внешних источников, в отличие от PullView, когда шаблон может затребовать данные самостоятельно. Обычно передачей данных в шаблон занимается контроллер.
push view в Limb3 обычно используется для передачи данных с форм (ошибки валидации, первоначальные данные) в шаблон, а также в некоторых других, когда использование pull view нецелесообразно.
В lmbController есть следующие средства для передачи данных во $view:
Пример, кода использующего концепцию push view:
class FeedbackController extends lmbController { function doSend() { $this->setTemplate('feedback/send_result.html'); if($this->_sendMail()) { $this->resetView(); $this->view->set('success_send', 1); // или просто $this->success_send = 1; // или $this->passToView('success_send', 1); } else $this->view->set('error_send', 1); } protected function sendMail(){[...]} }
pull view предусматривает, что шаблон вытянет данные самостоятельно. Самый простой способ - это использование php-вставок, в которых вызываются нужные методы для получения данных, а затем вывод этих данных при помощи более «классических» средств шаблонизатора. см. Использование php-кода в WACT-шаблонах.
В WACT существует такое понятие как fetcher-ы и специальные <fetch> теги. Fetcher-ы исторически использовались нами для реализации pull-подхода, пока WACT не был научен нормально понимать php-вставки и php-переменные. Рекомендуем почитать:
Правда, в конце концов, мы пришли к пониманию того, что <fetch> теги - несколько ограниченное решение. Возможно, что ситуация с fetcher-ами изменится к релизу 2007.4
Обсуждение