Yii2 kartik 依赖下拉列表不加载下一个下拉列表
Yii2 kartik depend dropdown doesnt load next drop down list
我正在使用 kartik DepDropdown 小部件。当我选择区域时,它必须在特定的下拉列表中加载它的所有城市(例如带有 id city_id
的那个)。
在 chrome 网络选项卡中,我可以看到操作 returns 所有城市的预期结果 json 格式
{
"output": {
"40": "Велико Търново",
"41": "Горна Оряховица",
"42": "Елена",
"43": "Златарица",
"44": "Лясковец",
"45": "Павликени",
"46": "Полски Тръмбеш",
"47": "Свищов",
"48": "Стражица",
"49": "Сухиндол"
},
"selected": ""
}
但它们不会加载到 #city_id
下拉列表中。我的观点如下:
<div class="col-sm-6">
<?= $form->field($model, 'region_id')->dropDownList(Region::getAllRegions(), ['id' => 'region-dd', 'prompt'=> ' - ' . Yii::t('app', 'Region') . ' - ']); ?>
</div>
<div class="col-sm-6">
<?= $form->field($model, 'city_id')->widget(DepDrop::classname(), [
'options'=>[
'id'=>'city-id'
],
'pluginOptions'=>[
'allowClear' => true,
'depends' => ['region-dd'],
'url' => Url::to(['/system-information/load-cities'])
]
]); ?>
</div>
我的控制器:
public function actionLoadCities()
{
$out = [];
if (isset($_POST['depdrop_parents'])) {
$parents = $_POST['depdrop_parents'];
if ($parents != null) {
$region_id = $parents[0];
$out = City::getAllCities($region_id);
echo Json::encode(['output'=>$out, 'selected'=>'']);
return;
}
}
echo Json::encode(['output'=>'', 'selected'=>'']);
}
提前致谢!
您必须提供 name=>value
对 id
和 text
以分配给单个选项,如果您查看 DOCS
,您将看到你必须 return 数组如下
[
'out'=>[
['id'=>'<city-id>', 'name'=>'<city-name>'],
['id'=>'<city-id>', 'name'=>'<city-name>']
],
'selected'=>'<city-id>'
]
这意味着 ID 将与索引 id
一起提供,下拉列表的文本将与索引 name
一起提供,并查看您提供方法的响应 getAllCities
是 return 如下数组
[
'id'=>'name',
'id'=>'name',
]
您没有添加 City::getAllCities($region_id);
方法 returning $out
数组,但在最基本的层面上,根据文档,它应该如下所示,
注意:分别更改 table
和 column
名称,我假设您有城市的 id
和 name
列,如果您有城市名称的任何其他列名称,例如 city_name
那么您必须为查询中的 city_name
字段创建别名 name
。
public function getAllCities($region_id){
$query = new \yii\db\Query;
$query->select('id, name')
->from('{{%city}}')
->where(['=', 'region_id', $region_id])
->limit(20);
$command = $query->createCommand();
return $command->queryAll();
}
这将 return 如下所示的数组。
Array
(
[0] => Array
(
[id] => 40
[name] => Велико Търново
)
[1] => Array
(
[id] => 41
[name] => Горна Оряховица
)
[2] => Array
(
[id] => 42
[name] => Елена
)
[3] => Array
(
[id] => 43
[name] => Златарица
)
)
将被编码为 JSON,如下所示
[
{
"id": "40",
"name": "Велико Търново"
},
{
"id": "41",
"name": "Горна Оряховица"
},
{
"id": "42",
"name": "Елена"
},
{
"id": "43",
"name": "Златарица"
}
]
最终当按行编码时
echo Json::encode(['output'=>$out, 'selected'=>'']);
会return
{
"output": [
{
"id": "40",
"name": "Велико Търново"
},
{
"id": "41",
"name": "Горна Оряховица"
},
{
"id": "42",
"name": "Елена"
},
{
"id": "43",
"name": "Златарица"
}
],
"selected": ""
}
希望这对您有所帮助。
我正在使用 kartik DepDropdown 小部件。当我选择区域时,它必须在特定的下拉列表中加载它的所有城市(例如带有 id city_id
的那个)。
在 chrome 网络选项卡中,我可以看到操作 returns 所有城市的预期结果 json 格式
{
"output": {
"40": "Велико Търново",
"41": "Горна Оряховица",
"42": "Елена",
"43": "Златарица",
"44": "Лясковец",
"45": "Павликени",
"46": "Полски Тръмбеш",
"47": "Свищов",
"48": "Стражица",
"49": "Сухиндол"
},
"selected": ""
}
但它们不会加载到 #city_id
下拉列表中。我的观点如下:
<div class="col-sm-6">
<?= $form->field($model, 'region_id')->dropDownList(Region::getAllRegions(), ['id' => 'region-dd', 'prompt'=> ' - ' . Yii::t('app', 'Region') . ' - ']); ?>
</div>
<div class="col-sm-6">
<?= $form->field($model, 'city_id')->widget(DepDrop::classname(), [
'options'=>[
'id'=>'city-id'
],
'pluginOptions'=>[
'allowClear' => true,
'depends' => ['region-dd'],
'url' => Url::to(['/system-information/load-cities'])
]
]); ?>
</div>
我的控制器:
public function actionLoadCities()
{
$out = [];
if (isset($_POST['depdrop_parents'])) {
$parents = $_POST['depdrop_parents'];
if ($parents != null) {
$region_id = $parents[0];
$out = City::getAllCities($region_id);
echo Json::encode(['output'=>$out, 'selected'=>'']);
return;
}
}
echo Json::encode(['output'=>'', 'selected'=>'']);
}
提前致谢!
您必须提供 name=>value
对 id
和 text
以分配给单个选项,如果您查看 DOCS
,您将看到你必须 return 数组如下
[
'out'=>[
['id'=>'<city-id>', 'name'=>'<city-name>'],
['id'=>'<city-id>', 'name'=>'<city-name>']
],
'selected'=>'<city-id>'
]
这意味着 ID 将与索引 id
一起提供,下拉列表的文本将与索引 name
一起提供,并查看您提供方法的响应 getAllCities
是 return 如下数组
[
'id'=>'name',
'id'=>'name',
]
您没有添加 City::getAllCities($region_id);
方法 returning $out
数组,但在最基本的层面上,根据文档,它应该如下所示,
注意:分别更改 table
和 column
名称,我假设您有城市的 id
和 name
列,如果您有城市名称的任何其他列名称,例如 city_name
那么您必须为查询中的 city_name
字段创建别名 name
。
public function getAllCities($region_id){
$query = new \yii\db\Query;
$query->select('id, name')
->from('{{%city}}')
->where(['=', 'region_id', $region_id])
->limit(20);
$command = $query->createCommand();
return $command->queryAll();
}
这将 return 如下所示的数组。
Array
(
[0] => Array
(
[id] => 40
[name] => Велико Търново
)
[1] => Array
(
[id] => 41
[name] => Горна Оряховица
)
[2] => Array
(
[id] => 42
[name] => Елена
)
[3] => Array
(
[id] => 43
[name] => Златарица
)
)
将被编码为 JSON,如下所示
[
{
"id": "40",
"name": "Велико Търново"
},
{
"id": "41",
"name": "Горна Оряховица"
},
{
"id": "42",
"name": "Елена"
},
{
"id": "43",
"name": "Златарица"
}
]
最终当按行编码时
echo Json::encode(['output'=>$out, 'selected'=>'']);
会return
{
"output": [
{
"id": "40",
"name": "Велико Търново"
},
{
"id": "41",
"name": "Горна Оряховица"
},
{
"id": "42",
"name": "Елена"
},
{
"id": "43",
"name": "Златарица"
}
],
"selected": ""
}
希望这对您有所帮助。