CGridView-Colonne personalizzate come visualizzare colonne personalizzate in una CGridView
#1
Posted 23 May 2011 - 09:13 AM
La domanda è la seguente: come si fa a visualizzare una colonna personalizzata in una CGridView?
Mi spiego meglio. In una CGridView visualizzo i dati degli utenti del mio sistema. Tra questi c'è un campo intero chiamato 'livello'.Quest'ultimo è una foreign key riferita ad alla tabella 'livello_utenti' all'interno della quale ad ogni valore intero corrisponde la descrizione testuale del livello (es. 0->guest,1->admin ecc). Ora quello che vorrei fare è visualizzare la descrizione testuale al posto del valore intero 'livello'. Normalmente avrei fatto un semplice join ma immagino che esista un modo alternativo in yii.
Cosa mi consigliate di fare?
#2
Posted 23 May 2011 - 09:44 AM
Ammetto che userei schietto il model sfruttando il metodo relations. Sino ad ora mi è capitato solo di dover formattare un campo html.
In quel caso il mio datagrid veniva modificato in questo modo:
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'eventi-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'id',
'titolo',
'abstract',
array('name' => 'corpo', 'value' => $model->corpo, 'type' => 'html'),
array(
'class' => 'CButtonColumn',
),
),
));
?>Come vedi, anzichè passare solo il nome di un campo, si passa un array con nome, valore e tipo. Credo che a te serva indicare il tipo.
Nella documentazione Ho trovato questo.
Così a naso forse potresti provare con
array( // display 'create_time' using an expression
'name'=>'nomecampo',
'value'=>'$altrivalori[$data->nomecampo]',
),e magari prima definire il tuo array:
$altrivalori = array('admin','user');In modo ancora più pulito, forse potresti definire queste cose dentro al file di configurazione Yii::params['mioarray']. Ma mi sembra molto verboso. Non ti conviene usare una tabella con i ruoli e sfruttare Yii?
#3
Posted 23 May 2011 - 01:43 PM
array(
'name'=>'livello_utenti',
'value'=>$model::getLevel($data->livello_utente),
),
Non so se sia fattibile, ho sbiarciato adesso dalla doc: http://www.yiiframew...i/1.1/CGridView
#4
Posted 23 May 2011 - 03:51 PM
domani a mente fresca smanetto un pò e appena trovo la soluzione ve la posto
per il momento ... grazie
#5
Posted 23 May 2011 - 04:12 PM
Ti invio un esempio di codice di come potrebbe essere:
Facciamo finta che il tuo Model per la tabella dei livelli si chiami, appunto, Livelli e che la tabella in questione abbia tue campi:
- livello_id (corrispondente al campo livello_utente della tua tabella utenti)
- livello_desc (descrizione)
array( 'name'=>'livello_utenti', 'value'=>'Livelli::model()->findByPk($data->livello_id)->livello_desc', ),
Ricordati di inserire tutto il contenuto di 'value' (cioè Livelli::model()->findByPk($data->livello_utenti)->livello_descrizione) tra apici, così come nell'esempio.
Spero che aiuti a risolvere il problema.
#6
Posted 24 May 2011 - 02:28 AM
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'moto-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'id',
'username',
'password',
'livello.nome',
array(
'class' => 'CButtonColumn',
),
),
));
?>Come intuirai, livello non è un campo della tabella, ma il nome della relazione. nome, invece, è il nome del campo della tabella esterna.
#7
Posted 24 May 2011 - 03:31 AM
Quella di dchan funziona alla grande....grazie mille
Quella di sensorario non da errori ma visualizza un campo vuoto nella griglia in corrispondenza del livello. Come se gli mancasse la relation. In realtà la relation c'è eccome(a meno di errori). Questo è il codice che ho usato nel model della tabella Utenti
public function relations()
{
return array(
'livello'=>array(self::HAS_ONE, 'Livelli', 'level_id'),
);
}
dove 'livello' è il nome del campo nella tabella Utenti, 'Livelli' è la tabella esterna e 'level_id' è il nome del campo della tabella esterna..
#8
Posted 24 May 2011 - 03:44 AM
public function relations()
{
return array(
'livello'=>array(self::BELONGS_TO, 'Livelli', 'level_id'),
);
}è corretto SE:
Nella tabella corrente il campo "level_id" è chiave esterna per la tabella livelli
PS. Ho modificato self::HAS_ONE con self::BELONGS_TO
#9
Posted 24 May 2011 - 04:06 AM
#10
Posted 24 May 2011 - 04:11 AM
#11
Posted 24 May 2011 - 04:49 AM
Solo che ancora non funzia..
#12
Posted 24 May 2011 - 05:25 AM
con $data->livello... Yii ti mosta il valore dell campo utente->livelo invece del valore della relazione...
il nome della relazione deve esere unico...
#13
Posted 24 May 2011 - 05:27 AM
array( 'name'=>'livello', 'value'=>'$data->livello->nome' )
Forse ci sono soluzioni piu' spicce, ma io non le conosco
#14
Posted 24 May 2011 - 06:02 AM
il problema era effettivamente che il nome della relazione deve per forza di cose essere diverso dal nome del campo coinvolto nella relazione stessa.
Riporto il codice che funziona.
Questa è la relation
return array( 'livello_fk'=>array(self::BELONGS_TO, 'Livelli', 'livello'), );
mentre questo è il codice della CGridView
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'utenti-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'nome',
'cognome',
'username',
'livello_fk.level_description',
array(
'class'=>'CButtonColumn',
),
),
));
L'unica cosa che resta da sistemare riguarda il fatto che adesso la colonna livello è priva di campo per il filtraggio e l'ordinamento. Ma questo magari lo risolvo con calma tanto non è importante(se però qualcuno ha già la soluzione a portata di mano non la rifiuto mica
Vorrei fare un ultimo appunto visto che questa discussione la segue anche un membro dello staff. Penso di essermi perso nei meandri della griglia perché la parte della guida che descrive le relations è forse un tantino ambigua. Mi spiego meglio. Normalmente quando si crea una relazione tra tabelle riguardo una foreign key si specificano sia le tabelle che i campi coinvolti. In questo caso ad esempio la tabella utenti aveva un campo 'livello' che corrispondeva ad una chiave primaria della tabella 'livelli' sita nel campo 'level_id'. Il mio errore è stato quello di voler specificare nella relazione quale fosse il campo specifico della tabella esterna(level_id).
In realtà adesso credo di aver capito che la relazione di fatto specifica solo che un certo campo ha una relazione con una tabella esterna, senza preoccuparsi di specificare qual'è effettivamente il campo della tabella esterna. Quest'ultima cosa è infatti intrinseca nella struttura relazionale del DB.
Ovviamente correggetemi subito se ho scritto delle cavolate...
#15
Posted 24 May 2011 - 09:31 AM
Attached File(s)
-
Ricerca da un CDatagrid in una chiave esterna.pdf (75.06K)
Number of downloads: 19
#16
Posted 24 May 2011 - 04:18 PM
Infatti ho preso spunto dai vostri suggerimenti per modificare un'implementazione che ho fatto sulla mia prima (quasi ultimata) implementazione con Yii.
Grazie ancora a tutti per i vostri preziosi suggerimenti anche se... più leggo i vostri post e più mi rendo conto che ho ancora da studiare...

Help














