【问题标题】:Symfony 2.8 - forms fields depending on user statusSymfony 2.8 - 根据用户状态形成字段
【发布时间】:2017-10-21 23:12:25
【问题描述】:

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

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

【问题讨论】:

  • 不清楚您到底想要什么与众不同?不同的表单类型,例如是否登录而不是使用令牌的隐藏字段以及何时未登录 - 带有所有可用用户名的下拉列表?
  • @V-Light 验证在这两种情况下会有所不同。对于登录用户,没有“用户名”字段 - 只有隐藏字段“用户”。但是对于未记录的字段“用户名”(这是文本字段)是必需的。我不知道如何只使用一个表单生成器来创建这两个表单。

标签: php forms symfony


【解决方案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...')),
            )
        ));
    }
}

【讨论】:

  • 谢谢,这正是我想要的:)
【解决方案2】:

我个人认为更优雅的解决方案是将用户从控制器传递给表单构建器。此处的答案已对此进行了介绍: how to check the user role inside form builder in Symfony2?

【讨论】:

    【解决方案3】:

    您可以通过单个字段创建表单,例如

     {{ form_row(form.username) }}                           
     {{ form_row(form.email) }}                           
     {{ form_row(form.phone) }} 
     {% if(app.user) %}
         //your conditional field
     {% endif%} 
    

    通过这种方式,您必须创建提交按钮以及csrf令牌(如果有)

    我希望这会很有帮助:)

    【讨论】:

    • 我知道创建单个字段。我可以根据用户状态显示字段,但我无法正确验证它们。如果登录用户提交表单,他会看到错误提示“用户名”字段是必需的,因为我只想使用一个 FormBuilder 类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2016-01-30
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多