2014-01-29 10 views
5

Ich habe eine Ansicht, in der ich versuche, das Formulardesign für ein einzelnes Feld unter http://symfony.com/doc/current/cookbook/form/form_customization.html#how-to-customize-an-individual-field zu überschreiben.Zweig form_theme _self Anpassen des individuellen Felds

Die Ansicht sieht etwa so aus:

{% form_theme form _self %} 

{% block _my_form_foo_widget %} 
    <div class="input-append"> 
     {{ block('number_widget') }} 
     <span class="add-on">%</span> 
    </div> 
{% endblock %} 

<form> 
    {{ form_row(form.foo) }} 
    {{ form_row(form.bar) }} 
</form> 

Alles für die foo und bar Reihen wie erwartet aussieht, aber der _my_form_foo_widget Block selbst auch in der Ausgabe enthalten ist, das heißt:

<div class="input-append"> 
    <span class="add-on">%</span> 
</div> 

<form> 
    <div> 
     <label for="my_form_foo">Bar</label> 
     <div class="input-append"> 
      <input type="text" id="my_form_foo" name="my_form[foo]"> 
      <span class="add-on">%</span> 
     </div> 
    </div> 
    <div> 
     <label for="my_form_bar">Foo</label> 
     <input type="text" id="my_form_bar" name="my_form[bar]"> 
    </div> 
</form> 

Ich kann nicht für das Leben von mir herausfinden, was ich falsch mache. Als Workaround habe ich den Block einfach in HTML-Kommentare eingepackt.

Ich bin auf Symfony 2.4.1 und Zweig 1.15.0.

+0

haben Sie Ihren Cache klar? Vielleicht ist es ein Zweigparsingfehler, der mit dem '%' Zeichen zusammenhängt. Haben Sie versucht, das '%' in '' in ein anderes Zeichen (d. Wenn das funktioniert, können Sie versuchen, '' '' '' 'durch' {{'%'}} 'zu ersetzen. Weiterhin könntest du versuchen, den übergeordneten Block in eine andere Vorlage zu verschieben (zB 'form_theme.html.twig') und' '% form_theme form '' form_theme.html.twig '%}' – nifr

+0

@nifr verwenden Cache leeren und '' % zu etwas anderem macht keinen Unterschied. – enoshixi

+0

Sie haben meinen Vorschlag mit dem externen form_theme nicht versucht :) Sie erweitern keine andere Vorlage - deshalb wird der Block direkt gerendert. – nifr

Antwort

8

Sie haben das erwartete Verhalten von twig.

Ein neu definierter Block wird direkt in der aktuellen Vorlage gerendert, wenn Sie nicht erweitern eine andere Vorlage sind.


Beispiel:

template_A.html.twig:

  • einen Körper (= Code außerhalb der Blöcke) => Blöcke direkt gerenderte

<html> 
<body> 
{% block content -%} 
Foo 
{%- endblock -%} 

Bar 

{%- block more_content -%} 
Foo 
{%- endblock %} 
</body> 
</html> 

=> Ausgaben: FooBarFoo (alle Blöcke, die in der Vorlage + Körper wird gerendert)


Beispiel:

template_B.html.twig:

  • erstreckt Vorlage keinen Körper haben darf
  • nur render Blöcke, die in template_A.html.twig
vorhanden sind
{% extends 'templateA.html.twig' %} 

{% block content -%} 
Bar 
{%- endblock %} 

{% block not_in_template_a %} 
Some String 
{% endblock %} 

=> Ausgänge: BarBarFoo (aber nicht nicht Some String machen, weil der Block not_in_template_a in der Originalvorlage nicht anwesend war)

+2

Danke. Ich habe am Ende eine Vorlage mit einem einzelnen, leeren Block erstellt und davon geerbt. Ich würde argumentieren, dass Symfony-Beispiel in ihrer Dokumentation zu diesem ist irreführend (oder einfach nur falsch). – enoshixi

+0

Ja, ich denke, es sollte besser dokumentiert werden: https://github.com/symfony/symfony-docs/issues/5475 – MacDada

Verwandte Themen