Difference between #1 and #2 of Adding login form to each page

unchanged
Title
Adding login form to each page
unchanged
Category
Tutorials
unchanged
Tags
changed
Content
After adding proper form to the main layout, like:

~~~
[php]
...
if(Yii::app()->user->isGuest):
  echo CHtml::beginForm(array('site/login'));
  ...
~~~

You may recognize that the user does not get redirected to the previous page
correctly.

This is because CWebUser::loginRequired() is not invoked, thus proper states are
not saved before the user logs in.

If you want to preserve the referrer you can attach an event handler to your
application onEndRequest event with the following content:

~~~
[php]
$app=Yii::app();
if($app->createUrl($app->user->loginUrl[0])!=$app->request->getUrl())
	$app->user->setReturnUrl($app->request->getUrl());	$app->user->setReturnUrl(Yii::app()->request->getUrl());
~~~

The above code does the following: if the user is at the login page, the
referrer is not saved for future reference (otherwise he will be redirected to
the login page right after he logged in, which is, of course, not the desired
effect).

In any other cases, the previously viewed page is reloaded if the user logs in
with the form in the header.

Make sure your login action makes use of this:
~~~
[php]
$this->redirect(Yii::app()->user->returnUrl);
~~~

Your logout process might also use this feature and not send the user back to
the front page.

If you are not sure how to attach an event handler to your application object,
open up your config file and insert this function at the head of the code
(before returning the array):

~~~
[php]
function endRequest($event)
{
	$app=Yii::app();
	if($app->createUrl($app->user->loginUrl[0])!=$app->request->getUrl())
		$app->user->setReturnUrl(Yii::app()->request->getUrl());
}
~~~

Attaching could be done in your config:

~~~
[php]
return array(
...
	'onEndRequest'=>'endRequest',
...
~~~