Setflash آموزش: رفع مشکل کار با

[font="Tahoma"][rtl]گاهی اوقات شاید توی پروژه نیاز پیدا کنید که یک پیغام رو توی یک صفحه ذخیره کنید و توی صفحه دیگه نشون بدین. خوب همونطور که میدونید، یکی از راهکارهای مناسب، استفاده از Yii::app()->user->setFlash توی صفحه مبدأ و خوندن پیام با getFlash توی صفحه مقصد هست. یکی از دوستان میخواست وقتی کاربر ثبت نام کرد، پیغام ثبت نام رو با این روش توی متد actionCreate کنترلر User تنظیم کنه و کاربر رو دوباره ریدایرکت کنه به همون صفحه. درنتیجه چنین کدی نوشته بود:[/rtl][/font]




if($model->save()) {

    Yii::app()->user->setFlash('success', 'Registration Successful');

    $this->redirect('user/create');

}



[font="Tahoma"][rtl]ظاهراً این کد مشکلی نداره ولی مسئله اینجاست که کار نمیکنه و این دوستمون میگفت باگ Yii هست، درحالی که واقعاً اینطور نیست. اما علت اصلی این مشکل چیه؟ علتش اینه که setFlash با سشن کاربر کار میکنه و در Yii کاربری که لاگین نکرده (Authenticated User نیست) سشن نداره. برای حل این مشکل، کافیه سشن Yii رو دستی فعال کنید. در اینجا نسخه اصلاح شده همون کد قبلی رو میبینید:[/rtl][/font]




if($model->save()) {

    Yii::app()->session->open();

    Yii::app()->user->setFlash('success', 'Registration Successful');

    $this->redirect('user/create');

}



[font="Tahoma"][rtl]البته این مسئله همه جا صدق میکنه. برای مثال، کد زیر هم درست کار نمیکنه:[/rtl][/font]




if(Yii::app()->user->logout()) {

    Yii::app()->user->setFlash('success', 'Logged out successfully!');

    $this->redirect('user/login');

}



[font="Tahoma"][rtl]ولی این کد درست کار میکنه:[/rtl][/font]




if(Yii::app()->user->logout()) {

    Yii::app()->session->open();

    Yii::app()->user->setFlash('success', 'Logged out successfully!');

    $this->redirect('user/login');

}



[font="Tahoma"][rtl]چون متد logout از CWebUser دستور session_destroy رو صدا میزنه و دیگه سشنی درکار نیست که بخوایم Flash Message توش بگذاریم ولی با فراخوانی مجدد Yii::app()->session->open سشن دوباره باز میشه.

امیدوارم این آموزش برای دوستان مفید باشه و به کارشون بیاد.

بهتره عادت کنیم همیشه اول مستندات رو به خوبی بخونیم و بعد، اگه برنامه مطابق نظر ما کار نکرد، وصله Bug بهش بچسبونیم.[/rtl][/font]

[right]ممنون

خوب بود :)[/right]

[font="Tahoma"][rtl]چرا یک کلاس برای وب یوزر نمیسازید و این مشکل رو توش حل نمیکنید . به طور مثال این کلاس رو توی کامپوننت ها باشه [/rtl][/font]


class WebUser extends CWebUser

{

	function init()

	{

		$session=new CHttpSession;

		$session->open();

	}

}

[rtl][font="Tahoma"]حالا توی فایل config/main.php معرفی اش میکنیم بصورت زیر[/font][/rtl]


'user'=>array(


			'allowAutoLogin'=>true,

			'loginUrl'=>array('user/login'),

		),

[rtl]به[/rtl]


'user'=>array(

			'class'=>'WebUser' ,

			'allowAutoLogin'=>true,

			'loginUrl'=>array('user/login'),

		),

[font="Tahoma"][rtl]این هم راه خیلی خوبیه. من فقط خواستم این نکته رو یادآوری کنم که باید سشن مجدداً باز بشه. اما بازهم فکر نمیکنم این روش، درمورد مثال دوم (Logout) کار کنه. منظورم اینه که دوباره بعد از Logout اکشنی از کلاس WebUser رو صدا نزدیم که بخواد متد init اون رو صدا بزنه. پس باز هم باید بطور دستی سشن رو دوباره باز کنیم.[/rtl][/font]