@indefpro
Начинающий прогер

Как сделать «подвыпадающий» список?

Добрый день!
Есть выпадающий список:
<?php
$items = ArrayHelper::map($category,'id','title');
$params = [
    'prompt' => 'Выберите категорию'
];
echo $form->field($model, 'category_id')->dropDownList($items,$params);
?>

Данные берутся из модели category, как сделать, что бы при выборе категории, появлялся второй выпадающий список с данными из модели subcategory и именно с под категориями которые относятся к выбранной категории.
Category - выглядит так: ID, TITLE
Subcategory - выглядит так: ID, CATEGORY_ID, TITLE
  • Вопрос задан
  • 146 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
Для решения Вашей задачи лучше всего использовать что-нибудь из готовых виджетов
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Самый простой вариант, без использования сторонних модулей, виджетов и тому подобного.
В файле form.php формируется два выпадающих списка, один из них по умолчанию отключён.
Пример из моего рабочего проекта, Вам надо будет только заменить имена модели, контроллера и перевод(англ/русс).
<div class="col-lg-6">
        <?= $form->field($model, 'country_id')->dropDownList(Countries::getActiveCountry(),
                                                 [
                                                     'prompt' => AirlinesModule::t('module','AIRLINES_PROMPT_FORM'),
                                                     'onchange' => '
                                                         $.post(
                                                          "'. Url::toRoute('default/ajax') .'",
                                                          {id: $(this).val()},
                                                          function(data){
                                                            $("select#city").html(data).attr("disabled", false)
                                                          }
                                                         )
                                                     '
                                                 ]
                                                ) ?>
    </div>
    <div class="col-lg-6">
        <?= $form->field($model, 'city_id')->dropDownList(Cities::getActiveCity(),
              [
                  'prompt' => AirlinesModule::t('module', 'AIRLINES_PROMPT_FORM'),
                  'id' => 'city',
                  'disabled' => $model->isNewRecord ? true : false
              ]
            ) ?>
    </div>

В модели два метода, для стран и городов. Хотя у меня две модели, отдельно для городов и отдельно для стран, эти два метода поместить в одну модель можно.
public static function getActiveCountry()
    {
        return ArrayHelper::map(self::find()->where(['status' => self::STATUS_ACTIVE])->orderBy('country')->all(), 'id', 'country');
    }

    public static function getActiveCity()
    {
        return ArrayHelper::map(self::find()->where(['status' => self::STATUS_ACTIVE])->orderBy('city')->all(), 'id', 'city');
    }


В контролере создаёте действие Ajax, хотя опять же, не обязательно его так называть, назовёте как захотите.
public $option = '';
    public function actionAjax()
    {
        if(Yii::$app->request->isAjax){
            $id = (int)Yii::$app->request->post('id');
            $this->option = "<option value='0'>" . AirlinesModule::t('module', 'AIRLINES_PROMPT_FORM') . "</option>";

            $cities = Cities::find()
                              ->where(['status' => Cities::STATUS_ACTIVE])
                              ->andWhere('country_id=:id',[':id' => $id])
                              ->orderBy('city')
                              ->all();
            foreach ($cities as $city){
                $this->option .= '<option value="' . $city->id . '">' . $city->city . '</option>';
            }

        }
        return $this->option;
    }

Всё, в итоге два взаимосвязанных выпадающих списка у Вас есть.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы