18

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

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

Symfony 2

$builder
    ->add('descripcion', 'text', array(
        'read_only' =>'true'
    ));
}

Symfony 3

$builder
    ->add('descripcion', TextType::class, array(
        'read_only' => 'true'
    ));
}
4

13 回答 13

35

提供的答案都以Symfony 3上的这个异常结束:

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

正确的做法是利用attr场地上的财产:

->add('descripcion', TextareaType::class, array(
    'attr' => array(
        'readonly' => true,
    ),
));

如果您希望在表单提交期间有一个数据未发布到服务器的字段,您应该使用disabled如下:

->add('field', TextareaType::class, array(
    'disabled' => true,
));

在您的表单构建器对象上。

于 2017-06-15T14:48:19.473 回答
16

我相信将表单字段呈现为只读并防止表单接受请求中的新值的唯一安全方法如下。

$builder->add(
    'description',
    TextType::class,
    ['disabled' => true]
);

另一个使用['attr' => ['readonly' => true]]or的建议['attr' => ['disabled' => true]]会让你容易受到伪造请求的攻击。

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

只有上面的第一个选项既会禁用表单字段,也会阻止您的表单接受请求中字段的新值。

我已经用 Symfony Form 3.4 对此进行了测试。我不知道 4 的行为是否相同。

于 2018-04-18T12:35:42.123 回答
9

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

去掉周围的引号true

像这样:

->add('descripcion','text',array('read_only' => true))

真的,没有引号。

于 2013-05-20T08:26:43.043 回答
8

Symfony 4 只允许在表单域中使用“禁用”选项。但它与“只读”不同。

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

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

->add('fieldname', TextType::class, [
            'label' => false,
            'attr'=> [ 'readonly' => true ]
        ])
于 2018-09-19T08:03:14.263 回答
6

自 Symfony 2.8 起,read_only已被弃用。所以请改用只读。并为此属性提供布尔值

->add('','text',array('readonly' => true))
于 2016-06-27T18:34:00.033 回答
3

更新:从 Symfony 3.0 开始,只读值应该在attr选项中设置。 http://symfony.com/doc/2.8/reference/forms/types/form.html#read-only

也可以使用disabled选项。

于 2017-03-08T14:11:26.220 回答
0

建议使用 disabled 选项,因为根据文档,任何提交的值都将被忽略:https ://symfony.com/doc/current/reference/forms/types/text.html#disabled

$builder->add('descripcion', TextType::class, [
    'disabled' => 'true',
]);
于 2019-04-01T10:35:54.593 回答
0

readonly而不是read_only。你应该attr像这样做这个选项:

->add('', TextType::class, array('attr'=> array('readonly' => true)))
于 2018-07-17T08:56:01.670 回答
-1

对于实体类型字段禁用工作正常

->add('organizacion', EntityType::class, array(
    'class' => 'AppBundle:Organizacion',
    'label' => 'Institución/Organización',
    'choice_label' => 'nombre',
    'disabled' => true
))
于 2018-12-12T23:46:12.693 回答
-1

让我添加一些其他答案无助于管理的内容。在许多情况下,作为字段处理但“调整”以禁用版本可能会起作用。但是,至少很难以某些完全防止编辑的格式呈现(即呈现为标签)。

如何解决这个问题?我所做的是将字段定义为 HiddenType,并在模板中使用{{ form.vars.value.myfield }}{{ item.myfield }}将“item”作为实体对象进行渲染,包含在您能想到的任何内容中,就像任何其他 HTML 元素一样。

于 2017-09-04T12:01:15.503 回答
-1

只有“禁用”选项不会导致错误

$builder
    ->add('descripcion', TextType::class, array(
        'disabled' => 'true'
    ));
}
于 2018-08-29T12:52:17.287 回答
-1

其他解决方案可能是:

->add('value', TextType::class, ['disabled' => true]):

取自:http ://symfony.com/doc/current/reference/forms/types/text.html#disabled

于 2018-08-09T20:06:22.377 回答
-2

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

于 2012-10-31T13:22:18.527 回答