Zend framework 表单集合中的不同值\u选项

Zend framework 表单集合中的不同值\u选项,zend-framework,zend-form,zend-framework3,Zend Framework,Zend Form,Zend Framework3,我有一个集合,其中一个字段用户(多选)依赖于以前的选择,即部门。因此,每个用户选择包含不同的“值\选项” 在为集合的每一行检索表单时,如何设置不同的“值选项”?您有不同的选项: 创建API端点以检索表单选项 您将其分成两个不同的页面,第一个页面选择部门,第二个页面选择用户(ew) 您在服务器端填充表单,并在客户端过滤所选内容 我个人不赞成第二种选择。只是说这是一个可能的解决方案,但是否 第一个选项API很有趣,但实际上需要更多的工作,特别是如果它是应用程序中唯一的端点的话 第三个选项是我经常

我有一个集合,其中一个字段用户(多选)依赖于以前的选择,即部门。因此,每个用户选择包含不同的“值\选项”


在为集合的每一行检索表单时,如何设置不同的“值选项”?

您有不同的选项:

  • 创建API端点以检索表单选项
  • 您将其分成两个不同的页面,第一个页面选择部门,第二个页面选择用户(ew)
  • 您在服务器端填充表单,并在客户端过滤所选内容
我个人不赞成第二种选择。只是说这是一个可能的解决方案,但是

第一个选项API很有趣,但实际上需要更多的工作,特别是如果它是应用程序中唯一的端点的话

第三个选项是我经常使用的,因为它需要更少的代码,而且实现起来非常简单

在表单中,有两个元素:

$this->添加([
“名称”=>“部门id”,
'类型'=>'选择',
“属性”=>[
“id”=>“部门id”
],
“选项”=>[
“值_选项”=>[
1=>“市场营销”,
2=>“它”,
3=>“物流”
]
]
]);
$this->add([
'name'=>'user_id',
'类型'=>'选择',
“属性”=>[
'id'=>'user_id',
“多个”=>true
],
“选项”=>[
“值_选项”=>[
[
“值”=>1,
“标签”=>“John Doe-营销”,
“属性”=>1]
],
[
“值”=>2,
“标签”=>“Jane Doe-营销”,
“属性”=>1]
],
[
“值”=>3,
'label'=>'Jack Doe-IT',
'属性'=>['data-department-id'=>2]
],
[
“值”=>4,
'label'=>'Dana Doe-IT',
'属性'=>['data-department-id'=>2]
],
[
“值”=>5,
“标签”=>“Frank Doe-物流”,
'属性'=>
],
[
“值”=>6,
“标签”=>“Lara Doe-物流”,
'属性'=>
]
]
]
]);
如您所见,所有用户都被放入
value\u选项中
。请记住,这只是一个示例,您应该使用自定义元素来填充这种选择;)

然后,在视图中渲染元素:


最后添加JS代码来处理过滤器。这里我使用了
jQuery
,但没有必要使用它:

$(函数(){
//加载页面时筛选用户
过滤器(假);
//更改multiselect上的值时筛选用户
$('department_id')。在('change',function(){
过滤器(正确);
});
});
函数过滤器(重置值){
var departmentId=$('#department_id').val();
//仅在更改过滤器时删除以前的值
如果(重置值){
$('#user_id').val(null);
}
//禁用所有选项
$('user_id option').attr('disabled','disabled').attr('hidden',true);
//仅启用那些符合条件的
$(“#用户id选项[数据部门id=”+部门id+”).attr('disabled',false.).attr('hidden',false);
}

最后提示:不要忘记创建并添加一个
验证器
,以检查夫妇
部门id-用户id
是否正确,只是为了避免(在我的示例中)接受IT部门的Lara Doe(物流);)

答案是你不能<代码>值_选项在服务器端设置,而您要做的是在客户端完成。您必须创建包含所有元素的multiselect,并根据前面的select禁用它们。因此,您必须编写一个处理Ajax请求的控制器。您不能只在前端进行更改,因为您将遇到草堆验证问题。