Come Si Colora Il Campo Di Una Colonna In Cgridview?

Ho la solita griglia zii.widgets.grid.CGridView in una view




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

	'id'=>'approvvigionamento-automatico-parti-grid',

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

	'filter'=>$model,

	'columns'=>array(

		'ID',


		array(

			'name' => 'IN_VIAGGIO',

//			'htmlOptions'=>array('style'=>'text-align: center'),

//			'htmlOptions'=>array('style'=>'text-align: center; color: red; text-decoration: none;'),

			'htmlOptions'=>array('style'=>$data->colore_giorni_viaggio),


			'type' => 'raw',

			'value' => 'CHtml::label($data->giorni_attesa_viaggio,false)'

		),

	),

)); ?>



Se scrivo




'htmlOptions'=>array('style'=>'text-align: center; color: red; text-decoration: none;'),



[size="2"]tutti i campi della colonna IN_VIAGGIO si colorano di rosso, ma se voglio colorare solo quelli superiori al numero 3, ad esempio, come dovrei fare?[/size]

[size="2"]Ho ipotizzato di scrivere nel modello una funzione del genere:[/size]

[size="2"]




public function getColore_giorni_viaggio()

	{

		if($this->GG_VIAGGIO > 3) {

			return 'text-align: center; color: red; text-decoration: none;';

		} else {

			return 'text-align: center';

		}

	}



[/size]

[size="2"]ma dato che Yii si lamenta[/size]

[size="2"]

Undefined variable: data[/size]

[size="2"]

Eccomi qui a chiedere aiuto[/size]

Mi ero dimenticato di aggiungere che avevo trovato un post che spiegava come si fa:

http://www.yiiframework.com/forum/index.php/topic/14266-dynamic-color-in-cgridview/

ma non l’ho capito

Questa cosa servirà a breve anche a me.

A quanto pare con rowCssClassExpression puoi specificare una funzione php che viene eseguita per ogni riga.

Avendo a disposizione $row, $data e $this puoi fare le tue valutazioni e ritornare il nome della classe che ti serve.

Ho passato le ultime 2 ore a cercare uno spezzone di codice funzionante, ma ancora nulla.

Tu hai per caso una mini funzione di esempio e sai anche dove inserirla? (model, view, controller)

secondo me se provi a fare $model->getColore_giorni_viaggio è più probabile che vada.

Ho anche notato facendo una function in model chiamata getColore ed usandola per il value che

  • eseguendo ‘return $this->ore’ (la mia colonna si chiama ‘ore’) la colonna ore si popola correttamente

  • modificandola in




if ( $this->ore > 30 )

  return "1";

else

  return "0";




la colonna ore contiene solo zeri, mentre quasi tutti, tranne uno, hanno più di 30 ore segnate . (però la chiamata $model->getColore va)

La seconda prova che ho fatto è di eseguire un bel print_r ("ORE: " . $this->ore) dentro al metodo getColore e … sorpresa … ho scoperto che viene eseguito una unica volta, PRIMA dell’inizio dell’echo della tabella, quindi prima del parsing delle singole righe… difatit $this->ore non è valorizzato

Confermate ?

Confermo, perché usi $model->getColore.

Invece per quello che serve a noi 2, e cioè lavorare sul singolo record bisogna usare $data.

Teoricamente $data->getColore o qualcosa del genere.

Purtroppo non ho ancora trovato uno spezzone di codice funzionante.

si, scusa hai ragione ! La mia poca esperienza ti ha fatto perdere tempo.

Effettivamente sto cercando anche io un sistema per intervenire a livello di parsing della singola riga, perchè servirà anche a me presto o tardi. Continueremo a provare e cercare !

http://www.yiiframework.com/wiki/314/cgridview-use-special-variable-data-in-the-htmloptions-of-a-column-i-e-evaluate-htmloptions-attribute/

scusami se non provo il codice, ma è domenica … e poi ha senso: personalizzi la colonna con una classe che estende CDataColumn, e li hai accesso a ‘$data’.

:)

Come dice realtebo, usa rocCssClassExpression:


                array(

                        'name' => 'IN_VIAGGIO',

                        'rowCssClassExpression'=>'$data->colore',


                        'type' => 'raw',

                        'value' => 'CHtml::label($data->giorni_attesa_viaggio,false)'

                ),

Le expression le devi passare come stinghe, verrano valutate con eval e $data sara’ valida, se la scrivi senza apici php prova a valutarla mentre costruisce l’array, e data non e’ impostata.

Una volta impostata la classe devi ovviamente scrivere il css per cambiare il colore.

scusami zaccaria, ma il colore deve dipendere dal valore della colonna del singolo record…

come può ottenere questo?

Se hai un certo numero di colori (limitato) fai una funzione del tipo:


public function getClassForColor()

{

  if (lala)

    return 'lala';

  if (lulu)

   return 'lulu'

}



e la usi nel ‘rowCssClassExpression’=>’$data->classForColor’; devi impostare una classe per la colonna (myTdClass) poi nel css setti i colori:


table.myDatagridClass tr.lala td.myTdClass

{

   color:red;

}

il problema è che 'lala ’ è il valore della cella stessa. è possibile passare nel ‘rowCssClassExpression’ il valore di $data->attributo ?

nel rowCssExpression passi una funzione da chiamare sul model:


'rowCssClassExpression'=>'$data->colore',

Questa funzione sara’ chiamata per ogni riga e dara’ una classe a tutta la riga.

La funzione viene chiamata sul model, per cui puoi usare tutti gli attributi del model.