Forms 是否可以在Symfony2中使用仅显示字段类型?

Forms 是否可以在Symfony2中使用仅显示字段类型?,forms,symfony,Forms,Symfony,我希望只显示字段,以呈现永远不会更改或提交的数据 类似于 我需要在不破坏表单结构或样式的情况下显示表单中的对象数据。我希望此数据使用与所有其他输入相同的模板,但不将其呈现为动态输入 我想到了几种方法来实现这一点,有些是普通的黑客,有些似乎更合法,但我不知道是否有更标准的方法来实现这一点 以下是我没有按特定顺序想到的选项列表: 对字段使用只读属性:这感觉不太好,我不想让用户感觉他们可以更改某些内容,但出于某些原因,不允许这样做 黑客的模板输出的东西以外的输入元素:似乎非常讨厌我,此外,这将是必要的

我希望只显示字段,以呈现永远不会更改或提交的数据

类似于

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

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

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

  • 对字段使用只读属性:这感觉不太好,我不想让用户感觉他们可以更改某些内容,但出于某些原因,不允许这样做

  • 黑客的模板输出的东西以外的输入元素:似乎非常讨厌我,此外,这将是必要的,以处理服务器端的提交上丢失的字段

  • 扩展字段类型以创建其仅显示版本。我认为这不安全

  • 编写自定义字段类型以执行此任务。此选项可以用作其他字段的基类型

  • 我认为最好的解决办法是选择3或4。 我唯一还没有找到的是如何处理submit中缺少的字段

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

    <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>
    
    
    {#这是平均可写字段#}
    {{form_row(form.field1)}
    {#这是仅显示的字段,请注意,我必须复制
    即使我写了一个宏,我还是会
    必须在宏中复制标记。
    #}
    字段2
    {{the_object.field2}}
    

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

    您可以使用
    disabled
    属性:

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

    另请参阅cookbook条目。

    我最后使用只读属性和自定义模板(选项1和2的组合)更改只读属性启用时字段的呈现方式

    启用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 %}
    
    {%block field\u widget%}
    {%spaceless%}
    {%if read_only%}
    {{value | default(' ')| raw}
    {%else%}
    {%set type=type | default('text')%}
    {%endif%}
    {%endspaceless%}
    {%endblock字段\小部件%}
    
    另一种方法是使用表单扩展为所有字段创建新属性,但只读属性适合我的需要