Зависимые dropDownlist.

Здравствуйте! Недавно начал изучать Yii и столкнулся с такой задачей: есть таблица, в которой поля (id, name, country, city). Нужно что бы при заполнении формы, выбрав country соответственно подргужалось для него поле city.

Я перепробовал всевозможные примеры, ничего не вышло. Возможно нужно по другому организовать таблицу?

Внимательно изучив предоставленную вами информацию и каждый из всевозможных примеров, который вы попробовали, а также ознакомившись со структурой ваших таблиц, не могу не согласиться с вашим предположением, что возможно нужно что то менять. :trollface:

А как именно вы обновляете поле "город" при изменении выпадающего списка "страна"? Аякс запрос? К какому URL?

использовать, как это

$data = CHtml::listData(Courses::model()->findAll(array(‘order’=>‘course_name DESC’)),‘id’,‘course_name’);

echo CHtml::dropDownList(‘cid’,’’,$data,

array(‘prompt’=>‘Select’,

‘ajax’ => array(

‘type’=>‘POST’,

‘url’=>CController::createUrl(‘Students/batch’),

‘update’=>’#batch_id’,

‘data’=>‘js:$(this).serialize()’,

)));

echo CHtml::activeDropDownList($model,‘batch_id’,$data1,array(‘prompt’=>‘Select’,‘id’=>‘batch_id’)); ?>

in controller

в контроллер

public function actionBatch()

{


	


	


	$data=Batches::model()->findAll('course_id=:id', 


              array(':id'=>(int) $_POST['cid']));


			  


	echo CHtml::tag('option', array('value' => 0), CHtml::encode('-Select-'), true);





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


	  foreach($data as $value=>$name)


	  {


		  echo CHtml::tag('option',


					 array('value'=>$value),CHtml::encode($name),true);


	  }


}

Пробую сделать по этому примеру

view




<?php 

   $country = (!$model->isNewRecord) ? $model->museum->country : ''; // значение, которое должно быть автоматически выбрано в списке стран

echo CHtml::dropDownList('country', $country, Address::getCountriesValues(true), array(

    'empty'=>Yii::t('default', 'Select a country'),

    'ajax'=>array(

        'type'=>'GET',

        'url'=>CController::createUrl('address/getcities'), // взять данные из результата работы actionGetcities контроллера museum

        'update'=>'#city',

        'data'=>array(

            'country'=>'js:this.value',

            'city'=>(!$model->isNewRecord) ? $model->address->city : null, // если редактируется запись - передадим текущее значение атрибута связанной модели

        ),

    ),

));?>    

    <?php echo $form->error($model,'country'); ?>

  </div>

 

  

  <div class="row">

  <?php echo $form->labelEx($model,'city'); ?>

   <?php echo $form->dropDownList($model, 'city', array()); ?>

  <?php echo $form->error($model,'city'); ?>

  </div>




Conntroller




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('{{address}}')

            ->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);

        }

    }

}



Но в силу не опытности, это оказалось затруднительно.

Как можно организовать мою задачу, отталкиваясь от этого примера?

посмотри fireBug’ом или аналогом какой у тебя id в поле “город”? У меня подозрение что он не id="city’ а id=‘modelname_city’


'update'=>'#city',

эта строка указывает селектор в который вставится результат (элемент с id=‘city’) и если на странице не будет такого элемента, то результат никуда не будет вставлен. Проверь этот момент.

Еще попробуй в браузере открыть страницу /address/getcities?country=1 (подставь существующий id) нормально ли отработает?

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

Проблема оказалась в том, что айди селектора, как заметил Charger , все таки оказался id=‘modelname_city’.

и созданы 2 таблицы "страны" (id, name) и "города" (id, country_id, name)

Спасибо за помощь!