Для отображения информации по текущему пользователю необходимо передать объект пользователя в шаблон. Это можно сделать несколькими способами:
Мы покажем все способы и остановимся на использовании 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>
Тег <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>
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:
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 из корневого контейнера данных, как в способе с базовым контроллером. Именно на этом способе мы остановимся.
Начиная с версии пакета 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 вы сможете увидеть данные своей учетной записи в левой части страницы.
Обсуждение