[Solved] Personalizzare funzione Search del Model

Salve!

Ho provato a documentarmi un pò ma con scarso successo :(

Vorrei personalizzare la schermata che si ottiene cliccando su "manage qualcosa"

in questo modo:

Lì dove c’è la colonna “Società” deve apparire il nome e non l’id e ovviamente scrivendo il nome della società avviene la ricerca.E poi vorrei aggiungere oltre ai tasti elimina,modifica etc un’altro tasto ad una mia funzione…è possibile fare tutto ciò?

Grazie in anticipo!!

E’ possibile. Per far apparire la società e non il suo id, devi prima modificare il model di questa tabella. Per la precisione, nel model devi inserire la relazione alla tabella esterna. Quando disegnerai il CGridView, quindi, al posto di idazienda ci potrai mettere azienda.nome. Dove azienda è il nome della relazione in questo model, e nome è il nome del campo nella tabella delle aziende.

Supponendo che il CGridView che ci hai mostrato provenga dalla tabella Dipendenti, e supponendo che la tabella delle aziende si chiami Aziende. E supponendo che esista nella tabella Dipendenti anche una chiave esterana Dipendenti.azienda, il tuo model dovrebbe avere questa realzione:




class Dipendenti extends CActiveRecord {

   … 

     public function relations() { 

          return array( 

            'azienda' => array(self::BELONGS_TO, 'Aziende', 'idazienda'), 

          ); 

      }

   … 

}



Aggiungendo il campo di una tabella esterna, di base si disabilita la ricerca su quel campo.

Ecco come potrebbe essere il tuo CGridView:




<?php 

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

    'id' => 'paesi-grid', 

    'dataProvider' => $model->search(), 

    'filter' => $model, 

    'columns' => array( 

      'nome', 

      'cognome', 

      array( 

        'name' => 'azienda', 

        'filter' => CHtml::activeTextField($model, 'azienda'), 

        'value' => '$data->azienda->nome', 

      ), 

      array( 

        'class' => 'CButtonColumn', 

      ), 

    ), 

  )); 

?>



Però non p finita qui: adesso devi mettere mano anche al controller:




      public function search() { 


          $criteria = new CDbCriteria; 


          $criteria->compare('nome', $this->nome, true); 

          $criteria->compare('azienda.nome', $this->azienda, true); 

          $criteria->join = 'join aziende on aziende.id = t.azienda'; 

          $criteria->with = array('aziende'); 


          return new CActiveDataProvider(get_class($this), array( 

            'criteria' => $criteria, 

          )); 

      }



Adesso provo a risponderti al terzo quesito: la questione dei bottoni a fine riga. Puoi farlo! Per farlo vedi l’ultimo elemento dell’array? Quello che passa la strinca CButtonColumn? Ecco, prova a sostituirlo con questo:




array(

      'class'=>'CButtonColumn',

      'viewButtonUrl'=>'Yii::app()->createUrl("/controllername/view", array("id" => $data["id"]))',

      'deleteButtonUrl'=>'Yii::app()->createUrl("/controllername/delete", array("id" =>  $data["id"]))',

      'updateButtonUrl'=>'Yii::app()->createUrl("/controllername/update", array("id" =>  $data["id"]))',

    ),



modificando opportunamente i bottoni. quella che vedi, dovrebbe essere il default. Modificandolo dovresti ottenere il risultato che cerchi.

Ed ovviamente, se ti è piaciuta la risposta, clicca sul + verde in basso a destra :-p

Sono riuscito, con le relazioni interne, ad ottenere al posto dell’id delle società il nome…ma non mi appare la possibilità di inserire del testo!(sotto a dove ora c’è scritto “Societa”), ma nel codice della pagina html generata esiste l’input type text relativo a quel campo…Dov’è l’errore?

Puoi postare il codice del tuo CGridView? Senza vederlo non posso sapere di che errore si tratta.

E’ quello generato automaticamente da Gii


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

	'id'=>'contatti-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		'societa_value.Nome',

		'cognome',

		'nome',

		'mail',

		/*

		'posizione',

		'tel_uff',

		'tel_pers',

		'tel_cell',

		'fax',

		'indirizzo',

		'citta',

		'provincia',

		'CAP',

		'paese',

		'pagina_web',

		*/

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?> 

E questa è la search nel model




	public function search()

	{




		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id);

		$criteria->compare('cognome',$this->cognome,true);

		/*

                Manca come cercare la società dal nome

                */

		$criteria->compare('nome',$this->nome,true);

		$criteria->compare('mail',$this->mail,true);

		$criteria->compare('posizione',$this->posizione);

		$criteria->compare('tel_uff',$this->tel_uff,true);

		$criteria->compare('tel_pers',$this->tel_pers,true);

		$criteria->compare('tel_cell',$this->tel_cell,true);

		$criteria->compare('fax',$this->fax,true);

		$criteria->compare('indirizzo',$this->indirizzo,true);

		$criteria->compare('citta',$this->citta);

		$criteria->compare('provincia',$this->provincia);

		$criteria->compare('CAP',$this->CAP);

		$criteria->compare('paese',$this->paese,true);

		$criteria->compare('pagina_web',$this->pagina_web,true);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

La relation è:


			'societa_value' => array(self::BELONGS_TO, 'Societa', 'societa'),

Non capisco, a prescindere poi da come effettuare la search, perchè non mi appare il campo per inserire il testo…

Togli ‘filter’ => CHtml::activeTextField($model, ‘azienda’),

Non deve essere quello di gii, bisogna metterci le mani.




<?php 

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

    'id' => 'paesi-grid', 

    'dataProvider' => $model->search(), 

    'filter' => $model, 

    'columns' => array( 

      'nome', 

      'cognome', 

      array( 

        'name' => 'azienda', 

        'filter' => CHtml::activeTextField($model, 'azienda'), 

        'value' => '$data->azienda->nome', 

      ), 

      array( 

        'class' => 'CButtonColumn', 

      ), 

    ), 

  )); 

?>



Grazie “sensorario” ho fatto “più uno” ;)

ho risolto anche la ricerca inserendo


		$criteria->compare('societa_value.Nome',$this->societa_value,true); $criteria->with=array('societa_value');

Per l’aggiunta del tasto extra oltre modifica,cancella,visualizza sulla destra?

Per il momento ti rimando a questa guida: http://www.yiiframework.com/doc/api/1.1/CButtonColumn Non ho mai affrontato il problema (a memoria). Ma entro qualche giorno mi programmo una piccola sessione di studio sull’argomento. Se risolvi prima, ti prego di condividere con noi e magari di scrivere un wiki.

Per aggiungere nuovi tasti per primo devi definire il template - http://www.yiiframework.com/doc/api/1.1/CButtonColumn#template-detail


'template' => '{view}{nuovo}{delete}'

In questo esempio ho rimosso il tasto ‘update’

Puoi devi definire i tasti con buttons - http://www.yiiframework.com/doc/api/1.1/CButtonColumn#buttons-detail




'buttons'=>array(

   'nuovo'=>array(

  	'label'=>'mio tasto',

  	'url'=>...

   )

)



Ciao DonKy,

sto facendo anche io delle prove simili alle tue con CGridView ma non riesco ad ottenere il risultato sperato.

Visto che tu hai già risolto il problema della ricerca puoi postare il model e la CGridView che hai utilizzato tu?

Grazie comunque!!

Scusa mauretto ma in questi giorni è l’inferno :D

ecco il codice della View:




<?php 

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

    'id' => 'paesi-grid', 

    'dataProvider' => $model->search(), 

    'filter' => $model, 

    'columns' => array( 

      'nome', 

      'nome_alternativo',

      'cognome', 

      array( 

        'name' => 'azienda', 

        'filter' => CHtml::activeTextField($model, 'societa_value'), 

        'value' => '$data->societa_value->Nome', 

      ), 

      array( 

        'class' => 'CButtonColumn', 

      ), 

    ), 

  )); 

?>



E del model, nelle relazioni:




public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'societa_value' => array(self::BELONGS_TO, 'Societa', 'societa'),

		);

	}



Il topic mi è stato molto utile, solo che il mio problema è che ho due tabelle referenziate è quando imposto il criterio di ricerca anche sulla seconda tabella, il mio codice è il seguente :


public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('idServizio',$this->idServizio);

		$criteria->compare('dsServizio',$this->dsServizio,true);

		$criteria->compare('centricosto.dsCentroCosto',$this->idCentroCosto,true);

		$criteria->join = 'join centricosto on centricosto.idCentroCosto = t.idCentroCosto'; 

        $criteria->with = array('CentriCosto'); 

	

		$criteria->compare('emipiano.dsEmipiano',$this->idEmipiano,true);

		$criteria->join = 'join emipiano on emipiano.idEmipiano = t.idEmipiano'; 

        $criteri

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

Se effettuo la ricerca sulla primo campo mi da errore, se effettuo la ricerca sul secondo funziona il messaggio di errore è il seguente :

Error 500: <h1>CDbException</h1>

<p>CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘centricosto.dsCentroCosto’ in ‘where clause’. The SQL statement executed was: SELECT COUNT(DISTINCT t.idServizio) FROM servizi t join emipiano on emipiano.idEmipiano = t.idEmipiano LEFT OUTER JOIN centricosto CentriCosto ON (t.idCentroCosto=CentriCosto.idCentroCosto) WHERE (centricosto.dsCentroCosto LIKE :ycp0) (/var/www/data/yii/framework/db/CDbCommand.php:528)</p><pre>#0 /var/www/data/yii/framework/db/CDbCommand.php(425): CDbCommand->queryInternal(‘fetchColumn’, 0, Array)

#1 /var/www/data/yii/framework/db/ar/CActiveFinder.php(728): CDbCommand->queryScalar()

Risolto : la join deve essere cosi :

&#036;criteria-&gt;join = 'join centricosto on centricosto.idCentroCosto = t.idCentroCosto join emipiano on emipiano.idEmipiano = t.idEmipiano'; 

Grazie