nAbend
In Bezug auf diesem Commit habe ich noch was:
v1.1.0-dev 2025-12-28
Hatte ich zwischenzeitlich kurz vergessen, weil andere Dinge wichtiger waren. Mir ist im Rahmen deiner Twig Optimierungen etwas anderes aufgefallen, über das ich mal plaudern und Alternativen zeigen möchte. Damit das bisserl strukturiert ist, habe ich die jeweiligen Abschnitte nummeriert.
1.
Als Beispiel diese Zeile:
Code: Alles auswählen
<li class="row{% if loop.index is even %} bg1{% else %} bg2{% endif %}{% if rtng.S_POST_GLOBAL %} global-announce{% endif %}{% if rtng.S_POST_ANNOUNCE %} announce{% endif %}{% if rtng.S_POST_STICKY %} sticky{% endif %}{% if rtng.S_TOPIC_REPORTED %} reported{% endif %}">
Dieser "Spaghetti-Code" ist auch ein typisches Produkt des Twig Konverters, wenn dieser die alte Syntax nach Twig konvertiert. Denn der Konverter ist so konzipiert, das die alte Syntax so weit wie möglich 1:1 in die Twig Syntax übersetzt wird. Dadurch werden aber fast alle modernen Möglichkeiten von Twig ignoriert und so hat derlei Code auch jede Menge Optimier-Potential, um es mal politisch korrekt zu formulieren. Diese Zeile entspricht also, bis auf unsere RTNG Anpassungen und Optimierungen natürlich, quasi noch immer der alten Struktur wie sie schon bei RT seit eh und je genutzt wurde.
Da greife ich mal als Beispiel den Zebra-Effekt heraus. Für diesen gibt es in Twig gleich mehrere elegante Techniken. Im folgenden Code Block zeige ich nur den Anfang der Zeile der relevant ist. Erste Zeile ist das Original, darunter die Alternativen.
Code: Alles auswählen
<li class="row{% if loop.index is even %} bg1{% else %} bg2{% endif %}
<li class="row bg{{ loop.index is even ? 1 : 2 }}
<li class="row bg{{ loop.index % 2 + 1 }}
<li class="row bg{{ cycle([1, 2], loop.index) }}
Zeile 1 ist a) sperrig, weil umständliches
if/else/endif Konstrukt und b) ineffizient, weil der statische Teil redundant notiert wurde. Aber okay, bei letzterem gehts um 2 Bytes, also kein Grund ernsthaft über "Optimierung" nachdenken zu müssen. ^^ Mir gings jetzt eher um das Grundsätzliche, weil das hätte man auch schon mit der alten Syntax besser machen können.
Zeile 2 trennt den statischen Teil vom dynamischen und nutzt Ternary (Twig Feature). Dadurch ist das ganze Ding deutlich kompakter.
Zeile 3 löst das ganze mittels Modulo, das heisst es wird auf Abfragen komplett verzichtet und die Aufgabe einfach mathematisch gelöst. Modulo gabs aber auch schon bei der alten Syntax.
Zeile 4 löst das ganze mit der Funktion
cycle() (Twig Feature), mit der man eine beliebige Anzahl Elemente quasi zyklisch rotieren kann.
2.
Auch bei den nachfolgenden Klassen kann man Alternativen einsetzen. Anhand einer der Klassen ein Beispiel, oben Original unten auf Twig getrimmt:
Code: Alles auswählen
{% if rtng.S_POST_GLOBAL %} global-announce{% endif %}
{{ rtng.S_POST_GLOBAL ? ' global-announce' }}
Statt
if/endif Konstrukt wird auch hier eine direkte Anzeige eingesetzt, aber jetzt ein verkürzter Ternary (ebenfalls Twig Feature).
3.
Wenn man jetzt die komplette Original Zeile als Ganzes betrachtet, kann man das alles auch noch anders lösen. Als erstes wieder original, dann optimierte Variante.
Code: Alles auswählen
<li class="row{% if loop.index is even %} bg1{% else %} bg2{% endif %}{% if rtng.S_POST_GLOBAL %} global-announce{% endif %}{% if rtng.S_POST_ANNOUNCE %} announce{% endif %}{% if rtng.S_POST_STICKY %} sticky{% endif %}{% if rtng.S_TOPIC_REPORTED %} reported{% endif %}">
<li class="row bg{{ loop.index % 2 + 1 }}{{ [
rtng.S_POST_GLOBAL ? ' global-announce',
rtng.S_POST_ANNOUNCE ? ' announce',
rtng.S_POST_STICKY ? ' sticky',
rtng.S_TOPIC_REPORTED ? ' reported',
]|join }}">
Als spezielle Twig Techniken werden dabei eingesetzt:
- Verkürzter Ternary.
- Array De-Referenzierung (direktes Ansprechen eines Arrays ohne dieses vorher in einer Variable speichern zu müssen). Gibts auch bei PHP.
- Filter. In dem Fall
join zum Zusammenfügen eines Arrays zu einem String. Kennt man bei PHP als implode().
Der ursprüngliche Code ist praktisch nicht mehr wiederzuerkennen, weil jetzt konsequent auf Twig optimiert. Trotzdem machen beide Codes exakt dasselbe. Aus meiner Sicht erheblich besser les- und wartbar. Und kompakter ist das auch noch; der Original Code hat 270 Bytes, die pure Twig Variante nur 206 Bytes, beide abzüglich Einrückungen.
Als Impuls/Gedanke am "Lagerfeuer".