Symfony表单只读字段

Bic*_*icu 12 symfony-forms symfony symfony-2.1

我应该如何read-only使用Symfony表单组件渲染字段?

这就是我试图这样做无济于事的方式:

Symfony 2

$builder
    ->add('descripcion', 'text', array(
        'read_only' =>'true'
    ));
}
Run Code Online (Sandbox Code Playgroud)

Symfony 3

$builder
    ->add('descripcion', TextType::class, array(
        'read_only' => 'true'
    ));
}
Run Code Online (Sandbox Code Playgroud)

Pmp*_*mpr 22

提供的答案都会在Symfony 3上以此异常结束:

未捕获的PHP异常Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException:"选项"read_only"不存在.

正确的方法是利用attr该领域的财产:

->add('descripcion', TextareaType::class, array(
    'attr' => array(
        'readonly' => true,
    ),
));
Run Code Online (Sandbox Code Playgroud)

  • 这种HTML表单行为是设计使然.用户应该能够改变任何东西,客户端.您可以在服务器端审核和控制所有内容.这叫做网络. (4认同)
  • 否决,因为此方法将设置 HTML 属性,但如果请求包含“descripcion”,表单仍会接受新值。因此它给作者一种错误的安全感。 (3认同)
  • 感谢您的downvote,但是**ReadOnly**,用于注释html表单字段的客户端功能不是"安全"的事情.你必须在服务器端处理你的`security`.如果你有Symfony的问题,你可以去他们的Github帐户并在那里提交一个问题. (3认同)
  • @Pmpr Symfony 通过设计提供了一种通过在客户端禁用字段编辑并在服务器端添加安全防护来使字段只读的方法。检查[禁用选项](https://symfony.com/doc/current/reference/forms/types/form.html#disabled)。虽然OP只问如何_渲染_只读字段,但他/她很可能是指如何处理两侧的只读字段。这就是为什么我同意 Courtney Miles 反对仅使用只读 HTML 属性的建议。 (3认同)

Cou*_*les 11

我相信唯一安全的方法是将表单字段显示为只读,并且还阻止表单接受请求中的新值,如下所示.

$builder->add(
    'description',
    TextType::class,
    ['disabled' => true]
);
Run Code Online (Sandbox Code Playgroud)

使用其中任何一个['attr' => ['readonly' => true]]['attr' => ['disabled' => true]]将使您容易受到伪造请求的其他建议.

后两个选项都将在字段上设置readonly或者disabled属性,但如果包含在请求中,您的表单仍将接受此字段的新值.

只有上面的第一个选项都会禁用表单字段,并且还会阻止表单接受请求中字段的新值.

我用Symfony Form 3.4进行了测试.我不知道4的行为是否相同.


And*_*son 9

您已将只读属性声明为字符串,它必须是布尔值.

删除周围的引号 true

像这样:

->add('descripcion','text',array('read_only' => true))
Run Code Online (Sandbox Code Playgroud)

是的,没有引号.


小智 6

Symfony 4 只允许在表单域中使用“禁用”选项。但“只读”是不同的东西。

  • 已禁用 - 用户无法编辑字段,并且在表单提交期间不传递其值。
  • 只读 - 用户无法编辑字段,但其值在表单提交期间传递。

我为“只读”找到的唯一解决方案是:

->add('fieldname', TextType::class, [
            'label' => false,
            'attr'=> [ 'readonly' => true ]
        ])
Run Code Online (Sandbox Code Playgroud)


小智 5

从Symfony 2.8开始,不推荐使用read_only.所以请改用readonly.并为此属性提供布尔值

->add('','text',array('readonly' => true))
Run Code Online (Sandbox Code Playgroud)


mrM*_*tir -3

如果家族和证明者与其他实体有关系,我认为它们不应该是文本类型。尝试取消它们的类型或更改为实体类型并检查它是否有效。