Регистрация
Самое первое что мы должны сделать на нашем сайте - соорудить регистрацию и авторизацию. Для этого мы модифицируем уже существующий у нас контроллер
Site и создадим модель Users. Создание модели лучше всего производить с помощью утилиты yiic. Для этого запустите yiic с параметром shell и указанием
индексного файла нашего приложения. После этого выполните команду "model Users". Создастся модель которую мы используем для работы с соответствующей
таблицей.
Сначала сделаем регистрацию. Объявите для этого метод actionRegister в контроллере Site. Впишем туда отображение формы регистрации. Она будет лежать
в шаблоне /protected/views/site/register.php и иметь следующее содержимое.
Код HTML:
<h2>Регистрация</h2>
<form action="/site/register/" method="POST">
<table width="100%">
<tr>
<td>Имя пользователя</td>
<td><input type="text" name="Users[login]" class="long_field" ></td>
</tr>
<tr>
<td>E-mail</td>
<td><input type="text" name="Users[email]" class="long_field" ></td>
</tr>
<tr>
<td>Пароль</td>
<td><input type="password" name="Users[password]" class="long_field"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value=" Зарегистрироваться " />
</td>
</tr>
</table>
</form>
Код обработки этого шаблона будет простой.
PHP код:
$this->render("register");
Теперь пройдите по ссылке http://yii/site/register/. Вы должны увидеть форму регистрации из трёх полей. Как видно из шаблона,
форма отсылает данные методом POST на этот же адрес. То есть при обращении к действию register контроллер должен как-то проверить
- пришла форма, или это простое обращение. Такую проверку мы будем осуществлять проверяя существование массива $_POST['Users']. Если он есть
- нам пришли данные из формы. В случае регистрации мы просто создадим новый объект модели Users, укажем необходимые поля и сохраним изменения.
PHP код:
$users = new Users;
// Заполняем поля
$users->login = $_POST['Users']['login'];
$users->password = md5($_POST['Users']['password']);
$users->email = $_POST['Users']['email'];
// Сохраняем данные
$users->save();
После регистрации пользователю нужно сообщить об успешности этой операции. Мы воспользуемся Flash-сообщениями. Сначала внесём соответствующий
текст в языковой файл, в ячейку "registered"
PHP код:
"registered" => "Поздравляем! Вы зарегистрированы!"
А затем объявим его в контроллере, вызывав метод setFlash ( http://www.yiiframework.com/doc/api/CWebUser#setFlash-detail ).
PHP код:
Yii::app()->user->setFlash("registered",Yii::t("common","registered"));
Здесь мы создали у текущего пользователя сообщение об успешной регистрации с идентификатором "registered". Осталось только шаблон формы изменить
так чтоб она не отображалась если есть Flash-сообщение. В этом нам помогут методы hasFlash и getFlash этого же объекта. Первый определяет есть
ли нужное нам сообщение, а второй это сообщение возвращает.
Код HTML:
<h2>Регистрация</h2>
<?if(Yii::app()->user->hasFlash("registered")):?>
<p>
<?=Yii::app()->user->getFlash("registered")?>
</p>
<?else:?>
<form action="/site/register/" method="POST">
<table width="100%">
<tr>
<td>Имя пользователя</td>
<td><input type="text" name="Users[login]" class="long_field" ></td>
</tr>
<tr>
<td>E-mail</td>
<td><input type="text" name="Users[email]" class="long_field" ></td>
</tr>
<tr>
<td>Пароль</td>
<td><input type="password" name="Users[password]" class="long_field"></td>
</tr>
<tr>
<td>Подтверждение пароля</td>
<td><input type="password" name="Users[password_confirm]" class="long_field"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value=" Зарегистрироваться " />
</td>
</tr>
</table>
</form>
<?endif;?>
А вот код который должен у нас получится в действии actionRegister.
PHP код:
if(isset($_POST['Users']))
{
$users = new Users;
// Сохраняем поля
$users->login = $_POST['Users']['login'];
$users->password = md5($_POST['Users']['password']);
$users->email = $_POST['Users']['email'];
// Сохраняем данные
$users->save();
// Устанавливаем сообщение
Yii::app()->user->setFlash("registered",Yii::t("common","registered"));
}
$this->render("register");
Следующим шагом мы добавим валидацию ( http://www.yiiframework.com/doc/guide/form.model#declaring-validation-rules ).
Нам нужно проверить отсутсвие логина и указанного почтового адреса в базе. Для этого откроем файл /protected/models/User.php и
посмотрим метод "rules". Там сейчас 3 правила - максимальная длинна логина 30 символов, пароля - 32, email`a - 50. Мы внесём сюда
5 правил - поля почтового адреса и логина не должны быть пустыми, содержимого этих полей в БД быть не должно, почтовый адрес должен
иметь правильный формат.
PHP код:
return array(
// логин и почта должны быть введены
array('login','required','on'=>'register','message'=>Yii::t('common','login_empty')),
array('email','required','on'=>'register','message'=>Yii::t('common','email_empty')),
// Они должны быть уникальными
array('login','unique','on'=>'register','message'=>Yii::t('common','login_in_base')),
array('email','unique','on'=>'register','message'=>Yii::t('common','email_in_base!')),
// Почтовый адрес должен иметь соответствующий формат
array('email','email','on'=>'register','message'=>Yii::t('common','email_no_right_format'))
);
Внесём в языковой файл соответствующие переводы.
PHP код:
"login_empty" => "Поле логина не должно быть пустым",
"email_empty" => "Поле почтового адреса не должно быть пустым",
"login_in_base" => "Введёный логин присутсвует среди зарегистрированных пользователей",
"email_in_base" => "Введёный e-mail присутсвует среди зарегистрированных пользователей",
"email_no_right_format" => "Вы ввели не правильный email"
Теперь модифицируем контроллер. Во-первых, объявим массив куда будут складываться все ошибки валидации. Назовём его $errors. Во-вторых,
перед сохранением данных мы вызовем метод "validate". И в третьих, мы осуществим обработку метода getErrors, модели, так чтоб в $errors
поместились все имеющиеся ошибки. Затем мы передадим массив с ошибками в обработчик шаблона.
PHP код:
$errors = Array();
if(isset($_POST['Users']))
{
$users = new Users;
// Сохраняем поля
$users->login = $_POST['Users']['login'];
$users->password = md5($_POST['Users']['password']);
$users->email = $_POST['Users']['email'];
// Проверяем данные
$users->validate('register');
// Если ошибки есть
if( $users->hasErrors() )
{
// Помещаем их текст в массив $errors
foreach($users->getErrors() as $field) $errors[] = $field[0];
}
// Если массив ошибок пуст
if(!count($errors)) {
// Сохраняем данные
$users->save();
// Устанавливаем сообщение
Yii::app()->user->setFlash("registered",Yii::t("common","registered"));
// Обновляем страницу
$this->refresh();
// Если ошибки есть то показываем форму регистрации и передаём их в шаблон
}
}
$this->render('register',Array('errors' => $errors));
В шаблон же мы добавим код который высветит все ошибки, если таковые есть. Его следует поместить прямо перед начальным тегом <form>.
Код HTML:
<?if(count($errors)):?>
Ошибки: <br />
<?foreach($errors as $error):?>
&amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;nbsp;<b><?=$error;?></b><br />
<?endforeach;?>
<?endif;?>
<br />
Теперь, если Вы всё сделали правильно, при отправке пустой формы покажутся соответствующие сообщения.