Инструменты пользователя

Инструменты сайта


limb3_2007_4:ru:tutorials:shop:step4-4

Шаг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>

Подробнее о использовании <fetch> тега и fetcher-ов.

Использование 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 вы сможете увидеть данные своей учетной записи в левой части страницы.

}

Далее

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ___    ____  ____   _____   ___ 
  / _ )  / __/ / __ \ / ___/  / _ \
 / _  | _\ \  / /_/ // /__   / // /
/____/ /___/  \___\_\\___/  /____/
 
limb3_2007_4/ru/tutorials/shop/step4-4.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)