Yii Framework Forum: [Solved] Personalizzare funzione Search del Model - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Solved] Personalizzare funzione Search del Model Rate Topic: -----

#1 User is offline   DonKy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 11

Posted 17 October 2011 - 04:56 AM

Salve!
Ho provato a documentarmi un pò ma con scarso successo :(
Vorrei personalizzare la schermata che si ottiene cliccando su "manage qualcosa"
Posted Image 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!!
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 October 2011 - 05:44 AM

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.
2

#3 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 October 2011 - 05:45 AM

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

#4 User is offline   DonKy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 11

Posted 17 October 2011 - 05:49 AM

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?
0

#5 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 October 2011 - 05:54 AM

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

#6 User is offline   DonKy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 11

Posted 17 October 2011 - 06:24 AM

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..
0

#7 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 17 October 2011 - 07:03 AM

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

#8 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 October 2011 - 07:25 AM

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', 
      ), 
    ), 
  )); 
?>

1

#9 User is offline   DonKy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 11

Posted 17 October 2011 - 08:28 AM

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?
0

#10 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 17 October 2011 - 08:38 AM

Per il momento ti rimando a questa guida: http://www.yiiframew...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.
1

#11 User is offline   Maurizio Domba Cerin 

  • Yii - Yesss It Is !!!
  • Yii
  • Group: Yii Dev Team
  • Posts: 4,336
  • Joined: 12-October 09
  • Location:Croatia

Posted 18 October 2011 - 02:48 AM

View PostDonKy, on 17 October 2011 - 08:28 AM, said:

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


Per aggiungere nuovi tasti per primo devi definire il template - http://www.yiiframew...template-detail

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


In questo esempio ho rimosso il tasto 'update'

Puoi devi definire i tasti con buttons - http://www.yiiframew...#buttons-detail
'buttons'=>array(
   'nuovo'=>array(
  	'label'=>'mio tasto',
  	'url'=>...
   )
)

Find more about me.... btw. Do you know your WAN IP?
0

#12 User is offline   mauretto 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 15-July 11
  • Location:Rome

Posted 31 October 2011 - 06:13 AM

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!!
0

#13 User is offline   DonKy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 11

Posted 03 November 2011 - 01:03 AM

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'),
		);
	}

0

#14 User is offline   Ricky68 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 10
  • Joined: 12-November 12

Posted 23 November 2012 - 06:18 AM

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 :
$criteria->join = 'join centricosto on centricosto.idCentroCosto = t.idCentroCosto join emipiano on emipiano.idEmipiano = t.idEmipiano';


Grazie
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users