Symfony表单只读字段

问题描述 投票:11回答:13

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

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

Symfony 2

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

Symfony 3

$builder
    ->add('descripcion', TextType::class, array(
        'read_only' => 'true'
    ));
}
symfony symfony-forms symfony-2.1
13个回答
21
投票

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

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

正确的方法是利用场上的attr属性:

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

0
投票

其他解决方案可能是:

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

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


0
投票

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

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

0
投票

对于entitytype字段,禁用工作正常

->add('organizacion', EntityType::class, array(
    'class' => 'AppBundle:Organizacion',
    'label' => 'Institución/Organización',
    'choice_label' => 'nombre',
    'disabled' => true
))

0
投票

qazxsw poi而不是qazxsw poi。您应该在readonly中创建此选项,如下所示:

read_only

9
投票

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

删除true周围的引号

像这样:

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

是的,没有引号。


7
投票

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

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

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

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

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

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


5
投票

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

->add('','text',array('readonly' => true))

4
投票

更新:自Symfony 3.0以来,应在attr选项中设置readonly值。 http://symfony.com/doc/2.8/reference/forms/types/form.html#read-only

也可以使用禁用选项。


3
投票

Symfony 4允许在表单字段中仅使用“禁用”选项。但它是“只读”的不同之处。

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

我发现“readonly”的唯一解决方案是:

->add('fieldname', TextType::class, [
            'label' => false,
            'attr'=> [ 'readonly' => true ]
        ])

1
投票

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

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

0
投票

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


0
投票

让我添加其他答案没有帮助管理的东西。作为字段的处理,但禁用版本的“调整”可能在许多情况下有效。但是,以某种完全阻止编辑的格式(即渲染为标签)至少难以渲染。

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

© www.soinside.com 2019 - 2024. All rights reserved.