Php Symfony 2.8-表单字段取决于用户状态

Php Symfony 2.8-表单字段取决于用户状态,php,forms,symfony,Php,Forms,Symfony,我想知道如何解决这个问题: 我有4个字段的表单。我希望第四个字段取决于用户状态(已登录或未登录)。对于登录用户,我将从会话中获取ID,但未登录用户应手动提供用户名 我不知道我应该用哪一个选项。基于提交的数据继承_数据、两种表单类型(两个重复性很高的代码)或验证组。有什么想法吗?您可以通过以下单个字段创建表单 {{ form_row(form.username) }} {{ form_row(form.email) }}

我想知道如何解决这个问题: 我有4个字段的表单。我希望第四个字段取决于用户状态(已登录或未登录)。对于登录用户,我将从会话中获取ID,但未登录用户应手动提供用户名


我不知道我应该用哪一个选项。基于提交的数据继承_数据、两种表单类型(两个重复性很高的代码)或验证组。有什么想法吗?

您可以通过以下单个字段创建表单

 {{ form_row(form.username) }}                           
 {{ form_row(form.email) }}                           
 {{ form_row(form.phone) }} 
 {% if(app.user) %}
     //your conditional field
 {% endif%} 
通过这种方式,您必须创建submit按钮以及csrf令牌(如果有)


我希望这会很有帮助:)

好的,有几种方法可以做到这一点

看一看。在您的情况下,它将是
FormEvents::PRE_SET_DATA
,然后阅读

我只喜欢做以下事情

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...')),
            )
        ));
    }
}

我个人认为更优雅的解决方案是将用户从控制器传递给表单生成器。这里的答案已经涵盖了这一点:

现在还不清楚你到底想要什么不同?不同的表单类型,如“登录时”和“隐藏字段时”以及“未登录时”-下拉列表和所有可用用户名?@V-Light验证在这两种情况下是不同的。对于登录用户,没有“用户名”字段-只有隐藏字段“用户”。但对于未标记的字段,“用户名”(即文本字段)是必需的。我不知道如何只用一个表单生成器创建这两个表单。我知道如何创建单个字段。我可以根据用户状态显示字段,但无法正确验证它们。如果登录用户将提交表单,他将看到错误,该错误表示“用户名”字段是必需的,因为我只想使用一个FormBuilder类谢谢,这正是我要找的:)