Yii2:使用 Kartik Depdrop 小部件?
Yii2: Using Kartik Depdrop Widget?
好的,我正在尝试使用 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'=>'']);
}
当我 select 状态字段时,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'
好的,我正在尝试使用 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'=>'']);
}
当我 select 状态字段时,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'