Eine Zweigdatei einfügen und Variablen aus einer separaten Datei übergeben?

8

Ich habe container.twig einschließlich component.twig und übergebe ein Objekt namens 'mock'.

In container.twig:

%Vor%

Das funktioniert gut, aber ich möchte die Mock-Daten in eine eigene Datei verschieben. Das funktioniert nicht:

Container.twig

%Vor%

In mock.twig

%Vor%

Ich benutze Schluck-Zweig, aber es funktioniert in den meisten Punkten wie Standard-Zweig. Ссылка

    
Evans 28.04.2016, 16:00
quelle

2 Antworten

2

Das Problem

Der Zweigkontext wird niemals im Vorlagenobjekt gespeichert, daher wird es sehr schwierig sein, einen sauberen Weg zu finden, dies zu erreichen. Zum Beispiel der folgende Twig-Code:

%Vor%

Kompiliert zu:

%Vor%

Wie Sie sehen, wird der geerbte Kontext nicht per Referenz an die doDisplay-Methode übergeben und wird nie im Objekt selbst gespeichert (wie $this->context = $context ). Dieses Design ermöglicht die Wiederverwendbarkeit von Vorlagen und ist speicherfreundlich.

Lösung 1: Verwendung globaler Variablen

Ich weiß nicht, ob Ihnen Globale Variablen in Twig bekannt sind. Sie können eine Reihe von Hacks mit ihnen machen.

Am einfachsten ist es, alle Ihre Globals in Ihre Zweigumgebung zu laden.

%Vor%

Dann können Sie {{ foo }} und {{ Hello }} in Ihrer gesamten Anwendung verwenden.

Aber es gibt 2 Probleme hier:

  • Wenn Sie versuchen, Variablen aus Zweigdateien zu laden, nehme ich an, dass Sie viele Variablen haben, die abhängig von Ihrer Funktion initialisiert werden und nicht immer alles laden wollen.

  • Sie laden Variablen aus PHP-Skripten und nicht aus Twig, und Ihre Frage möchte Variablen aus einer Zweigdatei importieren.

Lösung 2: Verwenden einer Zweigverlängerung

Sie können auch eine Speichererweiterung erstellen, die eine save -Funktion bereitstellt, um den Kontext einiger Vorlagen beizubehalten, und eine restore -Funktion, um diesen gespeicherten Kontext in einer anderen zusammenzuführen.

proof_of_concept.php

%Vor%

Zweig / Variablen.twig

%Vor%

Zweig / test.twig

%Vor%

Hinweis: Wenn Sie nur Variablen importieren möchten, ohne das, was in twig / variables.twig enthalten ist, zu rendern, können Sie auch Folgendes verwenden:

%Vor%

Letzter Hinweis

Ich bin nicht an den JavaScript-Zweig-Port gewöhnt, aber es sieht so aus, als könntest du es noch erweitern, das ist dein Weg:)

    
Alain Tiemblo 04.05.2016, 10:40
quelle
3

Aufgrund der Scoping-Regeln von Twig (von denen ich annehme, dass sie durch die Schluck-Version repliziert werden), können Sie Variablen nicht aus einer Kind-Vorlage übergeben, ohne eine Hilfsfunktion zu erstellen. Das nächste, was Sie tun können, ist die Vererbung, um dies zu replizieren.

Als solches würde Ihre mock.twig-Datei

werden %Vor%

Ihre container.twig würde dann

werden %Vor%

Dadurch werden Ihre Ziele erreicht, den Scheininhalt größtenteils von den Vorlagen zu trennen, und Sie können mit dynamischen Erweiterungen etwas wie

tun %Vor%

mit einer Datei contentdumper.twig, die nur ein Stub wie folgt ist

%Vor%

und legen Sie dann die usemock-Variable fest, um zu bestimmen, ob Sie die Mock-Daten verwenden werden oder nicht.

Hoffentlich hilft das, obwohl es nicht wirklich das genaue Problem löst, das Sie haben.

    
Reid Johnson 03.05.2016 17:53
quelle

Tags und Links