我想知道如何解决这个问题: 我有4个字段的表格。我希望第4个字段依赖于用户状态(已记录或未记录)。对于已登录的用户,我将从会话中获取ID,但未记录的用户应手动提供用户名。
我不知道应该使用哪个选项。 Inherit_data,两种表单类型(两个重复的代码)或基于提交的数据的验证组。有什么想法吗?
答案 0 :(得分:1)
好的,有几种方法可以实现。
看看FormEvents。在您的情况下,它将是FormEvents::PRE_SET_DATA
,然后阅读dynamic forms
我个人更喜欢做以下
public function buildForm(FormBuilderInterface $builder, array $options)
{
//$builder->add( ... )
//$builder->add( ... )
//$builder->add( ... )
//each-event with own method, but of cource it can be a callback like in a tutorial above
$builder->addEventListener(FormEvents::PRE_SET_DATA, array(this, 'onPreSetData');
}
并且在同一个类中有一个方法onPreSetData
public function onPreSetData ( FormEvent $formEvent )
{
$form = $formEvent->getForm();
$user = $formEvent->getData();
//pseudo-code
if( $user->isLoggedIn() )
{
$form->add('user', HiddenType::class, array(
));
}
else
{
$form->add('user', TextType::class, array(
'label' => 'Username',
'required' => true,
'constraints' => array(
new NotBlank(array('message' => 'please enter username...')),
// new YourCustomValidator(array('message' => 'not enough minerals...')),
)
));
}
}
答案 1 :(得分:1)
我个人认为更优雅的解决方案是将用户从控制器传递给表单构建器。这里的答案涵盖了这个问题: how to check the user role inside form builder in Symfony2?
答案 2 :(得分:0)
您可以通过
等各个字段创建表单 {{ form_row(form.username) }}
{{ form_row(form.email) }}
{{ form_row(form.phone) }}
{% if(app.user) %}
//your conditional field
{% endif%}
通过这种方式,您必须创建提交按钮以及csrf令牌(如果有
)我希望这会非常有用:)