Здравствуйте! Недавно начал изучать Yii и столкнулся с такой задачей: есть таблица, в которой поля (id, name, country, city). Нужно что бы при заполнении формы, выбрав country соответственно подргужалось для него поле city.
Я перепробовал всевозможные примеры, ничего не вышло. Возможно нужно по другому организовать таблицу?
Внимательно изучив предоставленную вами информацию и каждый из всевозможных примеров, который вы попробовали, а также ознакомившись со структурой ваших таблиц, не могу не согласиться с вашим предположением, что возможно нужно что то менять. :trollface:
А как именно вы обновляете поле "город" при изменении выпадающего списка "страна"? Аякс запрос? К какому URL?
<?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) нормально ли отработает?
В общем нужно понять, либо данные не уходят аяксом, либо ошибочно обрабатываются, либо неправильно возвращаются, и потом уже искать причины.