预填充表单域
Prepopulate form fields
我有一个用户创建表单(在 Symfony 表单组件之上),它用于一些不同的页面并通过 AJAX 加载。
初始请求包含我们已知的关于未来用户的信息,例如如果从 "X" 公司的经理创建页面加载表单,我们已经知道用户的角色 = "manager" 和公司 = "X"。并且相应的表单字段必须是来自表单的 removed/hidden 并且必须为基础用户对象提供这些参数(角色字段必须设置为 "manager",公司字段必须设置为 "X").
如何实现?
据我了解,您可以使用此问题的答案:
基本上,在调用 createForm() 之后,您必须为所需的字段调用 setData()。
如果这不起作用,也许可以尝试覆盖您的 AbstractType class 的构造函数。但这有点 "hacky" 并且显然不是最简单的方法...此处示例:
class YourUserType extends AbstractType
{
protected $manager;
public function __construct($manager = null)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($this->manager !== null) {
$builder
->add('manager', 'entity', array(
'class' => 'YourBundle:Manager',
'data' => $this->manager,
'read_only' => true,
)
);
}
}
}
然后,在您的控制器中,在实例化 YourUserType 时传递 "manager" 实体:
$form = $this->createForm(new YourUserType($manager), $entity, array(
'action' => $this->generateUrl('create_url'),
'method' => 'POST',
));
注意:在示例中,我将 'read_only' 选项设置为 true,这样您将 'avoid' 用户设置为 select 另一个值。您可以稍后在前端隐藏该字段,但您仍然应该稍后在处理表单请求时检查该值。
我有一个用户创建表单(在 Symfony 表单组件之上),它用于一些不同的页面并通过 AJAX 加载。
初始请求包含我们已知的关于未来用户的信息,例如如果从 "X" 公司的经理创建页面加载表单,我们已经知道用户的角色 = "manager" 和公司 = "X"。并且相应的表单字段必须是来自表单的 removed/hidden 并且必须为基础用户对象提供这些参数(角色字段必须设置为 "manager",公司字段必须设置为 "X").
如何实现?
据我了解,您可以使用此问题的答案:
基本上,在调用 createForm() 之后,您必须为所需的字段调用 setData()。
如果这不起作用,也许可以尝试覆盖您的 AbstractType class 的构造函数。但这有点 "hacky" 并且显然不是最简单的方法...此处示例:
class YourUserType extends AbstractType
{
protected $manager;
public function __construct($manager = null)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($this->manager !== null) {
$builder
->add('manager', 'entity', array(
'class' => 'YourBundle:Manager',
'data' => $this->manager,
'read_only' => true,
)
);
}
}
}
然后,在您的控制器中,在实例化 YourUserType 时传递 "manager" 实体:
$form = $this->createForm(new YourUserType($manager), $entity, array(
'action' => $this->generateUrl('create_url'),
'method' => 'POST',
));
注意:在示例中,我将 'read_only' 选项设置为 true,这样您将 'avoid' 用户设置为 select 另一个值。您可以稍后在前端隐藏该字段,但您仍然应该稍后在处理表单请求时检查该值。