2012-04-13 32 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適合我的需要。

相關問題