How to preload dropdowns in CForm

This wiki article has not been tagged with a corresponding Yii version yet.
Help us improve the wiki by updating the version information.

So you want to use CForm (form builder), but need to preload dropdowns in a form? It's simpler than it seems.
You got your CFormModel, CForm and the actual Form, right?
Let's say you have the typical State -> City dependent dropdowns, so you would want to load the from with the State and City selected.

For this example to work, you need a table for countries, states and cities and the must be related (have foreign keys). Or whatever.

In your controller, you create a new form:

$address_model = new AddressFormModel;

And then, if you have a value you do this (in your controller):

$address_model->state_id = $previously_loaded_customer_address_for_example->state_id;
/* same for the city */
$address_model->city_id = $previously_loaded_customer_address_for_example->city_id;

Now, all you have to do, is this in your CForm:

return array(
				I already have the country_id in a param variable, so I use it to select states from that country 
				getStates is my method to get States from the DB that belong to country_id
			'items'=>CHtml::listData(State::model()->getStates(Yii::app()->params['country_id']), 'state_id', 'state'),
			/* getCities is my method to get Cities that belong to the State of the address */
			'items'=>CHtml::listData(City::model()->getCities($this->model->state_id), 'city_id', 'city'),
			'prompt'=>'Please choose state',
		/* other elements */

Not only the City dropdown will be filled with Cities from the State, but the chosen City will be preselected in the dropdown. That's pretty cool.

In short, you can access the values of the model in the CForm with


API documentation: [CForm]
More info, check the comments too:

So, tip or how-to? you be the judge :)