web-dev-qa-db-ja.com

twigテンプレートでウィジェットをオーバーライドするときにフォームフィールドの値に直接アクセスする

私がやりたいのは、フォームビューに変数を保存することです。

{% form_theme edit_form _self %}

{% block field_widget %}
{% spaceless %}
{% set type = type|default('text') %}
<input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>

{# MY CODE #}
{% if type == "file" %}
<a class="BOpreview" href="{# NEED TO REPLACE VAR HERE #}">Aperçu</a>
{% endif %}

{# MY ATTEMPT #}
{{ form.title.get('value') }}
{{ form.vars.value.url }}

{% endspaceless %}
{% endblock field_widget %}

私のフォームにはurl、titleなどのプロパティがあり、フィールドウィジェットブロックで使用するためにここにアクセスしようとしています。

私はそれを検索して来ました https://groups.google.com/forum/?fromgroups=#!topic/symfony2/onor9uFte9E 提案:

{{ form.title.get('value') }}
{{ form.vars.value.url }}

私にはうまくいきませんでした。

注:コントローラーの$ form-> createView()でvar_dumpを実行すると、次のようになります。

    object(Symfony\Component\Form\FormView)[331]
    private 'vars' => 
      array (size=15)
        'value' => 
          object(Panasonic\TestEtAvisBundle\Entity\Product)[168]
            protected 'reviewArray' => 
              object(Doctrine\ORM\PersistentCollection)[234]
                ...
            protected 'testArray' => 
              object(Doctrine\ORM\PersistentCollection)[221]
                ...
            protected 'fbshareArray' => 
              object(Doctrine\ORM\PersistentCollection)[317]
                ...
            private 'id' => int 2
            private 'name' => string 'Nom du produit' (length=14)
            private 'title' => string '<span>Titre </span>' (length=19)
            private 'image' => string 'bundles/testetavis/uploads/product/0d9d9550.png' (length=47)
            private 'fbImage' => string 'bundles/testetavis/uploads/product/facebook//product_e928cd96.jpg' (length=65)
            private 'description' => string '<span>Descriptif </span>' (length=24)
            private 'url' => string 'http://www.google.com' (length=21)
            private 'creationDate' => 
              object(DateTime)[210]
                ...
            private 'modificationDate' => 
              object(DateTime)[209]
                ...
            private 'isDeleted' => int 0
        'attr' => 
          array (size=0)
            empty
        'form' => 
          &object(Symfony\Component\Form\FormView)[331]
        'id' => string 'panasonic_testetavisbundle_producttype' (length=38)
        'name' => string 'panasonic_testetavisbundle_producttype' (length=38)
        'full_name' => string 'panasonic_testetavisbundle_producttype' (length=38)

たとえば、そのURLにアクセスしたいのですが、多くのバリエーションがあるとアクセスできないようです。 {{value}}、{{value.url}}の使用を含みますが、varsにもかかわらず、{{full_name}}を実行してpanasonic_testetavisbundle_producttypeを取得できます。

何か案は?

Edit2:本当の問題を見つけました...

Edit3:この質問が非常に人気があることを見て、同じ状況で誰かを助ける場合に私がしようとしたことを明確にすることにしました。私の研究で述べたように、Besnikがサポートしていることは確かに正しいので、質問が尋ねるものに厳密に依存している場合。今私がしたいことは、すべての入力タイプのファイルに対して、フォームをレンダリングするために使用されるオブジェクトからURLを取得し、入力タイプファイルの横に取得したURLを使用してプレビューリンクを追加することです。私のコードでこの「{{form.vars.value.url}}」のような入力タイプ「ファイル」のフォーム変数を取得しようとすると、正しく思い出せばトークンを受け取るため、これは機能しませんオブジェクト内に保存されたURLの代わりに。

48
Rishi

Form.vars.valueを介してフォームの現在のデータにアクセスできます。

{{ form.vars.value.title }}

Symfony2 Formsのドキュメントを参照してください: http://symfony.com/doc/current/book/forms.html#rendering-a-form-in-a-template

dump関数を使用して変数をダンプします。

{{ dump(form.vars.value) }}

サブフォームを使用している場合、または特定のフィールドの値を取得する場合:

{{ form.FIELD.vars.VALUE }}
110
Besnik

form.parent.varsを使用して、ウィジェットブロックから親parentの値にアクセスできます。

4
Jevgenij Evll

たとえば、primerNombreというタイプのテキストフィールドの値をレンダリングする必要があります。

{{ form.vars.value.primerNombre }}

いずれかの子の名前をレンダリングしたい場合は、必要になります

{% for hijo in form.hijos %}
    <td><div align="left">{{ form_widget(hijo.vars.value.primerNombre) }}</div></td>
{% endfor %}

幸運を!

2
Rodolfo Velasco

編集2:

最後に、{{value}}の現在の行の値を実際に取得していました。

{% block field_widget %}
{% spaceless %}
{% set type = type|default('text') %}
<input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ **value** }}" {% endif %}/>

{# MY CODE #}
{% if type == "file" %}
<a class="BOpreview" href="{{ value }}">Aperçu</a>
{% endif %}

{% endspaceless %}
{% endblock field_widget %}

しかし、私の場合は、入力タイプファイルを使用しているため、値ではなくトークンを取得します。これはSymfony2のセキュリティ対策によるものです。

0
Rishi

Symfony> 3では、次を使用できます。

form.vars.value.Entity.someValue
0
Frager.