Хорошо, я пытаюсь использовать виджет Kartik Depdrop, все, что я получаю белый раскрывающийся список, который не является значениями, которые не отображаются в зависимом выпадающем списке.
У меня есть модель состояния и модель города, и у меня есть такая настройка.
В _form.php
$catList=ArrayHelper::map(app\models\State::find()->all(), 'id', 'state_name' ); echo $form->field($model, 'state')->dropDownList($catList, ['id'=>'state_name']); echo $form->field($model, 'district_city')->widget(DepDrop::classname(), [ 'options'=>['id'=>'district_city'], 'pluginOptions'=>[ 'depends'=>['state_name'], // the id for cat attribute 'placeholder'=>'Select...', 'url'=> \yii\helpers\Url::to(['patient-entry/subcat']) ] ]); ?>
Тогда в модели
public static function getCity($city_id) { $data=\app\models\City::find() ->where(['state_name'=>$city_id]) ->select(['id','city_name'])->asArray()->all(); return $data; }
Тогда в моем контроллере
public function actionSubcat() { $out = []; if (isset($_POST['depdrop_parents'])) { $parents = $_POST['depdrop_parents']; if ($parents != null) { $cat_id = $parents[0]; $out = \app\models\PatientEntry::getCity($cat_id); echo Json::encode(['output'=>$out, 'selected'=>'']); return; } } echo Json::encode(['output'=>'', 'selected'=>'']); }
Когда я выбираю поле состояния, консоль firebug корректно отображает данные:
{"output":[{"id":"172","city_name":"Along"},{"id":"173","city_name":"Bomdila"},{"id":"174","city_name":"Itanagar"},{"id":"175","city_name":"Naharlagun"},{"id":"176","city_name":"Pasighat"}],"selected":""}
Выпадающее поле города также показывает, что оно заполнено данными, но только с пробелами.
Что я здесь делаю неправильно?
Благодарю.
Хорошо, я нашел решение. Весь код в порядке, на самом деле виджет depdrop ищет id
пары и name
:
// the getSubCatList function will query the database based on the // cat_id and return an array like below: // [ // ['id'=>'<sub-cat-id-1>', 'name'=>'<sub-cat-name1>'], // ['id'=>'<sub-cat_id_2>', 'name'=>'<sub-cat-name2>'] // ]
Соответственно, я изменил код в модели
->select(['id','city_name'])->asArray()->all(); with ->select(['id','city_name AS name'])->asArray()->all();
Вот и все, и сейчас он работает нормально. Надеюсь, кто-то найдет это полезным.
Вместо изменения оператора Select вы также можете:
echo $form->field($model, 'district_city')->widget(DepDrop::classname(), [ 'options'=>['id'=>'district_city'], 'pluginOptions'=>[ //// change default 'nameParam'=>'name' to 'nameParam'=>'city_name', 'depends'=>['state_name'], // the id for cat attribute 'placeholder'=>'Select...', 'url'=> \yii\helpers\Url::to(['patient-entry/subcat']) ] ]); ?>
измените 'nameParam' на 'city_name'