2016-05-09 4 views
-2

Ich habe zwei Bundles, die ich selbst erstellt habe: eine, um Admin-Abschnitte zu generieren (AdminBundle), und eine weitere, um Rechnungen zu erstellen (BillingBundle). BillingBundle hat grundsätzlich 2 Einheiten: Client und Bill (1: m).Symfony and Twig: Bedingungen in Vorlagen

Wenn ich beide Pakete installieren die neuen bearbeiten/Formulare und Listen für Client und Bill an der Admin zu erzeugen, schließe ich einen Teil an config.yml wie folgt aus:

my_admin_bundle: 
    entities: 
     project: #whatever entity. Project at AppBundle for example 
      new: true 
      list: true 
     client: 
      new: true 
      list: true 
     bill: 
      new: true 
      list: true 

Auf der anderen Seite, auf AdminBundle I haben Sie eine Vorlage namens form.html.twig, die das Formular rendert, um neue Elemente zu erstellen. Im Grunde ist es wie folgt aus:

{{ form(form) }} 

Der Zweifel: Da die Form neu erstellen Bills brauchen eine .js Datei (accounting.js), , wie es um nur für neue Bill Form, jedoch nicht für neue Client oder Project Formen ?

Wie Sie sich vorstellen können, jetzt habe ich dies in form.html.twig:

{{ form(form) }} 
<script src="/bundles/ziiwebbilling/js/accounting.js" type="text/javascript"></script> 

aber ich für neue Projects oder neue Clients Formen nicht brauchen accounting.js bei form.html.twig tun.

HINWEIS: Entschuldigung, wenn ich zu viel mit meiner Erklärung ausdehne, aber ich weiß nicht, wie ich es auf andere Weise erklären soll. Selbst der Titel der Frage ist schrecklich, bitte editiere es, wenn du etwas besseres findest.

EDIT: wie ich gerade am ersten Kommentar geschrieben habe für jkucharovic Antwort, was ich wirklich suchen, mein Problem zu lösen, ist eine non-intrusive Art und Weise, das heißt: Ich würde nicht gerne die Zeile über accounting.js innerhalb einer AdminBundle Vorlage hinzufügen. Oder suche ich "zu viel"?

+0

Warum Sie nicht einfach zusätzliche Variable zu Vorlage aus dem Controller übergeben, und machen Sie 'definiert' Anweisung im Zweig. – malcolm

+0

@ Malcolm aber der Controller ist für alle gleich. Es gibt nur einen Controller. – ziiweb

+0

Und Sie können in dieser Controller-Instanz der Klasse nicht erkennen, für welches Formular gerendert werden soll? – malcolm

Antwort

3

Verwenden custom Twig extenstion mit Testfunktion wie diese:

public function getTests() 
{ 
    return [ 
     new \Twig_SimpleTest('bill', function ($var) { 
      return $var instanceof Bill; 
     }) 
    ]; 
} 

Und dann in Vorlage, können Sie einfach testen, ob Formular für Bill Einheit ist:

{{ form(form) }} 
{% if form.vars.value is bill %} 
<script src="/bundles/ziiwebbilling/js/accounting.js"></script> 
{% endif %} 

bearbeiten: Wenn Sie don Wenn Sie die Vorlage im Bundle aus bestimmten Gründen nicht ändern möchten, können Sie loading application-wide definieren, indem Sie eine eigene Vorlage definieren und die Standardeinstellung form block:

überschreiben
{%- block form -%} 
    {% if form.vars.value is bill %} 
    <script src="/bundles/ziiwebbilling/js/accounting.js"></script> 
    {% endif %} 
    {{ form_start(form) }} 
     {{- form_widget(form) -}} 
    {{ form_end(form) }} 
{%- endblock form -%} 
+0

danke, ich weiß immer noch nicht genau, wie die Twig-Erweiterung sein sollte, und warum ich obligatorisch eine Testfunktion benötigen sollte. Vielleicht kannst du mir ein bisschen mehr helfen. Auf der anderen Seite, was ich wirklich suche, ist eine nicht aufdringliche Art, das heißt: Ich möchte nicht die Zeile über accounting.js innerhalb einer 'AdminBundle' Vorlage hinzufügen. Entschuldigung, wenn ich zu viel erwarte ..:/ – ziiweb

+0

@ziiweb siehe aktualisierte Antwort. – jkucharovic

Verwandte Themen