0 follower

Создание портлета входа в систему

Каркас приложения, созданный нами, уже содержит страницу входа в систему. В этом разделе мы преобразуем эту страницу в портлет входа в систему, который будет называться UserLogin. Портлет будет отображаться в сайдбаре страницы в случае, если текущий пользователь является гостем и не аутентифицирован. Если пользователь войдет успешно в систему, то портлет исчезнет, и появится ранее разработанный портлет пользовательского меню.

1. Создание класса UserLogin

Как и в портлете пользовательского меню, мы создаем класс UserLogin, содержащий логику портлета входа в систему, и сохраняем его в файле /wwwroot/blog/protected/components/UserLogin.php. Содержимое файла:

<?php
class UserLogin extends Portlet
{
    public $title='Login';
 
    protected function renderContent()
    {
        $form=new LoginForm;
        if(isset($_POST['LoginForm']))
        {
            $form->attributes=$_POST['LoginForm'];
            if($form->validate())
                $this->controller->refresh();
        }
        $this->render('userLogin',array('form'=>$form));
    }
}

Код метода renderContent() скопирован из метода actionLogin() класса SiteController, который мы сгенерировали в самом начале утилитой yiic. Главным образом мы заменяем вызов метода render() рендерингом представления userLogin. Заметим также, что в этом методе мы создаем объект класса LoginForm. Класс предоставляет данные пользовательского ввода, которые мы собираем из регистрационной формы. Класс находится в файле /wwwroot/blog/protected/models/LoginForm.php, сгенерированным утилитой yiic при создании каркаса приложения.

2. Создание представления userLogin

Содержание представления userLogin также большей частью приходит из представления login для действия login класса SiteController. Представление сохранено в файле /wwwroot/blog/protected/components/views/userLogin.php и содержит следующий код:

<?php echo CHtml::beginForm(); ?>
<div class="row">
<?php echo CHtml::activeLabel($form,'username'); ?>
<br/>
<?php echo CHtml::activeTextField($form,'username') ?>
<?php echo CHtml::error($form,'username'); ?>
</div>
<div class="row">
<?php echo CHtml::activeLabel($form,'password'); ?>
<br/>
<?php echo CHtml::activePasswordField($form,'password') ?>
<?php echo CHtml::error($form,'password'); ?>
</div>
<div class="row">
<?php echo CHtml::activeCheckBox($form,'rememberMe'); ?>
<?php echo CHtml::label('Запомнить меня',CHtml::getActiveId($form,'rememberMe')); ?>
</div>
<div class="row">
<?php echo CHtml::submitButton('Login'); ?>
<p class="hint">Вы можете войти в систему с данными <b>demo/demo</b></p>
</div>
<?php echo CHtml::endForm(); ?>

В регистрационной форме мы отображаем область ввода имени пользователя и область ввода пароля. Мы также отображаем флажок, указывающий, нужно ли запоминать пользовательское состояние входа в систему, даже если браузер закрыт. В представлении есть локальная переменная $form, которая приходит из данных, переданных методу render() при вызове метода UserLogin::renderContent().

Поскольку модель данных LoginForm содержит правила валидации (как в модели Post), модель выполнит валидацию данных при передаче пользователем формы. Если будет какая-нибудь ошибка валидации, то форма отобразит ее рядом с областью ввода, в которой произошла ошибка, с помощью метода CHtml::error().

3. Использование портлета UserLogin

Мы используем портлет UserLogin также, как использовали UserMenu, изменяя файл макета /wwwroot/blog/protected/views/layouts/main.php следующим образом:

......
<div id="sidebar">
 
<?php $this->widget('UserLogin',array('visible'=>Yii::app()->user->isGuest)); ?>
 
<?php $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); ?>
 
</div>
......

Заметим, что портлет UserLogin видим только тогда, когда текущий пользователь - гость, что противоположно поведению портлета UserMenu.

4. Тестирование портлета UserLogin

Для тестирования портлета UserLogin, выполним следующие шаги:

  1. Обратимся к URL http://www.example.com/blog/index.php. Если текущий пользователь не аутентифицирован, мы должны увидеть портлет UserLogin.
  2. Если, не введя ничего в регистрационную форму, мы щелкнем кнопку Login, мы должны увидеть сообщения об ошибках.
  3. Попытаемся войти с именем пользователя demo и паролем demo. Текущая страница обновится, портлет UserLogin исчезнет, а портлет UserLogin появится.
  4. При нажатии пункта меню Logout в портлете UserMenu, мы должны увидеть, что портлет UserMenu исчезнет, а портлет UserLogin появляется снова.

5. Итог

Портлет UserLogin является типичным примером шаблона проектирования MVC. Он использует модель LoginForm для предоставления данных и бизнес-правил; он использует представление userLogin для генерации пользовательского интерфейса; и он использует класс UserLogin (мини-контроллер) для координирования модели и представления.