====== Шаг4.4 Отображение профайла пользователя ====== ===== Различные способы передачи данных в WACT-шаблон ===== Для отображения информации по текущему пользователю необходимо передать объект пользователя в шаблон. Это можно сделать несколькими способами: * Передавать пользователя в шаблон из контроллера. Для этого можно создать базовый контроллер, который будет заниматься передачей данных в шаблон, а остальные контроллеры отнаследовать от него. * Создать новый fetcher-класс, например, UserFetcher и использовать тег для этого. * Получать пользователя при помощи php-вставки непосредственно в WACT-шаблоне. * Передавать данные о пользователе при помощи специального фильтра. Это можно реализовать в нашем AccessFilter. Мы покажем все способы и остановимся на использовании AccessFilter. ==== Передача данных в шаблон из контроллера ==== Для этого способа необходоимо создать базовый класс BaseShopController со следующим кодом: class BaseShopController extends lmbController { function performAction() { $this->view->set('user', $this->toolkit->getUser()); return parent :: performAction(); } } После этого в WACT шаблоне объект пользователя будет доступен в корневом контейнере данных, то есть можно будет использовать такие выражения: Logged in as :{$#user.name} ==== Использование fetcher-ов и -тега ==== Тег используется для получаения данных непосредственно в шаблонах. В теге в атрибуте 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 в шаблоне следующим образом: Logged in as :{$name} [[limb3:ru:packages:wact:fetch_tags|Подробнее о использовании тега и fetcher-ов]]. ==== Использование php-вставок в WACT-шаблоне ==== WACT-позволяет использовать обычные php-вставки. Поэтому мы можем легко получить тулкит прямо в шаблоне и передать объект user в нужный нам контейнер данных, например: [...]
Profile
setChildDatasource('user', lmbToolkit :: instance()->getUser()); ?> Logged in as :{$name}
[...]
Если ваш верстальщик нормально относится к подобным 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: [...]
Profile
Logged in as :{$name}
[...]
Если один из tools в составе toolkit-а поддерживает метод getUser, значит и конструкция **#toolkit.user** тоже будет работать. Как видите, способов достаточно много. Начиная с релиза 2007.2, мы рекомендуем использовать способ получения данных в шаблоне через toolkit. ===== Отображение профайла пользователя ===== Доработаем наш шаблон admin_page.html чтобы он выводил данные текущего пользователя и ссылку на выход из панели управления: [...]
Profile
User: {$name}
Login: {$login}
Email: {$email}
logout
[...]
Для удобства мы создали контейнер данных из данных переменной user корневого контейнера данных и вывели необходимые нам переменные. ===== Предварительные итоги ===== Если вы модифицировали AccessFilter и шаблон admin_page.html, то теперь после аутентификации на странице /login вы сможете увидеть данные своей учетной записи в левой части страницы. {{{limb3:ru:tutorials:shop:login_success.png|}}} ===== Далее ===== [[step5|Шаг5. Отображение списка товаров для покупателей. Поиск товаров]]