Создание действия

Теперь, когда готова модель, можно приступать к написанию кода для работы с ней. Всю логику обработки мы помещаем в действие контроллера. Для формы авторизации, например, нам потребуется следующий код:



Вначале мы создаём экземпляр модели LoginForm, затем, если данные формы были отправлены, заполняем $model данными $_POST['LoginForm']. Далее проверяем полученные данные и, если ошибок нет, перенаправляем пользователя на страницу, для доступа к которой требовалось авторизоваться, т.е. ту страницу, которая отправила пользователя на страницу авторизации. Если же результат проверки отрицательный или действие выполняется впервые, то отображаем пользователю представление login, которое рассмотрим в следующем разделе.

Подсказка: В действии login мы используем Yii::app()->user->returnUrl, чтобы получить URL страницы, которая затребовала авторизацию. Компонент Yii::app()->user является объектом класса CWebUser (или его производного), который позволяет получить информацию, хранящуюся в сессии пользователя (например, имя пользователя, статус и пр.). Подробно ознакомиться с этой темой можно в разделе Аутентификация и авторизация.

Обратим особое внимание на следующее выражение в действии login:



Как мы уже говорили в подразделе Безопасное присваивание значений атрибутам, это выражение заполняет модель данными, которые ввёл пользователь. Свойство attributes определяется классом CModel, который ожидает получить массив пар имя-значение, чтобы затем присвоить каждому атрибуту модели соответствующее значение. Следовательно, если $_POST['LoginForm'] содержит такой массив, то выражение, которое мы привели выше, будет эквивалентно следующему коду (считаем, что массив содержит все нужные нам атрибуты):



Примечание: Для того чтобы $_POST['LoginForm'] возвращал массив вместо строки, необходимо следовать правилам именования полей ввода в представлении. Так, поле, соответствующее атрибуту a в классе модели C, должно называться C[a]. В нашем примере в качестве имени поля формы, соответствующего атрибуту username, мы будем использовать LoginForm[username].

Теперь нам осталось только создать представление login, которое будет содержать HTML форму с требуемыми полями.