Symfony2中是否可以只显示字段类型?

时间:2012-04-13 05:47:50

标签: forms symfony

我希望只有显示字段来呈现永远不会被更改或提交的数据。

bootstrap's static controls类似。

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

我想到了实现这一目标的几种方法,有些是简单的黑客,有些看起来更合法,但我不知道是否有更标准的方法来做到这一点。

以下是我没有按特定顺序考虑的选项列表:

  1. 对字段使用只读属性:它感觉不太好,我不希望用户觉得他们可以改变某些东西,但是由于某种原因不允许用户。

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

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

  4. 编写自定义fieldType来完成工作。此选项最适合用作其他字段的基本类型。

  5. 我认为最好的解决方案是选项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>
    

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

2 个答案:

答案 0 :(得分:1)

您可以使用disabled属性:

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

另请参阅How to Dynamically Generate Forms Using Form Events食谱条目。

答案 1 :(得分: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属性适合我的需要。