کار با فرم ها در Yii Framework

شروع موضوع توسط hamed kh ‏12 آوریل 2012 در انجمن مقالات و آموزش‌ها

کلمات کلیدی:
  1. hamed kh

    hamed kh New Member

    ارسال‌ها:
    5
    تشکر شده:
    2
    امتیاز دستاورد:
    1
    مقدمه:
    اگر یک برنامه نویس وب هستید می دانید که فرم های ورودی داده جزء جدایی ناپذیر برنامه های مبتنی بر وب می باشند و جمع آوری داده های ورودی آنها یکی از مهمترین بخش های اینگونه برنامه ها است.علاوه بر طراحی فرم ها که بسیار با اهمیت می باشد، توسعه دهندگان وب باید بتوانند داد های ورودی را جمع آوری کرده،اعتبار سنجی را بر روی این داده ها انجام داده،در صورت وقوع خطا پیغامی مناسب را به کاربر ارائه نموده و در پایان نیز داده ها را درمکانی که برای اینکار در نظر گرفته شده است ذخیره کنند.در صورتی که از ابزار های مناسبی استفاده ننمایید انجام اینگونه عملیات می تواند در برخی از مواقع بسیار درد سر ساز و پیچیده گردد.خوشبختانه Yii با استفاده از الگوی MVC زیرساختی مناسب را برای اینگونه کار ها در اختیار توسعه دهندگان قرار می دهد.در این مقاله سعی می شود بطور مفصل در مورد مبانی کار با فرم های ورودی در این چهارچوب کاری پرداخته شود.
    پیشنهاد می شود در هنگام مواجهه با فرم ها در این چهارچوب کاری، ابتدا مدل خود را آماده کنید که بیانگر فیلد های موجود در فرمتان باشد.پس از آن کد های لازم برای مدیریت ارسال فرم را در کنترول کننده مورد نظر خود اضافه کنید و نهایتا به سراغ ساخت نمای فرم بر اساس کنترول کننده و مدل خود بروید.در این مقاله سعی می شود بر اساس همین راهکار مطالب مورد نظر بیان شود.

    ساخت مدل:
    می توان گفت مهمترین بخش کار با فرم ها ساخت مدل داده ای است که بیانگر نوع داده های ورودی و عملیات مورد نیاز برای آنها می باشد.ساخت مدل کاری است که شما باید پیش از نوشتن کدهای HTML در نما آن را انجام دهید.در حقیقت در مدل ما باید تصمیم بگیریم که چه داده هایی را می خواهیم دریافت کنیم و چه قوانینی را در مورد آنها باید اعمال نماییم.همانطور که می دانید مدل ها مکان اصلی نگهداری و سنجش اعتبار داده ها می باشند.برای توضیحات بیشتر در مورد مدل ها می توانید سری به مقاله معرفی مدل و نما بزنید.
    همانطور که در مقالات گذشته بیان شد در Yii دو نوع مدل داریم که بر اساس مورد استفاده داده های جمع آوری شده باید تصمیم بگیریم کدامیک را بکار بریم.در صورتی که نیاز باشد داده های ورودی پس از جمع آوری در پایگاه داده ذخیره کنیم باید از نوع Active Record استفاده کنیم و در صورتی که نیازی به ذخیره داده ها پس از استفاده نداشته باشیم می توانیم از FormModel ها بهره بریم.در این مقاله بدلیل سادگی در بیان مطالب از نوع دوم یعنی FormModel استفاده می کنیم.
    بعنوان اولین گام مدلی را با نام LoginForm ایجاد می کنیم تا از آن برای جمع آوری داده های ورودی در یک صفحه ورود(Login) استفاده خواهیم کرد.از آنجایی که این داده های ورودی تنها بمنظور احراز هویت به کار برده می شود و نیازی به ذخیره ندارد این مدل را از نوع FormModel تعریف می کنیم.

    PHP:
    class LoginForm extends CFormModel
    {
        public $username;
        public $password;
        public $rememberMe=false;
    }
    همانطور که ملاحظه می کنید سه صفت در مدل تعریف شده است که عبارتند از : $username، $password و $rememberMe.از این صفات برای نگهداشتن نام کاربری و رمز عبور و نیز نگهداری لاگین کاربر استفاده می شود.صفت $rememberMe را همانطور که مشاهده می کنید مقداری پیش فرض برابر false داده ایم که باعث می شود در نمای فرم، فیلد چک باکس مربوط به آن تیک خورده نباشد.
    پس از تعریف صفات مورد نظر در مدل، نوبت به تعریف قوانینی بمنظور کنترول داده های ورودی و سنجش اعتبار آنها می رسد.این کار باید در مدل و با تعریف مجموعه ای از قوانین(Rules) صورت بگیرد.بدین منظور باید متدی در مدل را با عنوان rules() تعریف کنیم و قوانین را در قالب یک آرایه تعیین نماییم.در زیر نمونه مدل ما را مشاهده می کنید.
    PHP:
    class LoginForm extends CFormModel
    {
        public $username;
        public $password;
        public $rememberMe=false;
     
        private $_identity;
     
        public function rules()
        {
            return array(
                array('username, password', 'required'),
                array('rememberMe', 'boolean'),
                array('password', 'authenticate'),
            );
        }
     
        public function authenticate($attribute,$params)
        {
            $this->_identity=new UserIdentity($this->username,$this->password);
            if(!$this->_identity->authenticate())
                $this->addError('password','Incorrect username or password.');
        }
    }
     
    همانطور که در کد بالا مشاهده می کنید صفات $username و $password هر دو الزامی هستند،$password باید احراز هویت (authenticate) گردد و نیز $rememerMe باید از نوع Boolean باشد.این قوانین باید در قالب زیر تعریف گردند:
    PHP:
    array('AttributeList', 'Validator', 'on'=>'ScenarioList', ...additional options)
    در فرمت بالا AttributeList لیست صفاتی است که باید قانون مربوط بر روی آنها اعمال گردد.Validator مشخص کننده اینست که چه نوع اعتبار سنجی باید بر روی لیست صفات مربوطه صورت گیرد.پرامتر on اختیاری است و بیان می کند که این قانون در چه سناریو هایی باید بکار گرفته شود.بعنوان مثال ممکن است در سناریوی درج پرکردن برخی از فیلد ها الزامی است، اما در سناریوی جستجو ممکن است نیازی نباشد قانون را اعمال کنیم.با پارامتر on می توانیم این تفکیک را انجام دهیم.گاهی اوقات برخی از validator ها پارامتر هایی را بعنوان مقدار دریافت می کنند، بعنوان مثال در مورد length باید پارامتر های min و max این validator تعیین گردد.برای این منظور از زوج های نام-مقدار در قانون استفاده می کنیم.در زیر نمونه ای از آن را ملاحظه می فرمایید.
    PHP:
     array('username', 'length', 'min'=>3, 'max'=>12)
    می توان Validator ها را از سه طریق تعریف نمود.روش اول این است که در مدل مربوطه متدی بعنوان Validator برای انجام عمل اعتبار سنجی نوشته و نام آن را در تعریف قوانین بیاوریم.مانند آنچه در مورد authenticate در مثال فوق داشتیم.امضای Validator هایی که تعریف می کنیم باید بصورت زیر باشد:
    PHP:
     /**
     * @param رشته  $attribute  صفاتی هستند که باید سنجیده شوند
     * @param آرایه $params پارامتر هایی هستند که برای انجام اعتبار سنجی مورد نیاز هستند
     */

    public function ValidatorName($attribute,$params) { ... }
    در روش دوم می توان کلاسی برای Validator تعریف نماییم و نام آن را بعنوان validator بیاوریم. در این حالت هنگامی که قانونی بکار گرفته می شود، نمونه ای از کلاس Validator ما ایجاد شده و عمل اعتبار سنجی را انجام می دهد.در این حالت نیز می توانیم پارامتر هایی اضافی را به Validator ارسال کنیم.توجه داشته باشید کلاس Validator باید از نوع Cvalidator باشد.

    علاوه بر روش های بالا، در Yii بمنظور تسهیل کار کاربران یک سری Validator های پیش ساخته قرار داده شده اند که در قوانین اعتبار سنجی از نام مستعار آنها استفاده می کنیم.مثلا در یکی از مثال های بالا از Required استفاده نمودیم که در حقیقت نامی مستعار برای CRequiredValidator هستش.این Validator ما را مطمئن می سازد که هیچ مقدار فیلدی در فرم خالی ارسال نشود.در زیر لیستی کامل از این Validator ها را مشاهده می کنید:
    · Boolean: نام مستعاری برای CBooleanValidator می باشد که ما را مطمئن می سازد مقدار یک صفت تنها True و یا false باشد.
    · Captcha: نام مستعاری برای CCaptchaValidator می باشد که در فرم هایی که کد های اعتبار سنجی captcha استفاده می شود کاربرد دارد و بررسی می نماید که کد ورودی با کلمه امنیتی برابر باشد.
    · Compare: نامی مستعار برای CCompareValidator است که یکسان بودن مقدار دو صفت را با یکدیگر بررسی می نماید.
    · Email: نامی مستعار برای CEmailValidator است که بررسی می کند که مقدار یک صفت حتما یک ایمیل باشد.
    · Date: نام مستعاری برای CDateValidator است که فرمت تاریخ صفتی را بررسی می کند.
    · Default: نام مستعاری برای CDefaultValidator می باشد که مقداری پیش فرض را به یک صفت نسبت می دهد.
    · Exist: نامی مستعار است برای CExistValidator که ما را مطمئن می سازد مقدار یک صفت در یکی از ستون های یک جدول وجود داشته باشد.
    · File: نام مستعاری برای CFileValidator است که بررسی می کند مقدار صفت شامل نام یک فایل آپلود شده باشد.
    · Filter: نام مستعاری برای CFilterValidator می باشد که مقدار یک صفت را با استفاده از یک فیلتر تغییر شکل می دهد.
    · In: نام مستعاری برای CRangeValidator است که بررسی می کند مقدار یک صفت در لیستی از پیش تعریف شده باشد.
    · Length: نامی مستعار برای VStringValidator می باشد که طول رشته ورودی را با مقدار هایی تعیین شده مقایسه می کند.
    · Match: نامی مستعار برای CReqularExpressionValidator می باشد که بررسی می کند مقدار یک صفت با عبارتی با قاعده تطبیق داشته باشد.
    · Numerical: نامی مستعار برای CNumberValidator می باشد که عدد بودن مقدار صفتی را مشخص می کند.
    · Required: نام مستعار CRequirdeValidator می باشد که بررسی می کند مقدار یک صفت خالی نباشد.
    · Type: نام مستعار CTypeValidator می باشد که بررسی می کند نوع یک صفت با نوعی از پیش تعریف شده برابر باشد.
    · Unique: نام مستعار CUniqueValidator می باشد است که یکتا بودن مقدار صفتی را در یک ستون از پایگاه داده ها بررسی می نماید.
    · Url: نام مستعار CUrlValidator می باشد که معتبر بودن یک Url را بعنوان صفتی ورودی بررسی می نماید.
    در زیر می توانید مثال هایی از برخی از validator های معرفی شده را ببینید.
    PHP:
    array('username', 'required'),

    array('username', 'length', 'min'=>3, 'max'=>12),

    array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),

    array('password', 'authenticate', 'on'=>'login'),
    نسبت دادن مقادیر ارسالی به صفات:
    پس از ارسال یک فرم،در کنترول کننده می توان بصورت یکجا تمامی پارامتر های دریافتی از فرم را به صفات تعریف شده در مدل نسبت داد.عبارت زیر اینکار را برای ما انجام می دهد.
    PHP:
     $model=new LoginForm;
    if(isset($_POST['LoginForm']))
        $model->attributes=$_POST['LoginForm'];
    آخرین دستور این عبارت تمامی مقادیر موجود در $_POST[‘LoginForm’] را در صفات مربوطه قرار می دهد که خیلی روش مناسب و امنی نیست.در واقع عبارت بالا معادل تکه کد زیر می باشد:
    foreach($_POST['LoginForm'] as $name=>$value)
    PHP:
    {
        if($name is a safe attribute)
            $model->$name=$value;
    }
    تعریف پارامتر های امن(safe) بسیار با اهمیت و حیاتی است.بعنوان مثال کلید اصلی یک جدول را نباید بعنوان پارامتری امن تعریف نمود. چراکه به هکر ها و مهاجمان این شانس داده می شود تا کلید اصلی یک رکرود را تغییر داده و درنتیجه به داده هایی دسترسی پیدا نمایند که اجازه مشاهده انها را ندارند.

    تعریف یک متغیر از نوع امن (safe):

    اگر نام متغیری را در قوانین تعریف شده در مدل بیاوریم آن صفت در یک سناریوی خاص بعناون یک صفت امن در نظر گرفته می شود و امکان دستکاری آن وجود خواهد داشد.بعنوان مثال :
    PHP:
    array('username, password', 'required', 'on'=>'login, register'),
    array('email', 'required', 'on'=>'register'),
    در مثال بالا username و password در سنارویو های login و register الزامی هستند.در حالی که صفت email تنها در سناریوی register الزامی است.در نتیجه این صفات در سناریو های تعریف شده برایشان بعنوان صفت امن در نظر گرفته شده و در صورت نسبت دادن جمعی پارامتر ها مقادیر آنها در صفات مورد نظرشان قرار خواهد گرفت.توجه داشته باشید که صفت email تنها در سناریوی register بعنوان یک صفت امن در نظر گرفته می شود و در سناریوی login در نسبت دهی جمعی نادیده گرفته می شود.
    PHP:
     // in login scenario
    $model=new User('login');
    if(isset($_POST['User']))
        $model->attributes=$_POST['User'];
     
    // in register scenario
    $model=new User('register');
    if(isset($_POST['User']))
        $model->attributes=$_POST['User'];
    اما چرا ما نیاز داریم مشخص کنیم که آیا صفتی امن است یا خیر؟وقتی برای یک صفت، قوانین اعتبار سنجی متعددی تعریف می کنیم دیگر چه لزومی به اینکار وجود دارد؟
    بخاطر داشته باشید که قوانین اعتبار سنجی تنها برای داده های ورودی کاربران استفاده می شود،نه برای آن دسته از صفاتی که توسط کد برنامه تولید می شوند(مانند timestamp و یا کلید های اصلی که بطور خودکار تولید می شوند).بنابراین برای دادهایی که انتظار نداریم کاربران نهایی آنها را وارد کنند قوانین اعتبارسنجی وضع نمی کنیم.
    گاهی اوقت نیاز است که یک صفت را از نوع امن تعریف کنیم و ممکن است هیچ قانون مشخصی برای آن نداشه باشیم.بعنوان مثال ممکن است صفتی برای محتوای یک مقاله داشته باشیم که هیچ محدودیتی کاربر در ورود مقدار برای آن نداشته باشد.برای تعریف این صفت بصورت یک صفت امن مانند تکه کد زیر عمل می کنیم:
    PHP:
     array('content', 'safe')
    همچنین این امکان وجود دارد که صفتی را صریحا بعنوان یک صفت غیر امن تعریف نماییم:
    PHP:
    array('permission', 'unsafe')
    حالت دوم، یعنی تعریف صریح غیر امن بودن یک صفت بندرت اتفاق می افتد.برای مقدار دهی اینگونه صفات باید مستقیما از طریق کد برنامه به آنها مقادیری را نسبت دهیم:
    PHP:
    $model->permission='admin';
    $model->id=1;
    اجرای اعتبار سنجی :
    هنگامی که یک مدل را ایجاد می کنیم و داده های ورودی کاربر را در آن قرار می دهیم، باید بتوانیم عملیات اعتبار سنجی را به شکلی براه اندازیم تا قوانین تعریف شده در مدل برای صفاتمان، اعمال گردند.برای این منظور می توانیم از فراخوانی متد CModel::validate() استفاده کنیم.مقداری که این متد باز می گرداند مشخص می نماید که عملیات اعتبار سنجی موفقیت آمیز بوده است یا خیر.لازم بذکر است که در مورد مدل های CActivceRecord نیازی به این فراخوانی نیست و بمحض فراخوانی متد CActiveRecord:save() این کار بطور خودکار صورت می گیرد.
    در برخی از موارد نیازی نیست تمامی قوانین اعتبار سنجی بر روی صفات اعمال شود.برای این جداسازی می توانیم از تعریف سناریو ها استفاده کنیم.با تعیین سناریو، قوانین اعتبار سنجی تنها برای آن سناریو اعمال می گردند.برای مثال برای سناریوی Login ما تنها نیاز داریم نام کاربری و رمز عبور را بررسی کنیم و به سایر صفات کاری نداریم.در حالی که در سناریوی ثبت نام ممکن است بخواهیم صفات دیگری از قبیل ایمیل، آدرس و ... را بررسی کنیم.برای روشن تر شدن موضوع به مثال زیر توجه کنید که نحوه اعمال اعتبار سنجی را در سناریوی register به شما نشان می دهد.
    PHP:
    // creates a User model in register scenario. It is equivalent to:
    // $model=new User;
    // $model->scenario='register';
    $model=new User('register');
     
    // populates the input values into the model
    $model->attributes=$_POST['User'];
     
    // performs the validation
    if($model->validate())   // if the inputs are valid
        ...
    else
        ...
    برای آنکه یک قانون را به یک سناریوی خاص نسبت دهیم باید از کلمه “on” در تعریف قانون استفاده کنیم.در صورتی که از “on” استفاده نکنیم قانون ما در تمامی سناریو های اعمال خواهد شد.مثال:
    PHP:
    public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('password_repeat', 'required', 'on'=>'register'),
            array('password', 'compare', 'on'=>'register'),
        );
    }
    در مثال بالا قانون اول در تمامی سناریو ها اعمال می شود در صورتی که قوانین دوم و سوم تنها برای سناریوی register استفاده می شوند.


    نمایش خطای اعتبار سنجی:
    هنگامی که عمل اعتبار سنجی را انجام می دهیم، باید بتوانیم در صورت رخداد خطایی ، پیغامی مناسب را به کاربر نمایش دهیم.برای اینکار می توانیم از متد های CModel::getErrors() و CModel::getError() استفاده نماییم.
    متد اول تمامی خطاهای اعتبار سنجی را به ما باز خواهد گرداند در حالی که دومین متد تنها پسغام خطای اول را بر می گرداند.
    برچسب های صفات:
    یکی از قابلیت های خوبی که در Yii وجود دارد اینست که شما می توانید برچسب های مربوط به صفات را که در نما به کاربران نشان داده می شود در مدل بصورت پویا تعریف نمایید.برای این منظور کافی است متدی را با نام CAttributeLabels() را در مدل مورد نظر تعریف کرده و برچسب های هر صفت را در آن مشخص کنیم.
    ساخت کنش(Action) :
    هنگامی که مدل ما آماده شده، نوبت به نوشتن منطقی برای دستکاری صفات مدل می رسد.این منطق را در کنش کنترول کننده های می نویسیم.برای مثال برای یک فرم ورودی(login) می توان کنش زیر را نوشت:
    PHP:
     public function actionLogin()
    {
        $model=new LoginForm;
        if(isset($_POST['LoginForm']))
        {
            // collects user input data
            $model->attributes=$_POST['LoginForm'];
            // validates user input and redirect to previous page if validated
            if($model->validate())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        // displays the login form
        $this->render('login',array('model'=>$model));
    }
    در تکه کد بالا ما ابتدا نمونه ای از مدل LoginForm را ایجاد می کنیم.پس از آن بررسی می کنیم که فرم با استفاده از متد Post ارسال شده است یا خیر؟اگر فرم ارسال شده بود، صفات مربوط به مدلمان را با استفاده از داده های ارسال شده از فرم مقدار دهی می کنیم.سپس عمل اعتبار سنجی را انجام داده و در صورت موفقیت آمیز بودن آن کاربر را به همان صفحه ای که از آن آمده است و نیاز به بررسی هویت وی داشته است هدایت می کنیم.در صورتی که عمل اعتبار سنجی ما ناموفق باشد و یا برای اولین بار دسترسی به کنش صورت گرفته باشد، نمای مربوط به فرم login به کاربر نمایش داده خواهد شد.
    حال می خواهم توجه شما را به عبارت زیر در کنش login جلب کنم.
    PHP:
     $model->attributes=$_POST['LoginForm'];
    همانطور که در بخش نسبت دادن مقادیر ارسالی به صفات گفتیم، این خط کد داده های ارسالی را به صفات متناظرشان در مدلمان نسبت می دهد.در این خط از کد خصوصیت attribute توسط CModel تعریف می شود که انتظار دارد آرایه ای از نام-مقدار به آن داده شود و هر مقداری را به صفت متناظر آن در مدل نسبت می دهد.بنابراین اگر $_POST[‘loginForm’] چنین آرایه ای را برایمان فراهم نماید، این عبارت معادل مجموعه کدهای زیر خواهد بود:
    PHP:
     $model->username=$_POST['LoginForm']['username'];
    $model->password=$_POST['LoginForm']['password'];
    $model->rememberMe=$_POST['LoginForm']['rememberMe'];
    خوب تا اینجا ما قادر خواهیم بود داده هایی که از فرم ارسال شده اند را گرفته،اعتبار سنجی کرده و آنها را در مدلمان قرار دهیم.حال نوبت به ساخت نمایی برای نمایش فرم می رسد که در ادامه به آن خواهیم پرداخت.

    ساخت فرم:
    ساختن فرم یکی از ساده ترین کار ها می باشد.تنها کافی است فرم را با ایجاد یک تگ <form> آغاز کرده و خاصیت action آن را برابر با آدرس کنش مورد نظرمان (که در اینجا Login است) قرار دهیم.سپس به ازای صفات موجود در مدلمان(LoginForm) شروع به افزودن برچسب و فیلد می کنیم.در نهایت نیز کار را به قرار دادن یک کلید submit در فرم به پایان می رسانیم.تمام این کار ها را می توانیم تنها با استفاده از کد های html انجام دهید.
    اما بمنظور تسهیل در امر ایجاد فرم،Yii کلاس های کمک کننده ای را در اختیار توسعه دهندگان خود می گذارد که بوسیله آنها می توانند براحتی تمامی فیلد های مورد نیاز در فرم را ایجاد نمایند.بعنوان مثال برای ایجاد یک فیلد متنی می توان از فراخوانی CHtml::textField() استفاده نمود.و یا برای ایجاد یک dropDownList از فراخوانی CHtml::dropDownList() بهره می بریم.
    اما مزیت استفاده از این کلاس ها اینست که آنها تنها تگ های html را برای ما ایجاد نمی نمایند، بلکه قابلیت هایی را به ما می دهند که در حالت معمول برای رسیدن به آنه نیاز به کد نویسی های زیاد داریم.بعنوان مثال تکه کد زیر فیلدی متنی را برای ما ایجاد می کند که در صورت تغییر مقدار آن فرم را ارسال می نماید.توجه داشته باشید که در حال معمول این کار نیاز به نوشتن کد های جاوا اسکریپت دارد.
    PHP:
     CHtml::textField($name,$value,array('submit'=>''));
    حال در مثال زیر طریقه ایجاد یک فرم را با استفاده از Chtml به شما نشان خواهیم داد.توجه کنید که متغیر $model به مدل LoginForm اشاره دارد.
    PHP:
    <div class="form">
    <?php echo CHtml::beginForm(); ?>
     
        <?php echo CHtml::errorSummary($model); ?>
     
        <div class="row">
            <?php echo CHtml::activeLabel($model,'username'); ?>
            <?php echo CHtml::activeTextField($model,'username') ?>
        </div>
     
        <div class="row">
            <?php echo CHtml::activeLabel($model,'password'); ?>
            <?php echo CHtml::activePasswordField($model,'password') ?>
        </div>
     
        <div class="row rememberMe">
            <?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>
            <?php echo CHtml::activeLabel($model,'rememberMe'); ?>
        </div>
     
        <div class="row submit">
            <?php echo CHtml::submitButton('Login'); ?>
        </div>
     
    <?php echo CHtml::endForm(); ?>
    </div><!-- form -->
    کد بالا فرمی پویا را برای ما ایجاد می نماید.بعنوان مثال فراخوانی CHtml::activeLabel() برای ما بطور پویا برچسب هایی متناظر با صفات مدل ایجاد می کند. توجه داشته باشید که این برچسب ها همان برچسب هایی هستند که در متد attributeLabels() در مدل تعریف کرده ایم.اگر خطایی در صفت ورودی رخ دهد، کلاس CSS مربوط به برچسب به شکل خطا خواهد شد و خطایی را نمایش خواهد داد.بطور مشابه CHtml::ActiveTextField() نیز فیلد هایی متنی را ایجاد خواهد که در صورت بروز خطا Style آنها تغییر خواهند کرد.
    در شکل زیر نمونه ای از این فرم را می بینید(توجه داشته باشید که CSS این فرم form.css است که توسط yiic بطور خودکار تولید شده است).
    [​IMG]
    [​IMG]
    از نسخه 1.1.1،Widget جدیدی به نام CActiveForm در Yii قرار داده شد که امر ساخت فرم را بسیار آسانتر از قبل می نماید.از مزیت های این widget این است که قادر است امر اعتبار سنجی را هم در سمت کلاینت و هم در سمت سرور انجام دهد.می توان فرم بالا را توسط CActiveForm بصورت زیر نیز ایجاد کرد:
    HTML:
    <div class="form">
    <?php $form=$this->beginWidget('CActiveForm'); ?>
     
        <?php echo $form->errorSummary($model); ?>
     
        <div class="row">
            <?php echo $form->label($model,'username'); ?>
            <?php echo $form->textField($model,'username') ?>
        </div>
     
        <div class="row">
            <?php echo $form->label($model,'password'); ?>
            <?php echo $form->passwordField($model,'password') ?>
        </div>
     
        <div class="row rememberMe">
            <?php echo $form->checkBox($model,'rememberMe'); ?>
            <?php echo $form->label($model,'rememberMe'); ?>
        </div>
     
        <div class="row submit">
            <?php echo CHtml::submitButton('Login'); ?>
        </div>
     
    <?php $this->endWidget(); ?>
    </div><!-- form -->
    به این ترتیب شما در این مقاله آموزشی که از سایت همکدی گرفته شده است، با مقدمات کار با فرم ها آشنا شدید.در مقالات بعدی به مباحث مربوط به کار با پایگاه داده پرداخته خواهد شد.
     
    نوشته شده توسط hamed kh در ‏12 آوریل 2012
    eng. p و Masoud1365 از این پست تشکر کرده اند.

به اشتراک بگذارید