Symfony 2.8 - 根据用户状态表单字段

时间:2017-05-22 10:20:29

标签: php forms symfony

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

我不知道应该使用哪个选项。 Inherit_data,两种表单类型(两个重复的代码)或基于提交的数据的验证组。有什么想法吗?

3 个答案:

答案 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令牌(如果有

我希望这会非常有用:)