[font="Tahoma"][rtl]حتماً تا حالا شده به این نکته فکر کنید که چرا با Yii::app()->user نمیشه به خصوصیات مدل کاربر جاری دسترسی پیدا کرد و فقط id و name رو داریم. علت این مسئله مشخصه: کامپوننت User برای مدیریت یکسری کارها مثل لاگین و لاگ اوت و… درنظر گرفته شده و یک اکتیو رکورد نیست. اما چطوری این مشکل رو حل کنیم و بتونیم توی هر قسمت دلخواه خودمون، به مدل کاربر جاری دسترسی پیدا کنیم؟ راه حل خیلی ساده است. کافیه توی کلاس کنترلر یعنی فایل protected/components/Controller.php این کدها رو اضافه کنید:[/rtl][/font]
class Controller extends CController {
public $currentUser;
public function init() {
if(!Yii::app()->user->isGuest) {
$this->currentUser = User::model()->findByPk(Yii::app()->user->id);
}
}
}
[font="Tahoma"][rtl]از اونجا که این کلاس، والد تمام کنترلرهای شماست و متد init هم قبل از هر اکشن توی سازنده صدا زده میشه، به راحتی همه جا (توی کنترلرها و اکشنها و درنتیجه توی همه ویوها) با کمک this->currentUser$ میتونید به مدل اکتیو رکورد کاربر جاری دسترسی پیدا کنید و ازطریق اون، هر فیلدی رو که خواستین در مکان موردنظر نمایش بدین.
امیدوارم که این آموزش کوچک، براتون کاربردی باشه.[/rtl][/font]
[right] [/right][rtl][right][font="Tahoma"]بسیار عالیست[/font][/right][right][font="Tahoma"]اتفاقا از توضیحاتتون چیزای جدیدی یاد گرفتم، اینکه این کنترلری که گفتید زودتر از همه کنترلر ها اجار میشه …[/font][/right][right][font="Tahoma"]خود کد هم که جای خودش رو داره.[/font][/right][right] [/right][right][font="Tahoma"]سپاس[/font][/right][/rtl][right] [/right]
[font="Tahoma"][rtl]بهتر نیست یه کلاس از CWebUser ایجاد کنید
و یه تابع توش داشته باشید تا هر موقع لازم بود مدل کاربر رو باهاش صدا کنید
[/rtl][/font]
class your_class extends CWebUser{
//like other functions
public function getCurrentuser(){
return User::model()->findByPk(Yii::app()->user->getState('id'));
}
[font="Tahoma"][rtl]خیلی کارها میشه کرد تا کد بهینه تر بشه و هدف اصلی این تاپیک، دادن ایده اصلی (کمک گرفتن از کلاس Controller برای ایجاد قابلیت کاربرد در تمام کنترلرها) بوده که فکر میکنم موفق شده. ضمناً چون Gii بطور پیشفرض از Controller بعنوان والد استفاده میکنه، بهتره متد رو به همین کلاس اضافه کنیم چون معمولاً کمتر پیش میاد که کلاس CWebUser رو بخوایم تغییر بدیم و اصلاً اون، کارش جداست (مدیریت ورود و خروج و وضعیتهای مختلف کاربر نه لزوماً کار با مدل کاربر جاری و بهتره توی ویرایشهایی که انجام میدیم، مفاهیم پایه ای فریمورک رو دستکاری نکنیم. البته این موضوع، یک قانون نیست بلکه یک توصیه است چون توی کارهای تیمی و گروهی و یا وقتی که یک نفر دیگه میخواد توی رفع اشکال پروژه به شما کمک کنه، بهتره که کدتون طبق استانداردهایی که همه قبولش دارن نوشته شده باشه (مزیت اصلی فریمورک هم همینه) تا لازم نباشه بهش توضیح بدین فلان متد از کجا اومده و چرا WebUser توی پروژه شما رفتارش فرق میکنه با خود فریمورک و…[/rtl][/font]