2013-08-22 2 views
0

Я делаю cgridview с одним столбцом, редактируемым для данных обновления, based on this post.

Включить только кнопку (обновить лицензию), чтобы обновить все поля в вызове ajax.

Но это только обновляет первое поле.

Я думаю, что что-то произошло на $_POST переменной.

Я пытаюсь несколько способов взглянуть на переменную $_POST без ошибок.

Мой код:

Вид:

<?php $form=$this->beginWidget('CActiveForm', array(
    'enableAjaxValidation'=>true, 
)); ?> 


<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'rta-client-grid', 
    'selectableRows'=>1, 
    'selectionChanged'=>'mostrarDetalles', // via 1: para mostrar detalles al seleccionar 
    'dataProvider'=>$modelClient->search(), 
    'filter'=>$modelClient, 
    'columns'=>array(
     array(
      'id'=>'autoId', 
      'class'=>'CCheckBoxColumn', 
      'selectableRows' => '50', 
     ), 
     'oid', 
     'name', 
     'surname', 
     'id_country', 
     'nif', 
     //'CifDni', 
     array(
      'name'=>'CifDni', 
      'type'=>'raw', 
      'value'=>'CHtml::textField("CifDni[$data->oid]",$data->CifDni,array("style"=>"width:80px;"))', 
      // 
     ), 
     array(
      'class'=>'CButtonColumn', 
     ), 
     array(
      'class'=>'CButtonColumn', 
      'template' => '{detallarClientes}', 
      'buttons' => array(
       'detallarClientes'=>array(
        'label'=>'ver', 
        'imageUrl'=>'images/demo1/view.png', 
        'click'=>'js:mostrarDetalles', 
       ), 
      ), 
     ), 

    ), 
)); ?> 

<script> 
    function reloadGrid(data) { 
     $.fn.yiiGridView.update('rta-client-grid'); 
    } 
</script> 
<?php echo CHtml::ajaxSubmitButton('Filter',array('rtaClient/ajaxupdate'), array(),array("style"=>"display:none;")); ?> 
<?php echo CHtml::ajaxSubmitButton('Update licencias',array('rtaClient/ajaxupdate','act'=>'doUpdateLicencia'), array('success'=>'reloadGrid'),array("style"=>"float:right;")); ?> 
<?php $this->endWidget(); ?> 

Контроллер:

public function actionAjaxupdate() 
{ 
    $act = $_GET['act']; 
    if($act=='doUpdateLicencia') 
    { 
     $sortOrderAll = $_POST['CifDni']; 
     if(count($sortOrderAll)>0) 
     { 
      foreach($sortOrderAll as $menuId=>$sortOrder) 
      { 
       $model=$this->loadModel($menuId); 
       $model->CifDni = $sortOrder; 
       $model->save(); 
      } 
     } 
    } 
} 

Сообщение переменной на FirebugConsole:

CifDni[10] H 
CifDni[11] I 
CifDni[12] J 
CifDni[2] A 
CifDni[3] B 
CifDni[4] C 
CifDni[6] D 
CifDni[7] E 
CifDni[8] F 
CifDni[9] G 
RtaClient[CifDni] 
RtaClient[id_country] 
RtaClient[name] 
RtaClient[nif] 
RtaClient[oid] 
RtaClient[surname] 

Я просто решил проблему. Я изменил контроллер, добавив:

foreach($_POST as $id=>$value) 
    { 
     if($id=="CifDni") { 
      foreach($value as $id2=>$value2) 
      { 
       $model=$this->loadModel($id2); 
       $model->CifDni = $value2; 
       $model->save(); 
      } 
     } 
    } 

Но проблема в базе была в другой области (не показал на сетке), которая имеет правило «требуется» и в базе данных не имеет значения, и они не позволяют мне обновление по ошибке SQL (ошибка sql не появляется в журнале).

public function rules() 
{ 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     //array('pass', 'required'), //<---- 
+0

В вашем случае это означает, что запись, которая имеет oid = 10 (первая), будет обновлена, но oid = 11,12, .... 2,3,4 не так ли? –

+0

Привет @TelvinNguyen, я просто решил проблему. Я был в данных по таблице и правилах по модели. – user2697228

ответ

0
$model->save(false); 

Чтобы заставить сохранить вашу модель без проверки через правило вместо удаления вашего правила на модели.

Смежные вопросы