کار با Ajax

[right]با سلام.

یک فرم برای ثبت نام دارم که enableAjaxValidation رو فعال کردم.

ولی یک مشکلی که هستش وقتی فرم رو کامل پر می کنم و می فرستم مشکلی پیش نمی یاد, ولی اطلاعاتی رو وارد نمی کنم و می فرستم خطا روی میده .

البته من سمت سرور اطلاعات رو با Json می فرستم مثلا می خوام بدونم با موفقیت ذخیره شد یا نه اگر درست بود فرم رو Hide می کنم و پیفام درست رو نشون می دم وگر نه پیفام خطا رو نشون می دم.[/right]

[right]من می خوام اعتبارسنجی به صورت Ajax باشه از سمت سرور و وقتی عملیات با موفقیت بود پیغامی رو بفرستم به منظور ذخیره ویا خطا[/right]


echo CHtml::ajaxSubmitButton('عضویت','',array(

        'success' => 

            'js: function(result) {

                if(result != "") {

                    //if (result.indexOf("{") != 0) {

                        if (result.error == false)

                        {

                            $("#divmsg").removeClass().addClass("alert alert-success");

                            $("#register").slideUp(700);

                        }

                        else

                        {

                            $("#divmsg").removeClass().addClass("alert alert-error");

                        }

                        $("#divmsg").html(result.msg);

                    //}

                }

            }',

        'error' =>

            'js: function() {

                $("#divmsg").removeClass().addClass("alert alert-error");

                $("#divmsg").html("خطا در فرستادن اطلاعات");

            }',

        'beforeSend' =>

            'js: function(){

                $("#loading").addClass("loading");}',

        'complete' =>

            'js: function(){

                $("#loading").removeClass("loading");}',

        'dataType' => 'json',

    ),

            array('class' => 'btn btn-primary'));


public function actionRegister() {

        $model = new User('register');

        if (isset($_POST['ajax']) && $_POST['ajax'] === 'register') {

            echo CActiveForm::validate($model);

            Yii::app()->end();

        }

        if (isset($_POST['User'])) {

            $model->attributes = $_POST['User'];


            if (Yii::app()->request->isAjaxRequest) {

                header('Content-Type: application/json; charset="UTF-8"');

                sleep(5);

                if ($model->validate()) {

                    echo json_encode(array(

                        'msg' => 'Congratulations!',

                        'error' => false

                    ));

                    Yii::app()->end();

                }

                else

                {

                    echo json_encode(array(

                            'msg' => $model->getErrors(),

                            'error' => true

                        ));

                     

                    Yii::app()->end();

                }

            }

            else

                $this->redirect(app()->homeUrl);

        

        }

        $this->render('register', array('model' => $model));

    }


'enableAjaxValidation' => true,

    'clientOptions' => array(

        'validateOnSubmit' => true,

        //'validateOnChange' => true,

    ),

[font="Tahoma"] [rtl]درست یا غلط تجربه خودم رو میگم.

enableAjaxValidation اسمش روشه کار validation رو توسط ajax انجام میده، پس ازش انتظار ذخیره اطلاعات رو نداشته باشید. کاری که میکنه اعتبار سنجی رو آژاکسی انجام میده و اگر خطا بده جلوی رفرش رو میگیره وگرنه بعد از اینکه خطایی رخ نداد صفحه برای ثبت اطلاعات در دیتابیس رفرش میشه.

حال اگر بخوایم به دو منظور از این استفاده کنیم. شاید بشه با callback های clientOptions به هدفمون که ثبت و اعتبار سنجی همزمان هست برسیم که می بایست زمانی در callback afterValidation با return false جلوی رفرش رو بگیریم و یه طوری اطلاعات رو ثبت کنیم که یه بار فکر کنم اینکارو کردم ولی اشکم در اومد خودم هم نفهمیدم چیکار کردم ;) یعنی باید برم کدهامو نگاه کنم… (در اصل این enableAjaxValidation اعتبار سنجی آژاکسی رو خوب انجام میده ولی ازش انتظار بخش ذخیره سازی در دیتابیس و برگردوندن پیغام موفقیت رو نداشته باشید)

ولی یک راه دیگه اینکه که به طور کل enableAjaxValidation رو کنار بگذاریم (واسه این میگم بزاریم کنار چون بر حسب تجربه، با هر روش دیگه ای قاطی بشه تداخل رخ میده و رفتارهای عجیب غریب رخ میده)! و خودمون با ajaxSubmitButton به صورت دستی ثبت و اعتبار سنجی همزمان رو انجام بدیم. به نظر من معقول تره. استفاده از این روش نکته خاصی نداره و با دو تا callback میشه فهمید اطلاعات ذخیره شده یا خیر. فقط استفاده از این روش یک چالش مهم داره و اون اینکه زمانی که خطا برگشت داده میشه ممکنه ما تصمیم داشته باشیم اونها رو به شکل استاندارد و معقول (مثل زمانی که فرم رفرش شده) با همون استایل تعریف شده و در جای مشخصه قرار بدیم (منظورم دقیق در جایگاه $form->error($model,‘gender’); است) از طرفی ممکنه تعداد attribute ها زیاد باشه و هر کدوم هم خطاهای زیادی داشته باشند که هندل کردن همه همزمان در js کار دشواریه، برای اینکار باید هنگام برگشت خطا، از CActiveForm::validate($model) استفاده کنیم تا یک json استاندارد yii به خروجی ارسال بشه، حال تنها کافیه اون رو پارس کنیم که با این قطعه کد میشه اینکارو کرد:

[/rtl]




e = jQuery.parseJSON(data); jQuery.each(e, function(key, value) { jQuery("#"+key+"_em_").show().html(value.toString()); });



[rtl]

یعنی اگر خطا برگردوند توسط این کد، خطا ها در جای مناسب خودشون نمایش داده میشن و اگر همه چیز صحیح بود میتونی alert بدی و یا همونطور که اشاره کردی فرمت رو hide کنی و یا هر کاری.

ببخشید که خیلی پراکنده توضیح دادم و فرصت زیادی نداشتم که حتی کدت رو نگاه کنم ولی امیدوارم در لابلای صحبت ها پاسخ سوالتون رو گرفته باشید. اگر هم نگرفتید دوباره پست بدید، اگر بلد بودم سعی میکنم دفعه بعد با حوصله بیشتری پاسخ بدم.

موفق باشید

[/rtl] [/font]