Yii Framework Forum: Problema ricerca su campi referenziati - Yii Framework Forum

Jump to content

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

Problema ricerca su campi referenziati Rate Topic: -----

#1 User is offline   Excess 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 05-September 11

Posted 05 September 2011 - 03:07 AM

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

#2 User is offline   sensorario 

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

Posted 07 September 2011 - 01:38 AM

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

#3 User is offline   Excess 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 8
  • Joined: 05-September 11

Posted 07 September 2011 - 03:09 AM

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