Зависимые поля в 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); } } }