CGridView: Dropdownlist in campo di ricerca

Ciao a tutti,

sto lavorando al mio primo progetto Yii 1.1.8.

Ho un modulo di amministrazione utenti che ho installato e funziona.

La pagina di amministrazione utenti del modulo presenta in una CGridView la lista degli utenti e i bottoni di view/edit/delete, ma non la form di ricerca iniziale sui campi tipica della generazione CRUD di GII.

Sto cercando di crearla. :stuck_out_tongue:

Ora, nelle righe della grid relative ad ogni utente, i campi createtime e status sono correttamente formattati in linguaggio naturale:

[i]array(

ā€˜nameā€™ => ā€˜createtimeā€™,

ā€˜valueā€™ => ā€˜date(ā€œd.m.Y H:i:sā€,$data->createtime)ā€™,

),

array(

ā€˜nameā€™=>ā€˜statusā€™,

ā€˜valueā€™=>ā€˜User::itemAlias(ā€œUserStatusā€,$data->status)ā€™,

),[/i]

dove User::itemAlias ĆØ

[i]public static function itemAlias($type,$code=NULL) {

	$_items = array(


		'UserStatus' => array(


			self::STATUS_NOACTIVE => UserModule::t('Not active'),


			self::STATUS_ACTIVE => UserModule::t('Active'),


			self::STATUS_BANED => UserModule::t('Banned'),


		),


		'AdminStatus' => array(


			'0' => UserModule::t('No'),


			'1' => UserModule::t('Yes'),


		),


	);


	if (isset($code))


		return isset($_items[$type][$code]) ? $_items[$type][$code] : false;


	else


		return isset($_items[$type]) ? $_items[$type] : false;


}[/i]

Ok.

Ho aggiunto la form di ricerca per campi copiando da uno scheletro di CRUD qualsiasi, e funziona.

Tuttavia vorrei:

  1. Trasformare il campo status (attualmente renderizzato nella form come input="text"), in una combobox che mi visualizzi i nomi/valori possibili leggendo User::itemAlias("UserStatus",$data->status)

  2. Utilizzare il widget calendario per il campo createtime

Di seguito il codice del CGridView nella view:

$this->widget(ā€˜zii.widgets.grid.CGridViewā€™, array(

'id'=>'user-search-grid',


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


'filter'=>$model,


'columns'=>array(


	array(


		'name' => 'id',


		'value' => '$data->id',


		'filter' => false,


	),


	'username',


	'email',


	array(


		'name' => 'createtime',


		'value' => 'date("d.m.Y H:i:s",$data->createtime)',


	),


	array(


		'name' => 'lastvisit',


		'value' => '(($data->lastvisit)?date("d.m.Y H:i:s",$data->lastvisit):UserModule::t("Not visited"))',


	),


	array(


		'name'=>'status',


		'value'=>'User::itemAlias("UserStatus",$data->status)',


	),


	array(


		'name'=>'superuser',


		'value'=>'User::itemAlias("AdminStatus",$data->superuser)',


	),


	array(


		'class'=>'CButtonColumn',


	),


),

));

Suppongo di dover intervenire su ā€˜filterā€™=>$modelā€¦ma in che modo? Oppure devo muovermi diversamente?

Grazie e ciao,

Andrea

Aggiorno.

Ho risolto il problema di visualizzare un filter come combobox invece che come text in una CGridView. :P

Basta aggiungere la chiave ā€˜filterā€™ alla colonna sulla quale si vuole determinare il parametro di ricerca con una combobox:

array(

'name'=>'attribute',


'value'=>'$data->attribute',


'filter'=>array(0=>"No", 1=>"Yes"),

),

Nel mio caso, ho valorizzato lā€™array non nella View, ma nella actionAdmin del Controller, e lā€™ho passato alla view come variabile:

array(

'name'=>'status',


'value'=>'User::itemAlias("UserStatus",$data->status)',


'filter'=>$statusCombo,

),

Ecco il topic illuminante:

http://www.yiiframework.com/forum/index.php?/topic/10514-cgridview-filter-control/page__p__51640__hl__CGridView#entry51640

Tanto facile e favoloso una volta imparato quanto difficile scovare la soluzione :D