Урок 6 : Регистрация и авторизация. Часть 2
Рубрика: Создаем блог вместе
2 Июл. 2009Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.
Продолжение...
---Я надеюсь вы уже знакомы с прошлой частью урока, и настроились к познанию нового материала :) Давайте немного вrспомним о том что было в прошлой части и что у нас уже готово:
- форма поле должно проверять правиломрегистрации
- обработка формы. валидация полей (данных). сохранение данных
- модель, контроллер и пару отображений
В этой части урока мы полностью закончим с авторизацией и регистрацией и сможем приступить к более серьезным (и интересным) вещам :)
Работаем с экшинсом
В прошлой части урока мы создали отдельный экшинс для регистрации, давайте сделаем нечто похожее и для авторизации. Открываем наш контроллер UserController.php и находим:
/**
* Метод входа на сайт
*
* Метод в котором мы выводим форму авторизации
* и обрабатываем её на правильность.
*/
public function actionLogin()
{
} И заменяем на :
/**
* Метод входа на сайт
*
* Метод в котором мы выводим форму авторизации
* и обрабатываем её на правильность.
*/
public function actionLogin()
{
$form = new User();
// Проверяем является ли пользователь гостем
// ведь если он уже зарегистрирован - формы он не должен увидеть.
if (!Yii::app()->user->isGuest) {
throw new CException('Вы уже зарегистрированы!');
} else {
if (!empty($_POST['User'])) {
$form->attributes = $_POST['User'];
$form->verifyCode = $_POST['User']['verifyCode'];
// Проверяем правильность данных
if($form->validate('login')) {
// если всё ок - кидаем на главную страницу
$this->redirect(Yii::app()->homeUrl);
}
}
$this->render('login', array('form' => $form));
}
}
Форма
Конструкция очень похожа на actionRegistration() поэтому я не делал сильно много комментариев.
Как вы уже поняли по коду - форма у нас будет находиться в файле login. Поэтому заходим views/user/ и создаем файл login.php:
<h1>Авторизация</h1>
<?=CHtml::form(); ?>
<?=CHtml::errorSummary($form); ?><br>
<table id="form2" border="0" width="400" cellpadding="10" cellspacing="10">
<tr>
<td width="150"><?=CHtml::activeLabel($form, 'login'); ?></td>
<td><?=CHtml::activeTextField($form, 'login') ?></td>
</tr>
<tr>
<td><?=CHtml::activeLabel($form, 'passwd'); ?></td>
<td><?=CHtml::activePasswordField($form, 'passwd') ?></td>
<tr>
<tr>
<td><?php $this->widget('CCaptcha', array('buttonLabel' => '<br>[новый код]')); ?></td>
<td><?=CHtml::activeTextField($form,'verifyCode'); ?></td>
</tr>
<tr>
<td></td>
<td><?=CHtml::submitButton('Войти', array('id' => "submit")); ?></td>
</tr>
</table>
<?=CHtml::endForm(); ?>
Почти аналогичная форма как и у регистрации (только без поля повтора пароля). Хотел бы обратить внимание что на форме авторизации я оставил поле капчи (для того чтобы боты не авторизировались самостоятельно).
Теперь заходим на страницу localhost/user/login/ и видим красивую формочку :)
Можете даже попробовать ввести в неё какие то не правильные данные (указать неверный код капчи, использовать короткий логин/пароль) и убедиться что наши правила работают :)
Если вы введете верные данные - вас просто переведет на главную страницу. Механизм сохранения мы еще не писали, поэтому это нормально.
UserIdentity
Как вы понимаете сам процесс аутентификации уже был вложен в Yii и от нас требуется лишь наследовать класс CUserIdentity и пере определить метод authenticate под свои нужды.
Если вам вдруг будет непонятно про Identity, вы можете прочитать статью про авторизацию вот тут.
В authenticate мы проверим совпадают ли введённые данные (логин/пароль) с тем что у нас есть в базе данных. Заходим в protected/ и создаем там папку components, а в ней файл UserIdentity.php:
class UserIdentity extends CUserIdentity
{
private $_id;
public function authenticate()
{
// Есть ли указанный пользователь в базе данных
$record=User::model()->findByAttributes(array('login'=>$this->username));
if($record===null)
// Если нету - сохраняем в errorCode ошибку.
$this->errorCode=self::ERROR_USERNAME_INVALID;
else if($record->passwd!==$this->password)
// Проверяем совпадает ли введенный пароль с тем что у нас в базе
// Если не совпадает - сохраняем в errorCode ошибку.
$this->errorCode=self::ERROR_PASSWORD_INVALID;
else
{
// Если все действий выше успешно пройдены - значит
// пользователь действительно существует и пароль был
// указан верно.
$this->_id=$record->id;
// В errorCode сохраняем что ошибок нет
$this->errorCode=self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId()
{
return $this->_id;
}
}Давайте разберем что мы написали выше.
- Мы создали класс UserIdentity с наследованием от CUserIdentity
- Пере определили метод authenticate() в которой сделали проверку на наличие такого логина в базе, а после этого проверка на совпадение пароля.
- Метод возвращает у нас errorCode. Если значение "ERROR_NONE" - значит ошибок нету.
Модель
Теперь нам надо в моделе создать специально правило для того что бы сразу проверять введенные логин/пароль нашим методом.
Открываем protected/models/User.php и в метод rules добавляем еще одно правило:
array('passwd', 'authenticate', 'on' => 'login'),В конечном итоге rules у нас должны выглядеть следующим образом:
/**
* Правила валидации
*/
public function rules()
{
return array(
// логин, пароль не должны быть больше 128-и символов, и меньше трёх
array('login, passwd', 'length', 'max'=>128, 'min' => 3),
// логин, пароль не должны быть пустыми
array('login, passwd', 'required'),
// для сценария registration поле passwd должно совпадать с полем passwd2
array('passwd', 'compare', 'compareAttribute'=>'passwd2', 'on'=>'registration'),
// правило для проверки капчи что капча совпадает с тем что ввел пользователь
array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),
// проверка пароля нашим методом authenticate
array('passwd', 'authenticate', 'on' => 'login'),
array('login', 'match', 'pattern' => '/^[A-Za-z0-9А-Яа-я\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
);
}
Как вы уже помните - в массиве первым элементом я задал поле, которое должно быть проверенно правилом, а во втором параметре указал как должен называться метод для проверки. Теперь давайте создадим authenticate нашей модели.
Хочу заметить что в данном случае речь идет не про метод authenticate который мы создали в UserIdentity. В данном случае я просто использую точно такое же имя, но речь уже идет про метод authenticate который мы сейчас создадим в User.php
И так, ниже в этом же файле добавляем новый метод:
/**
* Собственное правило для проверки
* Данный метод является связующем звеном с UserIdentity
*
* @param $attribute
* @param $params
*/
public function authenticate($attribute,$params)
{
// Проверяем были ли ошибки в других правилах валидации.
// если были - нет смысла выполнять проверку
if(!$this->hasErrors())
{
// Создаем экземпляр класса UserIdentity
// и передаем в его конструктор введенный пользователем логин и пароль (с формы)
$identity= new UserIdentity($this->login, $this->passwd);
// Выполняем метод authenticate (о котором мы с вами говорили пару абзацев назад)
// Он у нас проверяет существует ли такой пользователь и возвращает ошибку (если она есть)
// в $identity->errorCode
$identity->authenticate();
// Теперь мы проверяем есть ли ошибка..
switch($identity->errorCode)
{
// Если ошибки нету...
case UserIdentity::ERROR_NONE: {
// Данная строчка говорит что надо выдать пользователю
// соответствующие куки о том что он зарегистрирован, срок действий
// у которых указан вторым параметром.
Yii::app()->user->login($identity, 0);
break;
}
case UserIdentity::ERROR_USERNAME_INVALID: {
// Если логин был указан наверно - создаем ошибку
$this->addError('login','Пользователь не существует!');
break;
}
case UserIdentity::ERROR_PASSWORD_INVALID: {
// Если пароль был указан наверно - создаем ошибку
$this->addError('passwd','Вы указали неверный пароль!');
break;
}
}
}
}
Я надеюсь логика работы вам в принципе понятна. Т.е. мы с вами написали правило (rules) которое проверяет поле passwd нашим методом authenticate. В нем мы обращаемся к классу UserIdentity и проверяем существует ли такой пользователь с таким паролем. Если все хорошо - методом login проводим "вход" пользователя.
Выход
Когда со "входом" на сайт мы разобрались, давайте сделаем "выход (log out)".
Для этого мы уже написали каркас экшинса в контроллере, который сейчас мы дополним.
Открываем protected/controllers/UserController.php и вместо:
/**
* Метод выхода с сайта
*
* Данный метод описывает в себе выход пользователя с сайта
* Т.е. кнопочка "выход"
*/
public function actionLogout()
{
}
делаем :
/**
* Метод выхода с сайта
*
* Данный метод описывает в себе выход пользователя с сайта
* Т.е. кнопочка "выход"
*/
public function actionLogout()
{
// Выходим
Yii::app()->user->logout();
// Перезагружаем страницу
$this->redirect(Yii::app()->user->returnUrl);
}Всё достаточно просто.
Меню
Теперь что бы увидеть как это все работает - думаю есть смысл создать просто меню:
<a href="<?=Yii::app()->createUrl("post/index");?>">Главная</a>
<?php if (Yii::app()->user->isGuest): ?>
<a href="<?=Yii::app()->createUrl("user/registration/");?>">Регистрация</a>
<a href="<?=Yii::app()->createUrl("user/login/");?>">Вход</a>
<?php else: ?>
<a href="<?=Yii::app()->createUrl("user/logout/");?>">Выход (<?=Yii::app()->user->name?>)</a>
<?php endif; ?>
Оно состоит из проверки является ли пользователь гостем. В зависимости от этого он будет видеть нужные пункты меню. К примеру для гостя это будет - регистрация и вход, а для авторизированного пользователя - кнопка выход.
Я не хочу сильно мудрить с выносом меню в отдельный файл и тп, поэтому мы просто добавим его в наш layouts. Открываем protected/views/layouts/main.php и добавляем в него код нашего меню:
<html>
<head>
<title><?php echo $this->pageTitle; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="ru" />
<meta name="robots" content="all" />
</head>
<body>
<a href="<?=Yii::app()->createUrl("post/index/");?>">Главная</a>
<?php if (Yii::app()->user->isGuest): ?>
<a href="<?=Yii::app()->createUrl("user/registration/");?>">Регистрация</a>
<a href="<?=Yii::app()->createUrl("user/login/");?>">Вход</a>
<?php else: ?>
<a href="<?=Yii::app()->createUrl("user/logout/");?>">Выход (<?=Yii::app()->user->name?>)</a>
<?php endif; ?>
<?php echo $content; ?>
</html>
Конец
Теперь всё работает. Заходите на localhost и смотрите сами :)
Исходники:
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 6 : Регистрация и авторизация. Часть 2"
- Серия рецентов "By Example" пытается предоставить для разработчиков примеры использования самых распостраненных действий в Yii. Учимся использовать CHtml::listData() на ... ""By Example" : CHtml - listData()"
- Давайте сегодня поговорим что же такое “контроллер” и для чего он используется в приложениях на базе MVC
next
В уроке ... "Шаг 5 : Контроллер"

Виталий
Было сказано: Четверг, 02 Июль 2009
На странице регистрации ввожу имя и дважды пароль - выдаёт ошибку: "Пользователя не существует". Удаляю метод authenticate($attribute,$params) из User.php - так регистрирует..

[adm] zolter
Было сказано: Четверг, 02 Июль 2009
Спасибо больше. 5 секунд подождите, отредактирую статью и скажу в чем была ошибка.

[adm] zolter
Было сказано: Четверг, 02 Июль 2009
Зайдите в модель (User.php) и измените строчку:
array('passwd', 'authenticate')на:
array('passwd', 'authenticate', 'on' => 'login'),проблемы бала в том что в on не было указанно для какого сценария должно срабатывать правило. поэтому при регистрации, срабатывало правило и проверяло есть ли такой пользователь с таким паролем xD теперь когда там явно указанно 'login', то правило будет применяться только при авторизации. (форма регистрации будет его игнорировать)

[adm] zolter
Было сказано: Четверг, 02 Июль 2009
Вам еще надо исправить ошибку в коде из прошлой статьи которую я описал вот в этом комментарии (http://www.dbhelp.ru/yii-auth-and-reg-1/page/#comment-344).

[guest] Влад
Было сказано: Четверг, 02 Июль 2009
Спасибо за статью!
Очень радует быстрое исправление своих ошибок

[adm] zolter
Было сказано: Пятница, 03 Июль 2009
Скоро будет еще одна статья по этому уроку. (сегодня-завтра 100%)

[guest] ppy
Было сказано: Суббота, 04 Июль 2009
Спасибо за статью, но не раскрыта тема как проверять и отклонять запросы в контроллере если юзер не залогинен.

[adm] zolter
Было сказано: Воскресенье, 05 Июль 2009
Вы имеете ввиду контроль доступа залогиненых пользователей к отдельным экшинсам? Да действительно, сначало думал написать это всё в одной статье, но потом понял что сильно будет грузить голову (очень много инфы). Поэтому через пару уроков - обязательно рассмотрю этот вопрос но уже в качестве отдельной статьи.

[adm] zolter
Было сказано: Среда, 08 Июль 2009
В статью добавлена ссылка на рабочий проект. (rar) архив содержит в себе исходники всех предыдущих уроков + текущего урока. Что бы запустить его от вас требуется изменить немного index.php (прописать новый путь к yii) и config/main.php (логин пароль к базе)

[guest] patison
Было сказано: Понедельник, 20 Июль 2009
Поправочку можно?
Вот тут:
// Проверяем является ли пользователь гостем
// ведь если он уже зарегистрирован - формы он не должен увидеть.
if (!Yii::app()->user->isGuest) {
throw new CException('Вы уже зарегистрированы!');
Советую везде слово ЗАРЕГИСТРИРОВАН заменить на АВТОРИЗИРОВАН, а то немного вводит в заблуждение :)

[guest] Maxxdev
Было сказано: Понедельник, 02 Ноябрь 2009
После перехода на версию 1.1 столкнулся с тем, что при авторизации не вызывается метод public function authenticate($attribute,$params) модели User.php. Копал копал, причиной оказалось выражение
array('passwd', 'authenticate', 'on' => 'login').
array('passwd', 'authenticate') - работает. Кто нибудь знает причину столь странного поведения?

[adm] zolter
Было сказано: Вторник, 03 Ноябрь 2009
Да. Я уже столкнулся с этим.
В методе validate теперь первый парраметр это не название сценария, а список атрибутов которые надо проверять. Или если null - тогда все атрибуты участвуют в валидации. Как я понял название сценария теперь надо задавать иначе. вместо:
if ($model->validate('test')) {
...
}
делаю:
$model->scenario = 'test';
if ($model->validate()) {
...
}
Я так решил эту проблему.

[adm] zolter
Было сказано: Вторник, 03 Ноябрь 2009
Вот как было раньше:
http://www.yiiframework.com/doc/api/1.0.10/CModel#validate-detail
т.е. два параметра, первый сценарий, второй список атрибутов если надо. А сейчас вот так:
http://www.yiiframework.com/doc/api/CModel#validate-detail
т.е. без названия сценария
В описании этого параметра там написано что он считается устаревшим с версии 1.0.4, наверно поэтому в новой ветке его убрали вовсе. Вместо него рекомендуют использовать тот подход который я описал выше

[guest] Maxxdev
Было сказано: Среда, 04 Ноябрь 2009
Т.е. сейчас правильным будет использовать
array('passwd', 'authenticate') вместо
array('passwd', 'authenticate', 'on' => 'login') ?

[adm] zolter
Было сказано: Среда, 04 Ноябрь 2009
Не. В самой модели вы ничего не меняете. Просто из-за того что разработчик поменял 1 парраметр - ваша модель не понимает что сейчас используется сценарий "login". Поэтому правило array('passwd', 'authenticate', 'on' => 'login') не отрабатывает.
В контроллере где вы сейчас проводите валидацию у вас наверно есть строчка:
if ($model->validate('login')) {
}так вот её надо заменить на:
$model->scenario = 'test';
if ($model->validate()) {
}т.е. название сценария теперь ненадо передавать в функцию validate, а надо указывать в парраметр scenario.
п.с. вместо validate возможно вы используете save('login'), в этом случае все тоже идентично.

[adm] zolter
Было сказано: Среда, 04 Ноябрь 2009
Если мы с вами говорим о статье которая написанна выше, то в ней строчку:
// Проверяем правильность данных
if($form->validate('login')) {
// если всё ок - кидаем на главную страницу
$this->redirect(Yii::app()->homeUrl);
}надо заменить на :
// Проверяем правильность данных
$model->scenario = 'login';
if($form->validate()) {
// если всё ок - кидаем на главную страницу
$this->redirect(Yii::app()->homeUrl);
}

[guest] Maxxdev
Было сказано: Среда, 04 Ноябрь 2009
Точнее не $model->scenario = 'login';
а $form->scenario = 'login';
Вариант с $form->validate('login') мне кажется был более красивым решением =)

[adm] zolter
Было сказано: Среда, 04 Ноябрь 2009
Сенк ) то копи-паст сбивает :)
да старый вариант конечно был красивее, не знаю зачем так сделали

[guest] Dima
Было сказано: Понедельник, 09 Ноябрь 2009
Нашел интересную тему на форуме yii
http://www.yiiframework.com/forum/index.php?/topic/3133-registration-forms-little-tips/page__st__20
Регистрация с подтверждением email.
Для восстановления пароля используется секретный вопрос.
Вообщем все дела ;)

[guest] alexandrov
Было сказано: Понедельник, 01 Февраль 2010
после того как прохожу аутентификацию, делается переход на главную, но в меню стоит опять же ссылка "Вход", с чем это связано?

[guest] alexandrov
Было сказано: Четверг, 04 Февраль 2010
пробовал в двух браузерах...ну лан, наверное только у меня не работает. жду от автора продолжения статей по построению биллинга - оч. интересно!

[guest] rummer
Было сказано: Пятница, 26 Февраль 2010
Может метод getId() по какой то причине не перегружаться???
private $_id;
public function authenticate()
{
$login =$this->username;
$password = md5($this->password);
$user = User::model()->find("login=? AND password=?", array($login,$password));
if($user){
$this->_id = $user->id_user;
$this->_login = $user->login;
return true;
} else {
return false;
}
}
public function getId()
{
return $this->_id;
}
Вывожу - <H3>Ваш ID, <?=Yii::app()->user->getId();?>!
Вместо id_user, выводит имя пользователя из таблицы (login). Откуда что берется?!

[guest] Гость
Было сказано: Понедельник, 12 Апрель 2010
Думаю лучше мню сделать через zii как в оригинале :)
<?php $this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'Главная', 'url'=>array('/post/index')),
array('label'=>'Вход', 'url'=>array('/user/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Регистрация', 'url'=>array('/user/registration'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Выход ('.Yii::app()->user->name.')', 'url'=>array('/user/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>

[adm] zolter
Было сказано: Понедельник, 12 Апрель 2010
Конечно! Просто статья писалась когда был yii 1.0.x, и zii тогда не существовало :)

[guest] Гость
Было сказано: Пятница, 23 Апрель 2010
Статья замечательная! А подскажите, как и где пароль можно через md5 пропустить, чтобы в базу открытые пароли не писать.

[guest] Гость
Было сказано: Пятница, 23 Апрель 2010
Кажеься понял
$form->passWD = md5($_POST['User']['passWD']);
Может есть что поинтереснее?
И еще вопрос, как записать текущую дату? - внедрить NOW()

[adm] zolter
Было сказано: Пятница, 23 Апрель 2010
Спасибо за хороший отзыв! :)
По поводу шифрования пароля - совершенно верно, md5 будет вполне достаточно. Можете делать двойной md5. Если используете md5 не забудьте тогда еще в UserIdentity сделать:
else if($record->passwd!==md5($this->password))По поводу NOW() делайте вот так:
$form->peremenaia_vremeni = new CDbExpression('NOW()');

NickSun
Было сказано: Пятница, 30 Апрель 2010
Как быть в такой ситуации:
На каждой странице сайта есть форма авторизации которая появляется при нажатии на кнопку (т.е. чтоб авторизоваться переходить на другую страницу не нужно). И собственно вопрос: где и как нужно создать модель формы, чтобы она успешно отрисовалась не зависимо от нашего местоположения на сайте (т.е. не зависимо от экшина и контроллера).

[guest] zolter
Было сказано: Суббота, 01 Май 2010
Очень просто. Для формы авторизации создаете отдельный виджет. А уже в лаяуте делаете его вывод. И получится что на каждой странице за которую отвечает лаяут - будет ваша форма авторизации

NickSun
Было сказано: Суббота, 01 Май 2010
Спасибо, виджет как раз то что нужно! А этот редирект $this->redirect(Yii::app()->user->returnUrl); вернет на страницу с которой авторизовались?

[guest] Гость
Было сказано: Пятница, 07 Май 2010
что за странное поле в таблице User "Salt" в стандартном демо блоге, для чего оно, и какую роль оно играет? Спасибо!

[guest] Гость
Было сказано: Суббота, 08 Май 2010
Насколько я уже понял читая доки что поле Salt это слово(секрет) которое в перемешку с паролем зашифруеться в md5 чтоб эще больше сделать безопасным пароль, прав ли я? вы я так понял в своем примере реестрации не расматривали такой шифровки

[guest] Гость
Было сказано: Суббота, 08 Май 2010
В моем примере для упрощения шифрование не используется.

[guest] Jay
Было сказано: Суббота, 29 Май 2010
Salt - как правило случайное значение, которое используется для подмешивания в пароль и может храниться где-то в базе (своя salt для каждого пользователя).
Двойное md5 или любое другое двойное хеширование приводит к меньшей криптостойкости. Это связано с увеличением числа коллизий, то есть когда хеш может быть одинаковым для разных исходных данных.

[guest] Гость
Было сказано: Четверг, 12 Август 2010
у меня не получается сделать ни регистрацию, ни авторизацию. какие-то проблемы с валидацией. только я не могу понять что не так. подскажите пожалуйста. выводится такая ошибка:
preg_match(): Compilation failed: invalid UTF-8 string at offset 12
ошибка одинаковая для регистрации и авторизации.

[guest] Гость
Было сказано: Четверг, 12 Август 2010
вот еще что пишет:
Source File
C:\work\yii\framework\validators\CRegularExpressionValidator.php(44)
00032: * Validates the attribute of the object.
00033: * If there is any error, the error message is added to the object.
00034: * @param CModel the object being validated
00035: * @param string the attribute being validated
00036: */
00037: protected function validateAttribute($object,$attribute)
00038: {
00039: $value=$object->$attribute;
00040: if($this->allowEmpty && $this->isEmpty($value))
00041: return;
00042: if($this->pattern===null)
00043: throw new CException(Yii::t('yii','The "pattern" property must be specified with a valid regular expression.'));
00044: if(!preg_match($this->pattern,$value))
00045: {
00046: $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} is invalid.');
00047: $this->addError($object,$attribute,$message);
00048: }
00049: }
00050: }
00051:

[guest] zolter
Было сказано: Пятница, 13 Август 2010
Удалите в rules тогда проверку на допустимые символы в логине:
array('login', 'match', 'pattern' => '/^[A-Za-z0-9А-Яа-я\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),

[guest] Гость
Было сказано: Пятница, 13 Август 2010
спасибо=) помогло. авторизация теперь работает, а вот регистрация нет. переходит на страницу успешной регистрации, но в таблицу в бд ничего не записывает.

[guest] Илья
Было сказано: Вторник, 23 Ноябрь 2010
думаю, стоит сделать статьи для новой версии фреймворка, а то разбираться почему не работает как то не хочется. Тем более CForm используется не так, как рекомендует разработчик

vlad
Было сказано: Пятница, 28 Январь 2011
Автор, спасибо за статью, только есть одна просьба :
выложите дамп БД, или покажите ссылку, если она была ранее представлена.
Спасибо.

[guest] Гость
Было сказано: Понедельник, 04 Июль 2011
session_regenerate_id() [<a href='function.session-regenerate-id'>function.session-regenerate-id</a>]: Cannot regenerate session id - headers already sent
An internal error occurred while the Web server was processing your request. Please contact the webmaster to report this problem.
Thank you.
вот что выдает если ввести правельные логгин и пароль при регистрации.

[guest] TranceSmile
Было сказано: Четверг, 18 Август 2011
Может быть у тебя файлы сохранены в UTF-8, а должны быть utf-8 without BOM

[guest] Гость
Было сказано: Вторник, 11 Октябрь 2011
Блин! Замучился разбираться уже...
Проблема: после валидации по правилу array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'registration') (у меня именно 'password' и 'password2') объект $form становиться девственно чистым и не обременённым какими-либо данными.
password2 - публичный атрибут, в который, почему-то не пишется значение формы повторения пароля password2 в момент присвоения $form->attributes = $_POST['Users'], приходиться делать $form->password2 = $_POST['Users']['password2']. Хотя в safeAttributes password2 присутствует.
В шоке от документации к фрейм-ворку. Даже на данной статье (которая не подходит к текущей версии) учиться гораздо проще)...

[guest] Maxx
Было сказано: Вторник, 11 Октябрь 2011
Попробуй делать проверку двух полей как автор этой статьи, через отдельный метод проверки. У меня compareAttribute в свое время тоже не хотел проверять, а мне было лень разбератся. Поэтому тоже испльзовал отдельный метод.

[guest] Гость
Было сказано: Суббота, 22 Октябрь 2011
Блин. Всё делаю по порядку, но не получается пройти авторизацию. При вводе любого логина и правильной капче выбрасывает на главную. Если ввести не правильную капчу, то выдает ошибку. На логины и пароли вообще внимание не обращает при авторизации.
Скачал Ваш архив тоже самое.

[guest] Гость
Было сказано: Суббота, 22 Октябрь 2011
Решилось как-то так:
В User.php заменил
array('passwd', 'authenticate', 'on' => 'login')
на
array('passwd', 'authenticate')
теперь всё ок.
Я так понял, что это разница в версиях. Может стоит указать в скобках что нужно изменить если у вас 1.1.
Спасибо за статьи.

[guest] yakoval
Было сказано: Четверг, 24 Ноябрь 2011
Насчет safeAttributes(): как понял, эта функция называется getSafeAttributeNames(). Была аналогичная проблема с пустотой поля passwd2, когда изменил имя функции все заработало.

[guest] Гламурная птица
Было сказано: Воскресенье, 01 Январь 2012
Добрый день.
У сеня почемуто не получается содать поле password2. Я пишу: CHtml::activePasswordField($form, 'password2'), а при загрузке сраниы вылетает ошибка: "Не определено свойство "User.password2"."
Я его в safeAttributes записал. Не подскажите, в чем проблемма?


