آموزش: دسترسی به مدل کاربر جاری در تمام کنترلرها و اکشنها

[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]

[rtl][font="Tahoma"]لاین 4 یه $ زیادیه

[/font][/rtl]

[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]ممنون از نظر لطفتون. اون $ اضافه رو هم درست کردم.[/rtl][/font]

[right][font="Tahoma"]بهینه تر[/font][/right]


<?php

class Controller extends CController {

    public static $currentUser;

    public function init() {

        if(!Yii::app()->user->isGuest) {

            if(empty(self::$currentUser))

                self::$currentUser = User::model()->findByPk(Yii::app()->user->id);

        }

    }

}



[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'));

    }



and:


$user_class = Yii::app()->user->currentuser;

[font="Tahoma"][rtl]خیلی کارها میشه کرد تا کد بهینه تر بشه و هدف اصلی این تاپیک، دادن ایده اصلی (کمک گرفتن از کلاس Controller برای ایجاد قابلیت کاربرد در تمام کنترلرها) بوده که فکر میکنم موفق شده. ضمناً چون Gii بطور پیشفرض از Controller بعنوان والد استفاده میکنه، بهتره متد رو به همین کلاس اضافه کنیم چون معمولاً کمتر پیش میاد که کلاس CWebUser رو بخوایم تغییر بدیم و اصلاً اون، کارش جداست (مدیریت ورود و خروج و وضعیتهای مختلف کاربر نه لزوماً کار با مدل کاربر جاری و بهتره توی ویرایشهایی که انجام میدیم، مفاهیم پایه ای فریمورک رو دستکاری نکنیم. البته این موضوع، یک قانون نیست بلکه یک توصیه است چون توی کارهای تیمی و گروهی و یا وقتی که یک نفر دیگه میخواد توی رفع اشکال پروژه به شما کمک کنه، بهتره که کدتون طبق استانداردهایی که همه قبولش دارن نوشته شده باشه (مزیت اصلی فریمورک هم همینه) تا لازم نباشه بهش توضیح بدین فلان متد از کجا اومده و چرا WebUser توی پروژه شما رفتارش فرق میکنه با خود فریمورک و…[/rtl][/font]

[font="Tahoma"][rtl]

با توجه به آموزشی بودن این تاپیک، یک نکته هست که در کد بالا بد نیست گوشزد کنم.

وقتی کد بالا رو تست کنید. currentUser در کلاس‌های مشتق شده از Controller دیگه موجود نیست

مثلا در کلاس userClass به شکل زیر:[/rtl][/font]




class user extends Controller {

   public function actionIndex() {

      echo $this->currentUser->username; 

    }



[font="Tahoma"][rtl]error خواهد داد

میگه currentUser وچود نداره

کد زیر هم منجر به نمایش Error قرمز رنگ میشه که زیرش نوشیتم باز

[/rtl][/font]




class user extends Controller {

   public function actionIndex() {

     echo self::$currentUser->username;

    }



[color="#FF0000"]

Fatal error: Access to undeclared static property: CBaseController::$currentUser in /home/protected/…[/color]

[right][font="Tahoma"][indent]

دوست عزیز amiri

شما صال با مباحث PHP مشکل داری .

متغییر استاتیک اومدی با this بهش دسترسی پیدا کردی.

خب معلومه خطلا میده برادر

باید با self بهش دسترسی پیدا کنی

!!!!

[/indent][/font][/right]

[font="Tahoma"][rtl]با self هم خطا می داد که در پست بالا بروز کردم[/rtl][/font]

[right]

شما از

parent

استفاده کن

[/right]


echo parent::$currentUser->username;

[font="Tahoma"][rtl]کد بالا در داخل اکشن خطای زیر رو داد:[/rtl][/font]


Trying to get property of non-object

[font="Tahoma"][rtl]

وقتی هم داخل ویو قرار دادم، بازهم خطا داد.

دوست عزیز، لطفا قبل از اظهار نظر، صحت ایده خودتون رو چک کنید

!!!![/font][/rtl]

[font="Tahoma"][rtl]در ضمن پیگیری من در این خصوص صرفا برای اینه که این ایده خیلی خوب و کاربردی هستش

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

[right]

دوست عزیز من وقتشو نداشتم امتحان کنم ولی باید جواب میداد

شما که اصلا مفاهیم پایه رو بلد نیستید اومدید فریمورک کار می کنید ؟!!

بلد نیستید به متغییر استاتیک دسترسی پیدا کنید

اومدید با دیس میخایید بهش دسترسی پیدا کنید

:)

[/right]

[right][font="Tahoma"]

من امتحان کردم هم با سلف هم با پرنت درست جواب داد .

شما شاید داخل متغییر خالی هست که اررو میده یا شایدم شما جایی استباه کردید وگرنه درست جواب میده .

کدوم حرکت؟؟؟

سعی کردم جو متشنج کنم ):

بیخیال شما مفاهیم پایه رو نمیدونی اومدی پست میزاری میگی خطا

[/font][/right]

[font="Tahoma"][rtl]این چه وضعشه؟؟[/rtl][/font]


class user extends Controller {



باید بنویسی

class UserController extends Controller{