4

我想要只显示字段来呈现永远不会更改或提交的数据。

类似于bootstrap 的静态控件

我需要在不破坏表单结构或样式的情况下在表单中显示对象数据。我希望这些数据使用与所有其他输入相同的模板,但不将其呈现为动态输入。

我想了几种方法来实现这一点,有些是普通的黑客,有些似乎更合法,但我不知道是否有更标准的方法来做到这一点。

这是我想到的选项列表,没有特别的顺序:

  1. 对字段使用只读属性:感觉不是很好,我不希望用户觉得他们可以更改某些内容,但出于某种原因不允许这样做。

  2. 破解模板以输出除输入元素以外的其他内容:对我来说似乎很讨厌,此外还需要处理服务器端提交时丢失的字段。

  3. 扩展字段类型以创建它们的仅显示版本。我不认为这会是安全的。

  4. 编写自定义 fieldType 来完成这项工作。此选项可以很好地用作其他字段的基本类型。

我认为最好的解决方案是选项 3 或 4。我唯一还没有找到的是如何处理提交时丢失的字段。

我认为拥有这种类型的字段很重要,因为它允许重用表单类型逻辑。否则,我最终会编写如下所示的树枝模板:

<form>

    {# This is the average writtable field #}
    {{ form_row(form.field1) }} 

    {# This is the display-only field, notice I have to replicate
       markup. Even if I wrote a macro, which I did, I would still
       have to replicate markup in the macro.
    #}
    <label>Field 2</label>
    <div>{{ the_object.field2 }}</div>

</form>

最后,有没有人有更好的想法或认为这种方法完全有缺陷?

4

2 回答 2

1

您可以使用以下disabled属性:

{{ form_row(form.field1, {'attr': {'disabled': 'disabled'}}) }} 

另请参阅如何使用表单事件动态生成表单手册条目。

于 2012-04-13T09:06:58.130 回答
1

我最终使用 read_only 属性和自定义模板(选项 1 和 2 的组合)来更改启用 read_only 属性的字段的呈现。

不希望发送带有 readonly 属性的字段(它们使用 disabled 属性呈现,@elnur 指出相同)并且如果在 POST 上存在则被拒绝,所以我所要做的就是更改模板以不同方式呈现。

这是一个示例模板:

{% block field_widget %}
{% spaceless %}
    {% if read_only %}
        <span {{ block('widget_container_attributes') }} >
            {{ value|default('&nbsp')|raw }}
        </span>
    {% else %}
        {% set type = type|default('text') %}
        <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" />
    {% endif %}
{% endspaceless %}
{% endblock field_widget %}

另一种方法是使用表单扩展为所有字段创建一个新属性,但 read_only 属性适合我的需要。

于 2012-05-27T03:05:15.940 回答