Простой пример реализации зависимых 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.
devreadwrite.com

Подборка адаптивных шаблонов для вашей CMS
Статьи по
Как получить и установить HTTPS сертификат на сайта

Комментарии
Спасибо, очень пригодилось
Ответить