2016-04-18 23 views
2

Ich möchte eine neue Zweigfunktion "form_field" definieren, die form_label, form_widget und form_errors rendert. Ich möchte form_row nicht überschreiben, weil ich das bereits für einen anderen Zweck getan habe: form_row Wraps <div/> Container für mein Layout erforderlich. Insbesondere füge ich Bootstrap-Klassen hinzu.Symfony2 benutzerdefinierte Formular-Renderer-Hilfsfunktion

Warum brauche ich das? Normalerweise verwende ich form_row, aber ich habe viele Formularzeilen, für die ich zwei oder mehr Felder in derselben Zeile platzieren möchte (z. B. "Vorname" und "Nachname"). In diesen Fällen definiere ich mein Wrapping <div/> manuell, aber ich möchte nicht die drei Funktionsaufrufe (form_label, form_widget und form_errors) jedes Mal schreiben.

Ich habe versucht, eine benutzerdefinierte Funktion anzugeben, aber ich bekomme eine Ausnahme beim Aufruf der Zweigfunktionen dort. Für diese Lösung muss ich wissen, wie Twig-Funktionen von einer benutzerdefinierten Funktion aufgerufen werden.

Mein zweiter Versuch war, Symfonys Lösung für seine eigenen Formhelfer anzupassen. Ich fand diese Linie in Verkäufer/Symfony/Symfony/src/Symfony/Bridge/Zweig/Erweiterung/FormExtension.php:

new \Twig_SimpleFunction('form_widget', null, array('node_class' => 'Symfony\Bridge\Twig\Node\SearchAndRenderBlockNode', 'is_safe' => array('html'))), 

wie eine Funktion Sieht aus, die eigentlich nur einen Block macht. Als ich diese Zeile in meinem AppBundle anpasste, wurde eine Ausnahme ausgelöst, in der Symfony behauptete, dass ein Block namens "form_field" nicht definiert ist. Allerdings definiert ich diesen Block in meiner benutzerdefinierten Formularvorlage:

{% use 'bootstrap_3_horizontal_layout.html.twig' %} 

{%- block form_field -%} 
    {{- form_label(form) -}} 
    {{- form_widget(form) -}} 
    {{- form_errors(form) -}} 
{%- endblock form_field -%} 
+0

Da in Symfony der Form Thematisierung gibt es einige magische hapening, die Lösung kann davon abhängen, wie deine Form aufgebaut ist. Werden Felder für den Vornamen und den Nachnamen dem Formular-Generator als einzelnes, aber zusammengehöriges Feld hinzugefügt? –

+0

Das sind zwei einzelne Felder. Ich würde sie auf diese Weise hinzufügen: '

form_field(form.firstName)
form_field(form.lastName)
' – fishbone

Antwort

1

Deklarieren ein Zweig Vorlage Form/form_field.html.twig:

{%- block form_field -%} 
    {{- form_label(form, label) -}} 
    {{- form_widget(form) -}} 
    {{- form_errors(form) -}} 
{%- endblock form_field -%} 

Dann habe ich die renderBlock Methode in meinem Zweig benutzerdefinierte Funktion. Das ist mein Zweig Erweiterungsdatei, wie here:

namespace AppBundle\Twig; 

class AppExtension extends \Twig_Extension 
{ 
    protected $environment; 
    private $template; 

    public function __construct(\Twig_Environment $env) 
    { 
     $this->environment = $env; 
    } 


    public function getFunctions() 
    { 
     return array(
      'form_field' => new \Twig_SimpleFunction('form_field', array($this, 'formField'), array(
       'is_safe' => array('html') 
      )) 
     ); 
    } 

    public function formField($form, $label = null) 
    { 
     $this->template = $this->environment->loadTemplate('::Form/form_field.html.twig'); 

     return $this->template->renderBlock('form_field', array(
      'form' => $form, 
      'label' => $label 
     )); 
    } 

    /** 
    * Returns the name of the extension. 
    * 
    * @return string The extension name 
    */ 
    public function getName() 
    { 
     return 'app_extension'; 
    } 
} 

ich den DI-Container konfiguriert ist, die Twig_Environment für den AppExtension Dienst weitergeben müssen:

services: 
    app.twig_extension: 
     class: AppBundle\Twig\AppExtension 
     arguments: 
      - '@twig' 
     tags: 
      - { name: twig.extension } 
+0

Danke für die Bereitstellung Ihrer Antwort, es hat mir geholfen, das offizielle Dokument ist ziemlich leicht zu diesem Thema. – nyluje

Verwandte Themen