我应该如何使用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 3上以此异常结束:
未捕获的PHP异常Symfony \ Component \ OptionsResolver \ Exception \ UndefinedOptionsException:“选项”read_only“不存在。
正确的方法是利用场上的attr
属性:
->add('descripcion', TextareaType::class, array(
'attr' => array(
'readonly' => true,
),
));
其他解决方案可能是:
->add('value', TextType::class, ['disabled' => true]):
取自:http://symfony.com/doc/current/reference/forms/types/text.html#disabled
只有“禁用”选项不会导致错误
$builder
->add('descripcion', TextType::class, array(
'disabled' => 'true'
));
}
对于entitytype字段,禁用工作正常
->add('organizacion', EntityType::class, array(
'class' => 'AppBundle:Organizacion',
'label' => 'Institución/Organización',
'choice_label' => 'nombre',
'disabled' => true
))
qazxsw poi而不是qazxsw poi。您应该在readonly
中创建此选项,如下所示:
read_only
您已将只读属性声明为字符串,它必须是布尔值。
删除true
周围的引号
像这样:
->add('descripcion','text',array('read_only' => true))
是的,没有引号。
我相信唯一安全的方法是将表单字段显示为只读,并且还阻止表单接受请求中的新值,如下所示。
$builder->add(
'description',
TextType::class,
['disabled' => true]
);
使用['attr' => ['readonly' => true]]
或['attr' => ['disabled' => true]]
的另一个建议将使您容易受到伪造请求的攻击。
后两个选项都将在字段上设置readonly
或disabled
属性,但如果包含在请求中,您的表单仍将接受此字段的新值。
只有上面的第一个选项都会禁用表单字段,并且还会阻止表单接受请求中字段的新值。
我用Symfony Form 3.4进行了测试。我不知道4的行为是否相同。
从Symfony 2.8开始,不推荐使用read_only。所以请改用readonly。并为此属性提供布尔值
->add('','text',array('readonly' => true))
更新:自Symfony 3.0以来,应在attr选项中设置readonly值。 http://symfony.com/doc/2.8/reference/forms/types/form.html#read-only
也可以使用禁用选项。
Symfony 4允许在表单字段中仅使用“禁用”选项。但它是“只读”的不同之处。
我发现“readonly”的唯一解决方案是:
->add('fieldname', TextType::class, [
'label' => false,
'attr'=> [ 'readonly' => true ]
])
建议使用禁用选项,因为根据文档:https://symfony.com/doc/current/reference/forms/types/text.html#disabled将忽略任何提交的值
$builder->add('descripcion', TextType::class, [
'disabled' => 'true',
]);
如果familia和proveedor是与其他实体的关系,我认为它们不应该是文本类型。尝试使其类型无效或更改为实体类型并检查它是否有效。
让我添加其他答案没有帮助管理的东西。作为字段的处理,但禁用版本的“调整”可能在许多情况下有效。但是,以某种完全阻止编辑的格式(即渲染为标签)至少难以渲染。
怎么解决这个?我所做的是将字段定义为HiddenType,并在模板中使用{{ form.vars.value.myfield }}
或{{ item.myfield }}
渲染,将“item”作为实体对象,包含在您能想到的任何内容中,与任何其他HTML元素一样。