Показать сообщение отдельно

  #3  
Старый 10.07.2009, 10:00
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

Авторизация
Для авторизации мы будем использовать метод actionLogin, контроллера Site и шаблон /protected/views/site/login.php, содержимое которого мы поменяем на

Код HTML:
<div id="bodyPanel">
<h2>Войдите</h2>
<form action="/site/login/" method="POST">
<table width="100%">
<tr>
<td width="20%">Имя пользователя</td>
<td><input type="text" name="Users[login]" class="long_field"></td>
</tr>
<tr>
<td width="20%">Пароль</td>
<td><input type="password" name="Users[password]" class="long_field"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="&nbsp;&nbsp;Войти&nbsp;&nbsp;" />
</td>
</tr>
</table>
</form>
</div>
Так же придётся сменить содержимое метода "authenticate" компонента UserIdentity (/protected/components/UserIdentity.php).
Этот метод содержит код благодаря которому пользователи могут входить на сайт. Работает он сейчас с двумя аккаунтами, информация о которых
внесена непосредственно внутрь метода. Заменим его на код который будет брать информацию из базы данных. Сначала объявим два новых свойства:

PHP код:
private $_id;
private 
$_name
Затем поменяем полностью код метода "authenticate":

PHP код:
// Получаем имя пользователя и пароль
$username =$this->username;
$password md5($this->password);
// Ищем их в БД
$user Users::model()->find("login=? AND password=?", Array($username,$password));
// Если пользователь не найден возвращаем false
if($user === null) return false;
// Если найден то заполняем свойства класса
$this->_id $user->id;
$this->_name $user->login;
// и возвращаем true
return true
И опишем ( а точнее перегрузим уже существующие ) два дополнительных общедоступных метода, возвращающих вышеуказанные свойства.

PHP код:
public function getId()
{
return 
$this->_id;
}

public function 
getName()
{
return 
$this->_name;

Вернёмся к контроллеру. Затрите код его метода actionLogin и поместите туда следующее

PHP код:
if(isset($_POST['Users']))
{
// Авторизируем пользователя
$identity = new UserIdentity($_POST['Users']['login'],$_POST['Users']['password']);
// Если он не авторизирован
if( $identity->authenticate() )
{
// Если всё хорошо то заносим в данные
// пользователя информацию об авторизации
Yii::app()->user->login($identity);
// И перемещаем его на главную страницу
$this->redirect("/");
}
// Если форма не отправлена то просто отображаем её
} else $this->render('login'); 
Всё, теперь в "Yii::app()->user" ( http://www.yiiframework.com/doc/api/CWebUser ) буде содержаться информация о вошедшем пользователе. А его имя
и номер мы получим с помощью "Yii::app()->user->getName()" и "Yii::app()->user->getId()" соответственно.
Помните надпись "Здравствуйте гость!" на главной? Давайте сделаем так, чтобы она менялась в зависимости от того авторизирован пользователь или нет.
Добавим в языковой файл соответствующую фразу.

PHP код:
"hello_user"   => "Здравствуйте {login}!"
А индексную страницу изменим вот так.

Код HTML:
<h2>
<?if(Yii::app()->user->isGuest):?>
<?=Yii::t("common","hello_guest")?>
<?else:?>
<?=Yii::t("common","hello_user",Array("{login}" => Yii::app()->user->getName()))?>
<?endif;?>
</h2>
<p>
<?=Yii::t("common","welcome")?>
</p>
Здесь мы проверяем - если пользователь является гостем то выводим сообщения для гостей, а если нет - выводим фразу приветствия, указывая в качестве
параметра "login" (который содержится в фразе) логин пользователя. И немного модифицируем главное меню. Пусть авторизированный пользователь видит
ссылки на главную, на выход и на создание новой записи. Для этого, в layout`e, заменим код

Код HTML:
<ul>
<li><a href="/site/login">Вход</a></li>
<li><a href="/site/register/">Регистрация</a></li>
<li><a href="/">Главная</a></li>
</ul>
на

Код HTML:
<ul>
<?if(Yii::app()->user->isGuest):?>
<li><a href="/site/login/">Вход</a></li>
<li><a href="/site/register/">Регистрация</a></li>
<?else:?>
<li><a href="/site/logout/">Выход</a></li>
<li><a href="/records/create/">Написать</a></li>
<?endif;?>
<li><a href="/">Главная</a></li>
</ul>
Регистрируемся, входим и проверяем как изменяется главная страница.