Зависимые поля в yii Пример 1

/**
 * Метод возвращает список городов, выбирая уникальные значения атрибута city
 * @param boolean индексировать ли элементы своими значениями
 * по умолчанию метод возвращает архив для виджета CAutocomplete 
 * array(0=>'New York')
 * если же входной параметр установлен в true - массив элементов для dropDownList
 * array('New York'=>'New York')
 */
public static function getCountriesValues($index = false)
{
    $sql = "SELECT DISTINCT country FROM {{museum}}";
    $command = Yii::app()->db->createCommand($sql);
    $data = $command->query();
    $countries = array();
    while(($row  = $data->read()) != false)
    {
        if ($index)
            $countries[$row['country']] = $row['country'];
        else
            $countries[] = $row['country'];
    }
    return $countries;
}

выдержка из view-файла

$country = (!$model->isNewRecord) ? $model->museum->country : ''; // значение, которое должно быть автоматически выбрано в списке стран
echo CHtml::dropDownList('country', $country, Museum::getCountriesValues(true), array(
    'empty'=>Yii::t('default', 'Select a country'),
    'ajax'=>array(
        'type'=>'GET',
        'url'=>CController::createUrl('museum/getcities'), // взять данные из результата работы actionGetcities контроллера museum
        'update'=>'#Item_city',
        'data'=>array(
            'country'=>'js:this.value',
            'city'=>(!$model->isNewRecord) ? $model->museum->city : null, // если редактируется запись - передадим текущее значение атрибута связанной модели
        ),
    ),
));
// Второй выпадающий список, куда будут подгружаться данные, полученные из AJAX-запроса
echo CHtml::dropDownList('Item_city', '', array(), array(
    'empty'=>Yii::t('default', 'Select a city'),
    'ajax'=>array(
        'type'=>'GET',
        'url'=>CController::createUrl('museum/getmuseums'),
        'update'=>'#Item_museum_id',
        'data'=>array(
            'city'=>'js:this.value',
            'museum'=>(!$model->isNewRecord) ? $model->museum->id : null,
        ),
    )
));
echo $form->dropDownList($model, 'museum_id', array());

MuseumController

public function actionGetcities()
{
    $country = Yii::app()->request->getParam('country');
    $city = Yii::app()->request->getParam('city');
    if ($country !== null)
    {
        $data = Yii::app()->db->createCommand()
            ->selectDistinct('city')
            ->from('{{museum}}')
            ->where('country=:country', array(':country'=>$country))
            ->query();
        while(($row = $data->read()) != false)
        {
            $params=array('value'=>$row['city']);
            if(($city !== null)&&($row['city']==$city) // если было передан город и в результатах он встречается,
                $params['selected']=true; // то сделать элемент списка выбранным
            echo CHtml::tag('option', $params, CHtml::endcode($row['city']), true);
        }
    }
}