4

変更も送信もされないデータをレンダリングするための表示専用フィールドが必要です。

ブートストラップの静的コントロールに似ています。

フォームの構造やスタイルを壊さずに、フォーム内にオブジェクトデータを表示する必要があります。このデータで他のすべての入力と同じテンプレートを使用したいのですが、動的入力としてレンダリングする必要はありません。

私はこれを達成するためのいくつかの方法を考えました。いくつかは単純なハックであり、他はより正当に見えるものもありますが、これを行うためのより標準的な方法があるかどうかはわかりません。

これが私が考えたオプションのリストです。順不同です。

  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

最後に、read_onlyプロパティとカスタムテンプレート(オプション1と2の組み合わせ)を使用して、read_onlyプロパティがオンになっているフィールドのレンダリングを変更しました。

readonlyプロパティがオンになっているフィールドは送信されることが期待されておらず(無効な属性でレンダリングされ、同じ@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 に答える
1

disabled次の属性を使用できます。

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

フォーム イベントを使用してフォームを動的に生成する方法のクックブック エントリも参照してください。

于 2012-04-13T09:06:58.130 に答える