2012-04-13 33 views
4

我想要显示字段来呈现永远不会被更改或提交的数据。是否有可能在Symfony2中只显示字段类型?

类似于bootstrap's static controls

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

我想到了实现这一目标的几种方法,其中一些是简单的黑客攻击,其他一些似乎更合理,但我不知道是否有更标准的方法来做到这一点。

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

  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> 

最后,没有任何人有一个更好的主意或认为这种做法是完全有缺陷?

回答

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适合我的需要。

相关问题