Создание действия
Теперь, когда готова модель, можно приступать к написанию кода для работы с ней. Всю логику обработки мы помещаем в действие контроллера. Для формы авторизации, например, нам потребуется следующий код:
public function actionLogin() { $model=new LoginForm; if(isset($_POST['LoginForm'])) { // получаем данные от пользователя $model->attributes=$_POST['LoginForm']; // проверяем полученные данные и, если результат проверки положительный, // перенаправляем пользователя на предыдущую страницу if($model->validate()) $this->redirect(Yii::app()->user->returnUrl); } // рендерим представление $this->render('login',array('model'=>$model)); }
Вначале мы создаём экземпляр модели LoginForm, затем, если данные формы были
отправлены, заполняем $model данными $_POST['LoginForm']. Далее проверяем
полученные данные и, если ошибок нет, перенаправляем пользователя на страницу,
для доступа к которой требовалось авторизоваться, т.е. ту страницу, которая
отправила пользователя на страницу авторизации. Если же результат проверки
отрицательный или действие выполняется впервые, то отображаем пользователю
представление login, которое рассмотрим в следующем разделе.
Подсказка: В действии
loginмы используемYii::app()->user->returnUrl, чтобы получить URL страницы, которая затребовала авторизацию. КомпонентYii::app()->userявляется объектом класса CWebUser (или его производного), который позволяет получить информацию, хранящуюся в сессии пользователя (например, имя пользователя, статус и пр.). Подробно ознакомиться с этой темой можно в разделе Аутентификация и авторизация.
Обратим особое внимание на следующее выражение в действии login:
$model->attributes=$_POST['LoginForm'];
Как мы уже говорили в подразделе Безопасное присваивание значений атрибутам,
это выражение заполняет модель данными, которые ввёл пользователь. Свойство attributes определяется
классом CModel, который ожидает получить массив пар имя-значение, чтобы затем присвоить каждому атрибуту модели
соответствующее значение. Следовательно, если $_POST['LoginForm'] содержит такой массив, то выражение,
которое мы привели выше, будет эквивалентно следующему коду (считаем, что массив содержит все нужные нам атрибуты):
$model->username=$_POST['LoginForm']['username']; $model->password=$_POST['LoginForm']['password']; $model->rememberMe=$_POST['LoginForm']['rememberMe'];
Примечание: Для того чтобы
$_POST['LoginForm']возвращал массив вместо строки, необходимо следовать правилам именования полей ввода в представлении. Так, поле, соответствующее атрибутуaв классе моделиC, должно называтьсяC[a]. В нашем примере в качестве имени поля формы, соответствующего атрибутуusername, мы будем использоватьLoginForm[username].
Теперь нам осталось только создать представление login, которое будет содержать
HTML форму с требуемыми полями.