2012-12-08 2 views
35

stelle ich mir so etwas in meinem Zweig Vorlage habenWie kann man überprüfen, ob ein Block in einem Zweig Vorlage vorhanden - Symfony2

{% block posLeft %} 
    ----- 
{%endblock%} 

Gibt es eine Möglichkeit für existance des posLeft Block zu überprüfen, ohne zu fordern:

block("posLeft") 

Und überprüfen Sie den Rückgabewert der PosBlock, um die Existenz zu variieren. Ich bin ein Neuling in Symfony2 + Twig.

+3

Warum möchten Sie das tun? Scheint mir, dass Sie Logik in Ihre Ansichten hinzufügen, die wahrscheinlich in Ihrem Controller gehört. Wenn Sie bestimmte Inhalte basierend auf einer Variablen anzeigen möchten, injizieren Sie diese Variable einfach in Ihre Ansicht und zeigen dann bei Bedarf verschiedene Blöcke an. – lifo

Antwort

69

Sie können es so lösen, wenn Sie einen bestimmten Block nur anzeigen möchten, wenn er Inhalt hat. Hoffe, das ist, wonach Sie suchen.

Beispiel index.html.twig

{% set _block = block('dynamic') %} 
{% if _block is not empty %} 
    {{ _block|raw }} 
{% endif %} 

Beispiel part.html.twig

{% extends "index.html.twig" %} 

{% block dynamic %} 
    Block content goes here. 
{% endblock %} 
+1

Gibt es dafür kein eingebautes Tag? Blockwert zu erhalten und erneut zu prüfen, eine leere Zeichenfolge benötigt eine Menge Code. Es sieht wirklich hässlich aus. –

+3

Ich glaube nicht, dass es einen anderen Weg gibt. Und wie @lifo sagte, setzen Sie wahrscheinlich zu viel Logik in Ihre Vorlagen. Beachten Sie, dass diese zweizeilige Anweisung nicht in eine einzeilige Prüfung eingefügt wird, da dies zu neuen Unteranforderungen führen kann. Hier ist eine ähnliche Diskussion über die Twig-Google-Gruppe: https://groups.google.com/forum/?fromgroups=#!topic/twig-users/FHDTknu5n2M – insertusernamehere

16

Sie können dies es wie tun:

{% if block('posLeft') %} 
    ... 
{% endif %} 

Aber es ist n ot effizient, wenn Sie die Ausgabe des gerenderten Blocks benötigen. So wenn Sie Blockausgang müssen Sie es Variable in erster Linie und führen Sie dann Behauptungen

+1

Ich denke, das ist der sauberste Weg! – Dandy

+2

Downvoted. Siehe Link im Kommentar http://stackoverflow.com/questions/13774384/how-to-check-if-a-block-exist-in-twig-template-symfony2#comment19015938_13806784 – Im0rtality

+0

Für mich gab es manchmal Leerzeichen in der "leeren "Blockieren (wegen Formatierung). Also habe ich es geliebt mit: if block ('posLeft') | trim! = '' –

0

wollen nur ein weiteres Beispiel schaffen, die für mich gearbeitet zuweisen soll.

<body 
{% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %} 
> 

Dies ermöglicht es mir in der Kinder Vorlagen {% block ngapp 'myApp' %} erklären und haben es innerhalb von Eltern angezeigt.

Dies wurde benötigt, weil ich auf einigen Seiten Angular manuell über (angular.bootstrap('moduleName', rootElement)) Bootstrapping und Angular nicht wie leere ng-app='' Direktive und bricht auf seltsame Weise.

2

Prüfen Sie zuerst, die Zweig-Version Sie in Ihrem symfony-Projekt verwenden, da die hier Antworten sind nur für Zweig 1.

Wenn Sie mit Twig 2 Sie Glück haben. Gemäß der Twig-Dokumentation können Sie den definierten Test verwenden, um zu prüfen, ob der Block im aktuellen Vorlagenkontext existiert.

{% if block("dynamic") is defined %} 
    ... 
{% endif %} 

Ich habe ein wenig TwigExtension geschrieben zu überprüfen, ob der Block innerhalb der if-Anweisung aufgerufen wird, und es scheint, wie Zweig wirklich nur überprüft, ob der Block exsists und sie nicht nennen.

Der Link zu dem docs: http://twig.sensiolabs.org/doc/2.x/functions/block.html

Wenn verwendet Zweig 1, die alte Antwort auf https://stackoverflow.com/a/13806784/6458657 ist nach wie vor richtig.

5

Die anderen Antworten hier funktionieren nicht für Zweig 2.1 (Ich habe nicht auf ~ 2 getestet.0), also hier ein kleines Update:

{% if block('dynamic') is defined %} 
    {{ block('dynamic')|raw }} 
{% endif %} 

Beachten Sie, dass die Linie der Block zu machen ist nicht:

{% block dynamic %} 
    {# this wont work #} 
{% endblock %} 

Das wird nicht funktionieren, weil der Block während der Kompilierung gemacht werden, und so Der Test gibt True zurück, dass er existiert (wie zur Laufzeit getestet). Daher müssen Sie den Block stattdessen mit {{ block('dynamic')|raw }} rendern, da dies den Block in der Vorlage nicht definiert.

+0

Das '| row' ist hier überflüssig, da die Verwendung von' block ('dynamic') 'bereits das Entweichen behandelt und erst dann auf eine Variable gesetzt wird, bevor es angezeigt wird. – lookbadgers

5

Zweig 2.x

{{ (block("posLeft")) ?? '' }} 

Wenn Sie einen Block angezeigt werden, wenn sie definiert ist oder nicht in einer Linie. Könnte ein wenig kludgy sein, aber befriedigt meine Bedürfnisse ohne ein Bündel von wenn. Dann Logik.

Verwandte Themen