Каркас приложения, созданный нами, уже содержит страницу входа в систему.
В этом разделе мы преобразуем эту страницу в портлет входа в систему, который
будет называться UserLogin. Портлет будет отображаться в сайдбаре страницы в
случае, если текущий пользователь является гостем и не аутентифицирован. Если
пользователь войдет успешно в систему, то портлет исчезнет, и появится ранее
разработанный портлет пользовательского меню.
UserLogin ¶Как и в портлете пользовательского меню, мы создаем класс UserLogin,
содержащий логику портлета входа в систему, и сохраняем его в файле /wwwroot/blog/protected/components/UserLogin.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
при создании каркаса приложения.
userLogin ¶Содержание представления userLogin также большей частью приходит из
представления login для действия login класса SiteController.
Представление сохранено в файле
/wwwroot/blog/protected/components/views/userLogin.php
и содержит следующий код:
echo CHtml::beginForm(); <div class="row"> echo CHtml::activeLabel($form,'username'); <br/> echo CHtml::activeTextField($form,'username') echo CHtml::error($form,'username'); </div> <div class="row"> echo CHtml::activeLabel($form,'password'); <br/> echo CHtml::activePasswordField($form,'password') echo CHtml::error($form,'password'); </div> <div class="row"> echo CHtml::activeCheckBox($form,'rememberMe'); echo CHtml::label('Запомнить меня',CHtml::getActiveId($form,'rememberMe')); </div> <div class="row"> echo CHtml::submitButton('Login'); <p class="hint">Вы можете войти в систему с данными <b>demo/demo</b></p> </div> echo CHtml::endForm();
В регистрационной форме мы отображаем область ввода имени пользователя и
область ввода пароля. Мы также отображаем флажок, указывающий, нужно ли
запоминать пользовательское состояние входа в систему, даже если браузер
закрыт. В представлении есть локальная переменная $form, которая приходит из
данных, переданных методу render() при вызове метода
UserLogin::renderContent().
Поскольку модель данных LoginForm содержит правила валидации (как в модели
Post), модель выполнит валидацию данных при передаче пользователем формы.
Если будет какая-нибудь ошибка валидации, то форма отобразит ее рядом с
областью ввода, в которой произошла ошибка, с помощью метода CHtml::error().
UserLogin ¶Мы используем портлет UserLogin также, как использовали UserMenu, изменяя
файл макета /wwwroot/blog/protected/views/layouts/main.php следующим образом:
...... <div id="sidebar"> $this->widget('UserLogin',array('visible'=>Yii::app()->user->isGuest)); $this->widget('UserMenu',array('visible'=>!Yii::app()->user->isGuest)); </div> ......
Заметим, что портлет UserLogin видим только тогда, когда текущий пользователь - гость, что противоположно поведению портлета UserMenu.
UserLogin ¶Для тестирования портлета UserLogin, выполним следующие шаги:
http://www.example.com/blog/index.php. Если текущий пользователь не аутентифицирован, мы должны увидеть портлет UserLogin.Login, мы должны увидеть сообщения об ошибках.demo и паролем demo. Текущая страница обновится, портлет UserLogin исчезнет, а портлет UserLogin появится.Logout в портлете UserMenu, мы должны увидеть, что портлет UserMenu исчезнет, а портлет UserLogin появляется снова.Портлет UserLogin является типичным примером шаблона проектирования MVC. Он
использует модель LoginForm для предоставления данных и бизнес-правил; он
использует представление userLogin для генерации пользовательского
интерфейса; и он использует класс UserLogin (мини-контроллер) для
координирования модели и представления.
Signup or Login in order to comment.