Seite 1 von 1

Ersetzung von DEFINE durch Twig syntax

Verfasst: 15.12.2023 03:20
von IMC
Ich möchte diesen Code durch Twig ersetzen,

Code: Alles auswählen

	{% if not definition.INCLUDED_TEST %}
		test
		{% DEFINE INCLUDED_TEST = true %}
	{% endif %}
Dieser Code funktioniert nicht so wie der erste.

Code: Alles auswählen

	{% if INCLUDED_TEST is empty %}
		foo
		{% set INCLUDED_TEST = 'true' %}
	{% endif %}
Wenn das EVENT mehrfach auf der Seite vorkommt ist die Variable bei jedem neuen Aufruf leer und es gibt eine Textausgabe.

Re: Ersetzung von DEFINE durch Twig syntax

Verfasst: 15.12.2023 11:53
von Mike-on-Tour
Laut der Twig-Dokumentation kann das nicht funktionieren, weil dort steht:
empty checks if a variable is an empty string, an empty array, an empty hash, exactly false, or exactly null.
Da die Variable aber beim Ausruf nicht exakt false ist, wird das wohl zu wahr ausgewertet und der Text ausgegeben.

Was aber funktioniert (das verwende ich bei der ein oder anderen meiner Exts) ist folgendes, denn nicht gesetzte Variablen wertet Twig zu false aus:

Code: Alles auswählen

	{% if !INCLUDED_TEST %}
		foo
		{% set INCLUDED_TEST = 'true' %}
	{% endif %}
Habe das gerade zweimal in einem Template reinkopiert, dieses aufgerufen und es wird nur einmal die Textausgabe gemacht.

Re: Ersetzung von DEFINE durch Twig syntax

Verfasst: 15.12.2023 12:04
von LukeWCS
Mahlzeit Thorsten

Geht es dir übrigens um ein Projekt ausserhalb von phpBB? Wenn nicht, wäre die Bastelstube der richtige Rahmen und ich würde verschieben.
IMC hat geschrieben: 15.12.2023 03:20 Ich möchte diesen Code durch Twig ersetzen,
Kurz: Geht nicht, das ist bereits Twig. :wink: Genauer gesagt phpBB-Twig.

Lang:

definition. ist ein globales Objekt das von phpBB erzeugt wird, eben damit wir globale Twig Variablen definieren können.
{% DEFINE ist eine phpBB Erweiterung für Twig und somit auch nur bei phpBB vorhanden.
Wenn das EVENT mehrfach auf der Seite vorkommt ist die Variable bei jedem neuen Aufruf leer und es gibt eine Textausgabe.
Zwangsläufig, weil {% set einen lokalen Scope hat. Das heisst das gilt ausschliesslich in dem/der Template/Datei wo das notiert wurde. Ausnahmen sind weitere Templates die wir mit {% INCLUDE einbinden, denn da wird der lokale Scope quasi weitergereicht. Aber da sind wir dann schon im Bereich "Vererbung".

Wenn du also in Template A {% set verwendest, dann "weiss" Template B absolut nichts von INCLUDED_TEST. Salopp formuliert: Die Variable INCLUDED_TEST die in A definiert wurde, ist "Eigentum" von Template A und geht Template B einen feuchten Kehricht an. :D

Re: Ersetzung von DEFINE durch Twig syntax

Verfasst: 15.12.2023 15:49
von IMC
Danke für eure Antworten.
LukeWCS hat geschrieben: 15.12.2023 12:04 Geht es dir übrigens um ein Projekt ausserhalb von phpBB? Wenn nicht, wäre die Bastelstube der richtige Rahmen und ich würde verschieben.
Ist phpBB, aber kein spezielles Projekt
LukeWCS hat geschrieben: 15.12.2023 12:04 Kurz: Geht nicht, das ist bereits Twig. :wink: Genauer gesagt phpBB-Twig.
Hatte ich mir schon gedacht.
LukeWCS hat geschrieben: 15.12.2023 12:04 Lang:
Danke für die verständliche Erklärung.
Bis Gestern hatte ich gedacht das sich der Namensraum auf die generierte Seite erstreckt und nicht nur auf das einzelne Template.
phpBB hat zum Ausgleiche das Globale Objekt. Tatsächlich hatte ich erwartet dass Twig von sich aus Globale Variablen händeln kann.

Wieder etwas dazugelernt.

Re: Ersetzung von DEFINE durch Twig syntax

Verfasst: 15.12.2023 16:42
von LukeWCS
IMC hat geschrieben: 15.12.2023 15:49 Tatsächlich hatte ich erwartet dass Twig von sich aus Globale Variablen händeln kann.
Dem ist nicht so, jedenfalls nicht Vanillla. Das muss Twig explizit beigebracht werden, phpBB macht das eben über definition..

Nur um das zu präzisieren: Ich hatte ja geschrieben von Template A und B, also wenn es 2 separate Templates sind. Das gilt aber genauso wenn dasselbe Template mehrfach aufgerufen wird. Templates kann man als separate "Instanzen" betrachten. Eine lokale Variable die beim ersten Aufruf (Instanz A) eines Templates gesetzt wird, ist beim zweiten Aufruf (Instanz B) des gleichen Templates nicht mehr existent.

Beispiel Toggle Control:

Die Template Variable TOGGLECTRL_TYPE liegt im globalen Scope und hat deshalb das Präfix TOGGLECTRL_ wie alle Variablen bei TC, die in einem globalen Scope liegen. Ich verwende konsequent ein Präfix bei Namen von globalen Variablen, um Kollisionen mit phpBB und anderen Exts zu vermeiden. Leider ist vielen Ext Codern nicht bewusst, dass sie mit globalen Scopes hantieren.

Dagegen habe ich bei der Template Variable switch_type kein Präfix verwendet, weil sie im lokalen Scope definiert wird. Und das entspricht dann wieder deinem zweiten Code.