如何使用Yii中的CGridview使用ajax请求保存数据

时间:2014-07-16 10:49:50

标签: php jquery ajax yii

当我提交按钮进行更新时,它不保存数据。在我的view.php文件中 - > `

'id'=>'main-table-grid',
    'dataProvider'=>$dataProvider,
    'columns'=>array(
    array(
      'name'=>'section_no',
      'type'=>'raw',
      'value'=>'CHtml::link($data->section_no)',
    ),
        'section_name',
        'sub_sec_no',
        'sub_sec_name',
        array(
      'name'=>'text',
      'htmlOptions'=>array('width'=>'150'),
      'type'=>'raw',
      'value' => 'CHtml::textArea("MainTable[text]",$data->text)',
    ),
        'review_response',
    array(
      'name'=>'review_comment',
      'htmlOptions'=>array('width'=>'default'),
      'type'=>'raw',
      'value' => 'CHtml::textArea("MainTable[review_comment]",$data->review_comment)',
    ),
    array(
      'class' => 'CButtonColumn',
      'template' => '{update}{view}{delete}',
      'buttons' => array(
        'update' => array(
          'options' => array('class' => 'save-ajax-button'),
          'url' => 'Yii::app()->controller->createUrl("saveModel", array("id"=>$data->id))',
        ),
        'view',
        'delete',
      ),
    ),
    ),
)); 
?>
<script>
   $('#main-table-grid a.save-ajax-button').live('click', function(e)
    {
        var row = $(this).parent().parent();

        var data = $('input', row).serializeObject();

        $.ajax({
            type: 'POST',
            data: data,
            url: jQuery(this).attr('href'),
            success: function(data, textStatus, jqXHR) {
                console.log(text);
                console.log(textStatus);
                console.log(jqXHR);
            },
            error: function(textStatus, errorThrown) {
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
        return false;
    });


    $.fn.serializeObject = function() {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };
</script>`

在我的控制器中我创建了一个动作方法。代码在 - &gt;

下面
public function actionSaveModel($id) {
    $model=$this->loadModel($id);
    $this->performAjaxValidation($model);
    if(isset($_POST['MainTable']))
        {
      $model = new MainTable();
      $model->attributes = $_POST['MainTable'];
      $model->save();
      $this->render('admin', array(
         'model' => $model,
      ));
        }
  }

我已在我的控制器中设置权限

    array('allow', // allow authenticated user to perform 'create' and 'update' actions
        'actions'=>array('savemodel'),
        'users'=>array('@'),
    ),

我的问题是数据没有保存在表格中。请告诉我这里的问题是什么。 谢谢。

2 个答案:

答案 0 :(得分:2)

好了,我已经解决了这个问题。我通过选择需要更新的ID并将数据发布到我的控制器来获取ajax响应。

<script type="text/javascript">
$(function() {  
  $('#MainTable_text').live('click', function(e)
    {
        var val=this.value;
        $.ajax({
            type: 'POST',
            data: {des:val},
            url: "<?php echo $this->createUrl("maintable/save"); ?>",
            success: function(data, textStatus, jqXHR) {
                console.log(data);
                console.log(textStatus);
                console.log(jqXHR);
            },
            error: function(textStatus, errorThrown) {
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
        return false;
    });
});

之后我在控制器中捕获值并在数据库中更新。

  public function actionSave() {
    $command = Yii::app()->db->createCommand();
    $user = $_POST['des'];
    if (isset($user)) {
      $command->update('main_table', array(
          'text' => $user,
              ), 'id=:id', array(':id' => $id));
      $this->render('save', array(
          'model' => $model,
      ));
    } else {
      echo 'error found';
    }
  }

答案 1 :(得分:1)

请将您的jQuery代码放在此代码中:

<script type="text/javascript">
$(function() {
// put your jQuery code here
});
</script>