Cgridview & Checkbox + Model Diverso

Un saluto a tutti,

ho scoperto da poco YII e sfortunatamente mi sono bloccato.

Nella view (_form) mostro 2 tabelle del database: billing & cost

interconnesse tra loro dalle colonne IDCLIENT & IDBILLING

Nel creare un nuovo record “Billing” vorrei aggiornare la colonna cost.IDBILLING delle righe “Cost” (selezionate tramite checkbox) con l’“ID” del Billing appena creato.

Non so come passare gli id selezionati nel view al controller.

Posto il _form view:


<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

        'id'=>'billing-form',

        // Please note: When you enable ajax validation, make sure the corresponding

        // controller action is handling ajax validation correctly.

        // There is a call to performAjaxValidation() commented in generated controller code.

        // See class documentation of CActiveForm for details on this.

        'enableAjaxValidation'=>false,

)); ?>


        <p class="note">Fields with <span class="required">*</span> are required.</p>


        <?php echo $form->errorSummary($model); ?>


        <div class="row">

          <?php echo $form->labelEx($model,'IDCLIENT'); ?>

    <h2><?php echo $client->IDCLIENT; ?></h2>  

                <?php echo $form->error($model,'IDCLIENT'); ?>  <br>

    <h3><?php 

        echo $client->name." ".$client->surname."<br>".$client->document;

     ?></h3>

    </div>


        <div class="row">

                <?php echo $form->labelEx($model,'datefrom'); ?>

                                <?php 

        $this->widget('zii.widgets.jui.CJuiDatePicker',array(

         'name'=>"Billing[datefrom]", // the name of the field

         'value'=>$model->datefrom,  // pre-fill the value

         // additional javascript options for the date picker plugin

           'options'=>array(

              'showAnim'=>'fold',

              'dateFormat'=>'yy-mm-dd',  // optional Date formatting

          ),

         'htmlOptions'=>array(

             'style'=>'height:20px;'

         ),

      ));                      

   ?> 

                <?php echo $form->error($model,'datefrom'); ?>

        </div>


        <div class="row">

                <?php echo $form->labelEx($model,'dateto'); ?>

                                <?php 

        $this->widget('zii.widgets.jui.CJuiDatePicker',array(

         'name'=>"Billing[dateto]", // the name of the field

         'value'=>$model->dateto,  // pre-fill the value

         // additional javascript options for the date picker plugin

           'options'=>array(

              'showAnim'=>'fold',

              'dateFormat'=>'yy-mm-dd',  // optional Date formatting

          ),

         'htmlOptions'=>array(

             'style'=>'height:20px;'

         ),

      ));                      

   ?> 

                <?php echo $form->error($model,'dateto'); ?>

        </div>


        <div class="row">

                <?php echo $form->labelEx($model,'date'); ?>

                                <?php 

        $this->widget('zii.widgets.jui.CJuiDatePicker',array(

         'name'=>"Billing[date]", // the name of the field

         'value'=>$model->date,  // pre-fill the value

         // additional javascript options for the date picker plugin

           'options'=>array(

              'showAnim'=>'fold',

              'dateFormat'=>'yy-mm-dd',  // optional Date formatting

          ),

         'htmlOptions'=>array(

             'style'=>'height:20px;'

         ),

      ));                      

   ?> 

                <?php echo $form->error($model,'date'); ?>

        </div>


        <div class="row">

                <?php echo $form->labelEx($model,'state'); ?>

                <?php echo $form->textField($model,'state',array('size'=>16,'maxlength'=>16)); ?>

                <?php echo $form->error($model,'state'); ?>

        </div>


 <?php $this->widget('zii.widgets.grid.CGridView', array(

        'id'=>'cost-grid',

        'dataProvider'=>new CActiveDataProvider('Cost',array(

  'criteria' => $criteria,

  'pagination' => array('pageSize' => 10),

)),

  'selectableRows' => 2,

        //'filter'=>$model,

        'columns'=>array(

   array('class'=>'CCheckBoxColumn','value'=>'$data->IDCOST/*<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />???CORRETTO?<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />*/',),

                'IDCOST',

                'advance',

                'spent',

                'date',

                'type',

                'scope',

                /*

                'note',

                'IDCLIENT',

                */


        ),

)); ?>

E questo il Controller:


 public function actionCreate($IDCLIENT)

        {

                $model=new Billing;

    $client = new Client;

    $criteria=new CDbCriteria;  

                // Uncomment the following line if AJAX validation is needed

                // $this->performAjaxValidation($model);

    //$this->IDCLIENT= $IDCLIENT;

    

    $client = Client::model()->findByPk((int)$IDCLIENT);

    

 

    $criteria->condition = "IDCLIENT = ".$client->IDCLIENT." AND (IDBILLING IS NULL OR IDBILLING = 0)";

    $criteria->order = "date DESC"; 

    


                if(isset($_POST['Billing']))

                {

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

      $model->IDCLIENT=$client->IDCLIENT;

                        if($model->save()){

        

        $cost= new Cost;

        if($cost=Cost::model()->updateAll(array( 'IDBILLING' => $model->IDBILLING ), 'IDCOST = '.#########COSA DEVO INSERIRE QUI??########))

                                  $this->redirect(array('view','id'=>$model->IDBILLING)); 

        }

                }


                $this->render('create',array(

                        'model'=>$model,

      'client'=>$client,

      'criteria'=>$criteria,

                ));

        }

Grazie in anticipo

Per inviare dei dati da una pagina all’altra devi semplicemente fare un form. Ma a questo punto non ho capito la tua domanda: potresti spiegarti meglio?

Ciao, grazie per l’interessamento: provo a spiegarmi meglio.

Premetto che sto modificando i file creati tramite GII;

Allego una immagine sperando possa aiutare:

Nella classica schermata di creazione riga (tabella Billing) ho aggiunto in basso la possibilità di selezionare quali elementi della tabella "cost" vanno collegati al nuovo record.

Per fare ciò ho pensato di inserire nella colonna "cost.IDBILLING" il valore identificativo del record appena creato.

Il mio problema è che non riesco a passare al controller i valori selezionati tramite checkbox:

ECCO il codice del view:


<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'cost-grid',

	'dataProvider'=>new CActiveDataProvider('Cost',array(

  'criteria' => $criteria,

  'pagination' => array('pageSize' => 10),

)),

  'selectableRows' => 2,

	//'filter'=>$model,

	'columns'=>array(

   array('class'=>'CCheckBoxColumn','value'=>'$data->IDCOST#############<-CORRETTO?<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />?<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/huh.gif' class='bbc_emoticon' alt='???' />??########',),

		'IDCOST',

		'advance',

		'spent',

		'date',

		'type',

		'scope',

		/*

		'note',

		'IDCLIENT',

		*/


	),

)); ?>

qui il controller:


	public function actionCreate($IDCLIENT)

	{

		$model=new Billing;

    $client = new Client;

    $criteria=new CDbCriteria;  

		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);

    //$this->IDCLIENT= $IDCLIENT;

    

    $client = Client::model()->findByPk((int)$IDCLIENT);

    

 

    $criteria->condition = "IDCLIENT = ".$client->IDCLIENT." AND (IDBILLING IS NULL OR IDBILLING = 0)";

    $criteria->order = "date DESC"; 

    


		if(isset($_POST['Billing']))

		{

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

      $model->IDCLIENT=$client->IDCLIENT;

			if($model->save()){

        

        $cost= new Cost;

        if($cost=Cost::model()->updateAll(array( 'IDBILLING' => $model->IDBILLING ), 'IDCOST = '.######COSA DEVO INSERIRE QUI??#########))

				  $this->redirect(array('view','id'=>$model->IDBILLING)); 

        }

		}


		$this->render('create',array(

			'model'=>$model,

      'client'=>$client,

      'criteria'=>$criteria,

		));

	}

Nel codice qui sopra ho evidenziato i punti critici.

Se non sono riuscito a spiegarmi non esitare a dirmelo, mi sono bloccato su una sciocchezza.

Grazie infinite!

assicurati che la GridView sia nel widget form, in questa maniera i tuoi checkbox verranno inviati. poi nel controller fai un bel var_dump($_POST) e controlla che in effetti i valori arrivino come ti aspetti.

Di solito un checkbox viene utilizzato per trattare dati booleani quindi 0 e 1, guarda un pò se arrivano gli id e facci sapere.

Io sarò pignolo e ripetitivo, ma dire "non riesco" oppure "non funziona" non serve quasi a niente. Per poter risolvere un problema in informatica in genere si ha bisogno di "ho fatto", "ho ottenuto" ma speravo di ottenere altro.

Grazie per la dritta!

con il var_dump mi sono accorto che non c’è verso di passare i dati al controller.

Leggendo sui forum e cercando nella documentazione sono arrivato alla conclusione (?sbagliata?) che non si possa fare, non con il Cgridview almeno; è possibile aggirare il problema con apposite funzioni Ajax, ma credo sia una una soluzione poco adatta al mio scopo.

Ho "risolto" sostituituendo il Cgridview con un bel "CHtml::activeCheckBoxList":


<?php  echo CHtml::activeCheckBoxList($cost, 'IDCOST',

            CHtml::listData(

               $costfilter, 'IDCOST',

                        'IDCOST'),

                        array('checked'=>true,

                        'value'=>$cost->IDCOST,

                        'uncheckValue' => null,));

?>

e finalmente il Controller vede correttamente entrambi i $_POST:


		if(isset($_POST['Billing'],$_POST['Cost']))

		{

      $cost->attributes=$_POST['Cost'];

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

Come soluzione sembra meno elegante ma almeno funziona!

Grazie ancora

credo sia la più corretta :rolleyes: