من برای ارسال اطلاعات سمت سرور به کمک فرم یک ویجت نوشتم که به صورت ajax اطلاعات رو سمت سرور ارسال میکنم ، وقتی که اطلاعات ثبت میشه اومدم توی یک بخش سایت به صورت ajax مطلب ثبت شده رو به کاربر نمایش میدم و قسمتی که فرم ارسال اطلاعات به صورت اجکس بوده رو با یک فرم جدید پر میکنم ، مشکل اینه که اگه فرم دوباره اطلاعات رو ارسال کنه بجای یکبار اطلاعات دوبار ارسال میشه و ذخیره میشه و به ازای هر ثبت فرم اطلاعات ضربدر دو ارسال میشه .
کلاس ActiveForm
کلاس ActiveForm
<?php namespace appwidgets class ActiveForm extends yiibootstrapActiveForm { public $isAjax = true; public $success = []; public $beforeSend = []; public $complete = []; public function run() { parent::run(); if($this->isAjax) { $this->ajaxForm(); } } protected function ajaxForm() { $action = $this->action; $id = $this->getId(); $view = $this->view; $view->registerJs("$(document).on(/"beofreSubmit/"), '#$id', function(){ $.ajax({ url: '$action', dataType: 'json', data: $('#$id').serialize(), method: 'post', success: function(data){ " . implode(';', $this->success) . " }, beforeSend: function(){ " . implode(';', $this->beforeSend) . " } complete: function() { " . implode(';', $this->beforeSend) . " } }); return false; });"); } }
کد ویو مربوط به فرم
<?php /* @var $this yiiwebView */ use appwidgetsActiveForm $form = ActiveForm::begin([ 'id' => 'test', 'success' => [ "if(data.b){ $('#form-container').html(data.b) } if(data.a){ $('#wall').appned(data.a) }" ] ]) echo $form->feild($model, 'pro1') ; echo $form->feild($model, 'pro2') ; echo $form->feild($model, 'pro3') ; echo Html::submitButton('submit') ; ActiveForm::end();
کد مربوط به ویو اصلی
<?php /* @var $this yiiwebView */ ?> <div id="form-container"> <?= $this->render('_form', compact('model')) ?> </div> <div id="wall"></div>
اکشن ثبت فایل
public function actionCreate(){ Yii::$app->response->format = Response::FORMAT_JSON; $model = new File() if($model->load(Yii::$app->request->post()) && $model->save()){ return [ 'a' => $this->renderAjax('_wallObject', compact('model')), 'b' => $this->renderAjax('_form', [ 'model' => new File() ]), ]; } return [ 'b' => $this->renderAjax('_form', compact('model')) ]; }