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.
Page 1 of 1
Problema ricerca su campi referenziati
#2
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:
(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
Adesso devi andare nel datagrid devi aggiungere una chiave esterna:
Per completezza (non odiarmi ma ho il solito problema di formattaazione... se più tardo ho tempo modifico il post, promesso)
Ce l'abbiamo quasi fatta. Adesso dobbiamo mettere mano al Controller:
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):
Spero di essere stato semplice nel spiegarti questa cosa. Fammi sapere se è tutto ok.
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.
#3
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:
GridView:
Funzione search del modello:
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.
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.
Share this topic:
Page 1 of 1

Help












