Problema ricerca su campi referenziati

Salve sono nuovo sia dell’ambiente Yii che del linguaggio php.

Nella webapp che sto implementando carico tabelle già create tramite il tool gii facendo creare automaticamente modello e tutto il necessario per le crud operation. Il mio problema è nella gestione dei record. Quando vado nella sezione manage, dove mi compare l’elenco dei record con le box sopra ogni campo dove poter effettuare delle ricerche filtrate , mi ritrovo i campi referenziati, non belli da vedere. Ho aggirato il problema sfruttando appunto i binding che vengono creati in automatico ( ad esempio invece di vedere id_utente vedo il nome dell’utente ) tuttavia la box di filtraggio non è presente per il nuovo campo non appartenente alla tabella che sto trattando e non capisco come posso inserirlo per effettuare delle ricerche.

Non so se mi sono spiegato correttamente forse ho fatto un po di confusione, tuttavia se qualcuno ha inteso e sa come rispondermi lo ringrazio anticipatamente.

Non conosco il tuo database quindi provo ad aiutarti facendoti un esempio concreto che ho sviluppato qualche tempo fa. Supponiamo che il tuo database sia questo:




CREATE TABLE IF NOT EXISTS `citta` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) NOT NULL, PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `citta` (`id`, `nome`) VALUES (1, 'Cesena'), (2, 'Forlì');


CREATE TABLE IF NOT EXISTS `paesi` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(50) NOT NULL, `citta` int(11) NOT NULL, PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;


INSERT INTO `paesi` (`id`, `nome`, `citta`) VALUES (1, 'San Carlo', 1), (2, 'San Vittore', 1), (3, 'Ronco', 2);



(devi scusarmi ma mi perde la formattazione, spero di non crearti troppi problemi).

gii lo conosci già, quindi non sto a raccontarti tutta la storia. In questo esempio, dovresti ritrovarti qualche cosa del tiupo


'cittadina' => array(self::BELONGS_TO, 'Citta', 'citta'),

dentro alle relations del Model che importa la chiave esterna.

Adesso devi andare nel datagrid devi aggiungere una chiave esterna:




array( 'name' => 'cittadina', 'filter' => CHtml::activeTextField($model, 'cittadina'), 'value' => '$data->cittadina->nome',

),

Per completezza (non odiarmi ma ho il solito problema di formattaazione… se più tardo ho tempo modifico il post, promesso)


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

'id' => 'paesi-grid', 'dataProvider' => $model->search(), 'filter' => $model, 'columns' => array(

'id', 'nome', array(

'name' => 'cittadina', 'filter' => CHtml::activeTextField($model, 'cittadina'), 'value' => '$data->cittadina->nome',

), array(

'class' => 'CButtonColumn', ),

), ));

?>

Ce l’abbiamo quasi fatta. Adesso dobbiamo mettere mano al Controller:


public function search() { $criteria = new CDbCriteria;

$criteria->compare('nome', $this->nome, true); $criteria->compare('cittadina.nome', $this->cittadina, true); $criteria->join = 'join citta on citta.id = t.citta'; $criteria->with = array('cittadina');

return new CActiveDataProvider(get_class($this), array( 'criteria' => $criteria,

));}

Se ci sono casi di omonimia tra le due tabelle, in oltre, devi aggiungere la dot notation di yii (una piccola t. prima del nome):


public function search() { $criteria = new CDbCriteria;

$criteria->compare('t.nome', $this->nome, true); $criteria->compare('cittadina.nome', $this->cittadina, true); $criteria->join = 'join citta on citta.id = t.citta'; $criteria->with = array('cittadina');

return new CActiveDataProvider(get_class($this), array( 'criteria' => $criteria,

));

Spero di essere stato semplice nel spiegarti questa cosa. Fammi sapere se è tutto ok.

Grazie, seguendo tutte le tue istruzioni sono riuscito effettivamente a far comparire le textBox di ricerca prima assenti, l’unico problema è che non mi filtra i risultati. Qualsiasi valore inserisca nella box causa un caricamento ( breve ma almeno sembra faccia qualcosa ) senza pero fare nulla di fatto, infatti i risultati rimangono sempre loro. Per sicurezza vorrei postarti il mio codice per vedere se magari riesci ad aiutarmi a trovare l’errore:

Referenze:


'utente0' => array(self::BELONGS_TO, 'AnagUtenti', 'utente'),

			'utentis' => array(self::HAS_MANY, 'Utenti', 'tag'),

GridView:


<?php 

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

	'id'=>'anag-tag-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'n_tag',

		array('name'=>'Nome','filter' => CHtml::activeTextField($model, 'utente0'), 'value' => '$data->utente0->nome',),

		array('name'=>'Cognome','filter' => CHtml::activeTextField($model, 'utente0'), 'value' => '$data->utente0->cognome',),

		array('name'=>'Societa','filter' => CHtml::activeTextField($model, 'utente0'), 'value' => '$data->utente0->societa',),

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>

Funzione search del modello:


public function search()

	{

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

		// should not be searched.


		$criteria=new CDbCriteria;


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

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

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

		$criteria->join = 'join anag_utenti on anag_utenti.n_anag = t.utente'; 

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

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

		$criteria->join = 'join anag_utenti on anag_utenti.n_anag = t.utente'; 

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

		$criteria->compare('utente0.societa', $this->utente0, true); 

		$criteria->join = 'join anag_utenti on anag_utenti.n_anag = t.utente'; 

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


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria

		));

	}

Ho provato invece che ad usare anag_utenti ( nome effettivo della tabella ) nel search a mettergli il nome del modello ( AnagUtenti ) oppure il nome che gli da lui nelle referenze ( utente ). Il risultato è esattamente lo stesso in tutti e tre i casi.