Cdetailview: Elaborare Il Dato Di Un Attributo Tramite Una Funzione Custom

Ciao ragazzi,

stavolta avrei bisogno di una dritta su come rendere leggibili dei dati durante la visualizzazione "view" di un item…mi spiego meglio:

l’item in questione è un model di tipo “Applicazioni” e come spesso capita, ha degli attributi che non sono altro che ID di tabelle anagrafiche esterne, ad esempio

"Sistema Operativo = 2" dove nella tabella "SistemiOperativi" il 2 = "Win7" ad esempio.

praticamente ho la necessità di rendere umanamente leggibili i dati numerici che ho.

ora come sappiamo il 99% delle view.php utilizza CDetailView come classe per presentare i dati, domanda: [b]

come è possibile inserire all’iterno di uno o + attributi una funzione custom capace di formattare i dati?[/b]




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

	'data'=>$model,

	'attributes'=>array(

		'id_applicazioni',

		'desc_nome',

		'fk_id_area',

		'fk_id_tipi_applicazioni',

		'fk_id_aree_infap',

		'fk_id_piattaforma',

		'fk_id_unita_organizzativa',

		'fk_id_societa',

		'nume_dismessa',

		'nume_sostituita',

		'nume_certificazione',

		'data_dismissione',

		'row_created_dttm',

		'row_created_user',

		'row_updated_dttm',

		'row_updated_user',

		array(

			'name'=>'flag_eliminato_sn',

        	// --> funzioneCustomFormat prende il dato lo elabora e ne ripresenta il corrispettivo label etc etc

        	// --> questa cosa l'ho provata in CGridView e và...ma in CDetailView no...

			'value'=>array('Applicazioni','funzioneCustomFormat')

		),

	),

)); ?>



come posso procedere?

grazie in anticipo!

ad esempio in un’altra applicazione, in CGridView ho usato questa sintassi, e la cosa funziona:




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

				array(

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

					'rowCssClass'=>array('zebra_1','zebra_2'),

					'pagerCssClass'=>'paginatore',

					'itemsCssClass'=>'ticket_table',

					'htmlOptions'=>array('class'=>''),

					'pager'=>array(

						'maxButtonCount'=>6,

						'firstPageLabel'=>'<<',

						'lastPageLabel'=>'>>',

						'prevPageLabel'=>'<',

						'nextPageLabel'=>'>',

						'htmlOptions'=>array('class'=>'ul_paginatore'),

						'header'=>'',//*** tolgo 'Go to page'

					),

					//'summaryText'=>'{start}',

					'template'=>

					

						"

						{pager}

						<div class=\"clearbox\"></div>

						{items}

						",

				

					'columns'=>array(

						array(

							'name'=>'idrichieste_ai',

							'htmlOptions'=>array('class'=>'tid_redirect'),

							'value'=>'$data->idrichieste_ai'

						),

						array(

							'name'=>'order_by_stato',

							'value'=>'$data->statiRichiestes->idStatiPerLabel->nome_stati'

						),

						array(

							'name'=>'order_by_tipologia',

							'value'=>'$data->tipologiaAttivitaLabel->nome_attivita'

						),

						'oggetto_chiamata',

						'author',

						array(

							'name'=>'data_richiesta',

qui -------------------------->//*** formatField è una funzione che ho messo nel model 'AnagraficaRichieste' 

							'value'=>array('AnagraficaRichieste','formatField'), <----------------------------- qui

						)

					)

				)

			);



scusate il doppio post.

Nella clistview puoi chiamare direttamente la funzione:


  'value'=>Applicazioni::funzioneCustomFormat($model->data)



Per questi casi e’ meglio fare un getter nel model per ottenere il valore gia’ formattato:


public function getFormattedData()

{

  return Applicazioni::funzioneCustomFormat($model->data)

}

In questa maniera aggiungi valore al model, e puoi usarlo anche nella cgridView senza ricorrere a dei callable, che sono l’equivalente delle goto e incasinano il codice

perfetto!

come al solito, grazie Zaccaria ;)

ora provo alcune cose e posterò la mia "soluzione"!

ok praticamente alla fine dei giochi ho fatto come mi hai suggerito te(Zaccaria).

oh inserito la funzione nel model* e l’ho richiamata nella vista , in questo modo:


		

...

...'nume_certificazione',

		'data_dismissione',

		'row_created_dttm',

		'row_created_user',

		'row_updated_dttm',

		'row_updated_user',

		array(

			'name'=>'flag_eliminato_sn',

			'value'=>$model->formatInput( 'flag_eliminato_sn' )

		),...

...

poi nel model* la funzione fa una cosa semplicissima, per ora:


	public function formatInput($field){

		

		switch ($field){

			

			//*** FLAG_ELIMINATO_SN

			case 'flag_eliminato_sn':

				$tmp = $this->attributes[$field];

				return $tmp .= ($this->attributes[$field]=='S')?" (Elemento eliminato)":" (Elemento attivo)";

				

			//*** per default ritorno il valore di entrata	

			default:return $this->attributes[$field];

		}

		

	}

  • = in realtà questa funzione formattatrice, per motivi di comodità l’ho inserita all’interno di una classe che ho inserito tra i Model e ActiveRecord…ma la lgica della cosa è la stessa.

ciao e grazie.