【问题标题】:Prepopulate form fields预填充表单字段
【发布时间】:2015-08-14 10:15:51
【问题描述】:

我有一个用户创建表单(在 Symfony 表单组件之上),它用于一些不同的页面并通过 AJAX 加载。

初始请求包含我们已经知道的有关未来用户的信息,例如如果表单是从“X”公司的经理创建页面加载的,我们已经知道用户的角色 =“经理”和公司 =“X”。并且必须从表单中删除/隐藏相应的表单字段,并且必须为底层用户对象提供这些参数(角色字段必须设置为“经理”,公司字段必须设置为“X”)。

如何实现?

【问题讨论】:

    标签: symfony symfony2-forms


    【解决方案1】:

    据我了解,您可以使用此问题的答案: https://stackoverflow.com/a/18792299/4098335

    基本上,在调用 createForm() 之后,您必须为所需的字段调用 setData()。

    如果这不起作用,也许尝试覆盖 AbstractType 类的构造函数。但这有点“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 时传递“经理”实体:

        $form = $this->createForm(new YourUserType($manager), $entity, array(
            'action' => $this->generateUrl('create_url'),
            'method' => 'POST',
        ));
    

    注意:在示例中,我将“read_only”选项设置为 true,这样您将“避免”用户选择另一个值。您可以稍后在前端隐藏该字段,但您仍应稍后在处理表单请求时检查该值。

    【讨论】:

    • 谢谢,这些都是非常有用的例子,我最终以大致相同的方式完成了,但使用 $options 而不是在构造函数中传递 $manager。但是现在,如果我们在表单上出现验证错误,我的所有只读内容都会被重置 :) 而且我所有的只读选择都不是只读的——它们看起来像被禁用,但允许更改它们,为什么会这样?
    • 原来 select 没有 readonly 属性,是什么让它没有帮助,因为所有的字段都是在 selects 中呈现的
    • 您可以尝试将“禁用”选项设置为 true,而不是“只读”吗?
    • 关于您在出现验证错误时未正确设置字段这一事实的其他评论,请确保像创建“原始”表单时一样实例化您的 Type 类。您必须在处理表单请求的控制器操作中获取管理器实体,并以相同的方式将其传递给 YourUserType 构造函数。
    • 我已经尝试过了,但是这些字段的值不会发送到服务器。在这种情况下,我应该将它们保存在服务器上,当然不是那么糟糕,但它的逻辑有点复杂,但我认为我最终会得到这个变体 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2021-08-05
    • 2015-05-03
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多