Каркас приложения, созданный нами, уже содержит страницу входа в систему.
В этом разделе мы преобразуем эту страницу в портлет входа в систему, который
будет называться 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.