Простой пример реализации зависимых 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.
Комментарии
Спасибо, очень пригодилось
Ответить