caricamento dropdownlist

salve a tutti, premetto che mi sono avvicinato da pochissimo a php e ai framework per questo linguaggio.

ho questa necessità.

vista la semplicità di creare il MVC partendo da una tabella di un db, ho ora necessità di caricare una lista(per esempio di città o di genere) facendo riferimento ad un model diverso da quello di riferimento del form.

per esempio, stò cercando di modificare il form di login, creato in automatico da yii al momento della creazione di una nuova webapp.

nello specifico:

nel file login.php ho aggiunto:




<div>

	<?php echo $form->dropDownList($model,'genere', CHtml::listData(User::model()->getGenderOptions(), 'id', 'type'), array('empty'=>'ciao')); ?>

	</div>



nel model User.php ho aggiunto




public function getGenderOptions()

	{

			return array(

			0 => 'Maschio',

			1 => 'Femmina',

			);

	}



fuzione che mi restituisce un array di genere(maschile e femminile)

Così scritto quando apro /testdrive/index.php/site/login

nella dropdownlist ho solo "ciao" invece di avere nella lista anche "maschile" e "femminile"

come posso far caricare il risultato della chiamata alla funzione getGenderOptions ????

grazie

non hai bisogno di utilizzare listData in quanto i dati non provengono da database, quindi puoi utiizzare direttamente :




<div>

        <?php echo $form->dropDownList($model,'genere', User::model()->getGenderOptions(), array('empty'=>'ciao')); ?>

        </div>



La risposta di Markux e’ ineccepibile, ma io mi chiedo, perche’ non usare un campo enum? Aumenta di molto la leggibilita’ del database e ti risparmia codice nelle view.

Puoi inoltre usare un metodo generico per generare enumDropDownList:




class ZHtml extends CHtml

	public static function enum($model, $attribute)

	{

		$mod=$model;

		$attr=$attribute;

		self::resolveNameID($mod,$attr);

		$enum=$model->tableSchema->columns[$attr]->dbType;

		$off=strpos($enum,"(");

		$enum=substr($enum, $off+1, strlen($enum)-$off-2);

		$keys=str_replace("'",null,explode(",",$enum));

		for($i=0;$i<sizeof($keys);$i++)

			$values[$keys[$i]]=Yii::t('enumItem',$keys[$i]);

		return $values;

	

	}


	public static function enumDropDownList($model,$attribute, $htmlOptions=null)

	{

	    return CHtml::activeDropDownList($model,$attribute,	ZHtml::enum($model, $attribute),$htmlOptions);		

	}

}




innanzi tutto grazie markux.

il mio esempio era senza nessuna chiamata a db, ma ovviamente la mia intenzione è quella…cioè caricare quei valori dinamicamente.

quindi nel metodo:




public function getGenderOptions()

	{

		

			

		

			return array(

			0 => 'Maschio',

			1 => 'Femmina',

			);

	}



come integro una chiamata al db?

zaccaria:

ho capito il senso del tuo suggerimento, ma poi, sulla view come richiamo la cosa?..

Nella view non serve richiamare niente, il campo enum e’ gestito come se fosse un campo di testo con scritto dentro ‘Maschio’ oppure ‘Femmina’, e’ questo il bello.

La chiamata al db non serve per il genere, per un altra ddl, per esempio la citta’ puoi usare:


CHtml::listData(tuoModel::model()->findAll(), 'chiave', 'campo');

Dai una occhiata alla documentazione di listdata per i dettagli.