Простой пример реализации зависимых dropDownList (select) в Yii

Начнем с вывода формы, добавим код в представление (view) форму и два поля типа select, первое с выбором страны, второе с выбором города, которое будет зависеть от первого select'а с выбором страны:

<?php 

$form=$this->beginWidget('CActiveForm', array(
    'id' => 'my-form',
    'enableClientValidation' => true,
    'htmlOptions' => array(
        'enctype' => 'multipart/form-data', 
        'autocomplete' => 'off',
        'role' => 'form'
    ),
    'clientOptions' => array(
        'validateOnSubmit' => true,
     )
)); 
?>

<div class="row">
    <div class="form-group">

    <?php 
    echo $form->labelEx($model, 'country_id');
    echo $form->dropDownList($model, 'country_id', CHtml::listData(Country::model()->findAll(),
        array(
            'class' => 'form-control',
            'prompt' => 'Выберите страну',
            'ajax' => array(
                'type' => 'POST',
                'url' => Yii::app()->createUrl('yourController/getCitiesByCountryId'),
                'update' => '#city',
                'data' => array('country_id' => 'js:this.value'),
            )
        )
    );
    echo $form->error($model, 'country_id', array('class' => 'help-block small')); 
    ?>

    </div>
    <div class="form-group">

    <?php 
    echo $form->labelEx($model, 'city_id');
    echo $form->dropDownList(
        $model, 
        'city_id', 
        CHtml::listData(
            City::model()->findAll(
                array(
                    'condition' => 'country_id="' . $model->country_id . '"', 
                    'order' => 'position'
                )
            ), 
            'city_id', 
            'name'
        ), 
        array(
            'class' => 'form-control', 
            'id' => 'city'
        )
    );
    echo $form->error($model, 'city_id', array('class' => 'help-block small')); 
    ?>

    </div>

    <?php 
    echo CHtml::submitButton($model->isNewRecord ? 'Add' : 'Update', array('class'=>'btn btn-primary'));
$this->endWidget(); 
?>

</div>

Разберемся с кодом представления. Строка 21, выпадающий список с перечнем стран из БД. Строки 25-30, передаем id выбранной страны (29) постом (26) в getCitiesByCountryId (27), получаем ответ и обновляем элемент с id "city" (28). Далее все как обычно.

Пропустим сохранение модели, и перейдем к выводу списка городов в зависимости от выбранной страны добавляем в необходимый контроллер действие (action) в выводом списка городов:

<?php

class YourController extends Controller {

    //...

    public function actionGetCitiesByCountryId() {
        $data = City::model()->findAll('country_id=:countryId',
            array(':countryId'=>(int) $_POST['country_id']));

        $data = CHtml::listData($data, 'city_id', 'name');

        echo "<option value=''>Выберите город</option>";
        foreach($data as $value => $key) {
            echo CHtml::tag('option', array('value' => $value), CHtml::encode($key), true);
        }
    }
}

Пример реализации нескольких связанных dropDownLis (select) в Yii

Текущий пример практически не отличается от предыдущего, но на всякий случай реализуем и его. Добавим еще одно поле с возможностью выбора. Теперь принцип работы будет следующим: выбираем страну, в зависимости от выбранной страны выводим список штатов/областей или еще чего выбранной стран, а уже в зависимости от выбранного штата выводить выпадающий список с перечнем городов этого штата.

Пример представления (view):

<?php 

$form=$this->beginWidget('CActiveForm', array(
    'id' => 'my-form',
    'enableClientValidation' => true,
    'htmlOptions' => array(
        'enctype' => 'multipart/form-data', 
        'autocomplete' => 'off',
        'role' => 'form'
    ),
    'clientOptions' => array(
        'validateOnSubmit' => true,
     )
)); 
?>

<div class="row">
    <div class="form-group">

    <?php 
    echo $form->labelEx($model, 'country_id');
    echo $form->dropDownList($model, 'country_id', CHtml::listData(Country::model()->findAll(),
        array(
            'class' => 'form-control',
            'prompt' => 'Выберите страну',
            'ajax' => array(
                'type' => 'POST',
                'url' => Yii::app()->createUrl('yourController/getStatesByCountryId'),
                'update' => '#state',
                'data' => array('country_id' => 'js:this.value'),
            )
        )
    );
    echo $form->error($model, 'country_id', array('class' => 'help-block small')); 
    ?>

    </div>
    <div class="form-group">

    <?php 
    echo $form->labelEx($model, 'state_id');
    echo $form->dropDownList($model, 'state_id', CHtml::listData(State::model()->findAll(),
        array(
            'class' => 'form-control',
            'prompt' => 'Выберите штат/область',
            'ajax' => array(
                'type' => 'POST',
                'url' => Yii::app()->createUrl('yourController/getCitiesByCitiesId'),
                'update' => '#city',
                'data' => array('state_id' => 'js:this.value'),
            )
        )
    );
    echo $form->error($model, 'state_id', array('class' => 'help-block small')); 
    ?>

    </div>
    <div class="form-group">

    <?php 
    echo $form->labelEx($model, 'city_id');
    echo $form->dropDownList(
        $model, 
        'city_id', 
        CHtml::listData(
            City::model()->findAll(
                array(
                    'condition' => 'country_id="' . $model->country_id . '"', 
                    'order' => 'position'
                )
            ), 
            'city_id', 
            'name'
        ), 
        array(
            'class' => 'form-control', 
            'id' => 'city'
        )
    );
    echo $form->error($model, 'city_id', array('class' => 'help-block small')); 
    ?>

    </div>

    <?php 
    echo CHtml::submitButton($model->isNewRecord ? 'Add' : 'Update', array('class'=>'btn btn-primary'));
$this->endWidget(); 
?>

</div>

Осталось реализовать действия (action), для вывода списка штатов и городов в зависимости от выбора:

<?php 

class YourController extends Controller {

    //...

    public function actionGetStatesByCountryId() {
        $data = City::model()->findAll('country_id=:countryId',
            array(':countryId'=>(int) $_POST['country_id']));

        $data = CHtml::listData($data, 'state_id', 'name');

        echo "<option value=''>Выберите штат/город</option>";
        foreach($data as $value => $key) {
            echo CHtml::tag('option', array('value' => $value), CHtml::encode($key), true);
        }
    }

    public function actionGetCitiesByCountryId() {
        $data = City::model()->findAll('state_id=:stateId',
            array(':stateId'=>(int) $_POST['state_id']));

        $data = CHtml::listData($data, 'city_id', 'name');

        echo "<option value=''>Выберите город</option>";
        foreach($data as $value => $key) {
            echo CHtml::tag('option', array('value' => $value), CHtml::encode($key), true);
        }
    }
}

Имея в вооружении эти два примера, вы можете реализовать любое количество зависимых выпадающих списков в Yii.