我创建了一个表单,它的下拉列表依赖于另一个表单(没有扩展),它运行得很快。
但是,当您尝试更改相同的表单时,第二个下拉列表的值将丢失(type_id
)。基本上,类型字段取决于所选的区域。请看我的代码:
_form.php
<?= $form->field($model, 'area_id')->dropDownList(ArrayHelper::map(Department::find()->where(['helpdesk' => 1])->all(),'id','name'),['prompt'=>'Selecione a Área',
'onchange' => '
$.post("index.php?r=helpdesk/solicitation/lists&id=' . '"+$(this).val(),function(data){
$("select#solicitation-type_id").html(data);
});']) ?>
<?php
echo $form->field($model, 'type_id')->dropDownList(['prompt'=>'Selecione a Área']);
?>
控制器
public function actionLists($id)
{
$countType = Type::find()
->where(['area_id' => $id])
->count();
$types = Type::find()
->where(['area_id' => $id])
->orderBy(['name' => SORT_ASC])
->all();
if($countType > 0 )
{
foreach($types as $type ){
echo "<option value='".$type->id."'>".$type->name."</option>";
}
}
else{
echo "<option> - </option>";
}
}
我认为这个topic也有同样的问题,但我不明白它是如何工作的。
发布于 2018-06-01 06:12:22
您需要提供默认选项集,当您未提供任何数据时,应从中选择保存的选项
<?php
$types = Type::find()
->where(['area_id' => $model->area_id])
->orderBy(['name' => SORT_ASC])
->all();
echo $form->field($model, 'type_id')->dropDownList(ArrayHelper::map($types,'id','name'),['prompt'=>'Selecione a Área']);
?>
现在,当您使用findOne()
并选择模型时,将自动选择为type_id
保存的值。
您可以在controller/action
中移动上面的查询,并将$types
传递给视图。
您还可以通过使用count($types)
来创建actionLists
D.R.Y方法,并删除第一个查询
public function actionLists($id)
{
$types = Type::find()
->where(['area_id' => $id])
->orderBy(['name' => SORT_ASC])
->all();
if(count($types) > 0 )
{
foreach($types as $type ){
echo "<option value='".$type->id."'>".$type->name."</option>";
}
}
else{
echo "<option> - </option>";
}
}
https://stackoverflow.com/questions/50632059
复制相似问题