Содержание
Шаг4.4 Отображение профайла пользователя
Различные способы передачи данных в WACT-шаблон
Для отображения информации по текущему пользователю необходимо передать объект пользователя в шаблон. Это можно сделать несколькими способами:
- Передавать пользователя в шаблон из контроллера. Для этого можно создать базовый контроллер, который будет заниматься передачей данных в шаблон, а остальные контроллеры отнаследовать от него.
- Создать новый fetcher-класс, например, UserFetcher и использовать тег <fetch> для этого.
- Получать пользователя при помощи php-вставки непосредственно в WACT-шаблоне.
- Передавать данные о пользователе при помощи специального фильтра. Это можно реализовать в нашем AccessFilter.
Мы покажем все способы и остановимся на использовании AccessFilter.
Передача данных в шаблон из контроллера
Для этого способа необходоимо создать базовый класс BaseShopController со следующим кодом:
class BaseShopController extends lmbController { function performAction() { $this->view->set('user', $this->toolkit->getUser()); return parent :: performAction(); } }
После этого в WACT шаблоне объект пользователя будет доступен в корневом контейнере данных, то есть можно будет использовать такие выражения:
<core:optional for='#user.is_logged_in'> Logged in as :{$#user.name} </core:optional>
Использование fetcher-ов и <fetch>-тега
Тег <fetch> используется для получаения данных непосредственно в шаблонах. В теге <fetch> в атрибуте using указывается путь до класса, который будет возвращать данные. Такой класса называется fetcher и наследуется от базового lmbFetcher (limb/web_app/src/fetcher/lmbFetcher.class.php). Дочерние классы от lmbFetcher перекрывают метод _createDataset() и всегда возвращают из него итератор (даже если нужно вернуть 1 элемент).
Итак, мы могли бы создать класс UserFetcher следующим образом:
lmb_require('limb/web_app/src/fetcher/lmbFetcher.class.php'); lmb_require('limb/core/src/lmbCollection.class.php'); class UserFetcher extends lmbFetcher { protected function _createDataset() { $user = lmbToolkit :: instance()->getUser(); return new lmbCollection(array($user)); } }
Класс lmbCollection использован для того, чтобы удовлетворить требование о возвращении из _createDataset() итератора.
Теперь мы смогли бы использовать наш UserFetcher в шаблоне следующим образом:
<fetch using='src/fetcher/UserFetcher' target='user' first='true' /> <core:datasource id='user'> <core:optional for='is_logged_in'> Logged in as :{$name} </core:optional> </core:datasource>
Использование php-вставок в WACT-шаблоне
WACT-позволяет использовать обычные php-вставки. Поэтому мы можем легко получить тулкит прямо в шаблоне и передать объект user в нужный нам контейнер данных, например:
[...] <dl id="profile"> <dt>Profile</dt> <dd> <?php $template->setChildDatasource('user', lmbToolkit :: instance()->getUser()); ?> <core:datasource id='user'> <core:optional for='is_logged_in'> Logged in as :{$name} </core:optional> </core:datasource> </dd> </dl> [...]
Если ваш верстальщик нормально относится к подобным php-вставкам в шаблонах - можете смело воспользоваться таким методом.
Использование фильтра AccessFilter
Этот способ предусматривает добавление одной строки в AccessFilter:
class AccessFilter implements lmbInterceptingFilter { function run($filter_chain) { $toolkit = lmbToolkit :: instance(); $user = $toolkit->getUser(); $controller = $toolkit->getDispatchedController(); if(!$controller) throw new lmbException('Controller is not dispatched yet!'); $toolkit->getView()->set('user', $user); [...] } }
Данная небольшая модификация позволит использовать user из корневого контейнера данных, как в способе с базовым контроллером. Именно на этом способе мы остановимся.
Получение данных прямо в шаблоне через toolkit
Начиная с версии пакета WEB_APP 0.4 (соответствует релизу 2007.2) toolkit поддерживает получение данных через базовые методы get(), к кому же toolkit стал доступен в шаблоне в корневой контейнере данных. Все это позволяет даже не заботиться о передаче user-а в шаблон, а действовать в стиле PullView:
[...] <dl id="profile"> <dt>Profile</dt> <dd> <core:datasource from='#toolkit.user'> <core:optional for='is_logged_in'> Logged in as :{$name} </core:optional> </core:datasource> </dd> </dl> [...]
Если один из tools в составе toolkit-а поддерживает метод getUser, значит и конструкция #toolkit.user тоже будет работать.
Как видите, способов достаточно много. Начиная с релиза 2007.2, мы рекомендуем использовать способ получения данных в шаблоне через toolkit.
Отображение профайла пользователя
Доработаем наш шаблон admin_page.html чтобы он выводил данные текущего пользователя и ссылку на выход из панели управления:
[...]
<dl id="profile">
<dt>Profile</dt>
<dd>
<core:datasource from='#user'>
User: {$name}<br/>
Login: {$login}<br/>
Email: {$email}<br/>
<route_url params='controller:login,action:logout'>logout</route_url>
</core:datasource>
</dd>
</dl>
[...]
Для удобства мы создали контейнер данных из данных переменной user корневого контейнера данных и вывели необходимые нам переменные.
Предварительные итоги
Если вы модифицировали AccessFilter и шаблон admin_page.html, то теперь после аутентификации на странице /login вы сможете увидеть данные своей учетной записи в левой части страницы.


Обсуждение