...
Eine Vorlage ist eine Textdatei, die ein beliebiges textbasiertes Format (HTML, XML, CSV, LaTeX ...) erzeugen kann. Der bekannteste Template-Typ ist eine PHP-Vorlage - eine von PHP analysierte Textdatei, die eine Mischung aus Text und PHP-Code enthält:
Codeblock | ||||
---|---|---|---|---|
| ||||
<!DOCTYPE html> <html> <head> <title>Hallo brandbox.</title> </head> <body> <h1><?php echo $title ?></h1> <ul> <?php foreach ($list as $item): ?> <li> <a href="<?php echo $item->getHref() ?>"> <?php echo $item->getCaption() ?> </a> </li> <?php endforeach ?> </ul> </body> </html> |
Aber brandbox bietet eine noch mächtigere Templating-Sprache namens Handlebars. Handlebars ermöglicht es Ihnen, prägnante, lesbare Vorlagen zu schreiben, die für Webdesigner freundlicher und in vielerlei Hinsicht leistungsfähiger als PHP-Vorlagen sind:
Codeblock | ||||
---|---|---|---|---|
| ||||
<!DOCTYPE html> <html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1>{{ title }}</h1> <ul id="navigation"> {{#each serve.list}} <li><a href="{{ item.getHref }}">{{ item.getCaption }}</a></li> {{/each}} </ul> </body> </html> |
...
Nehmen Sie das folgende Beispiel, das eine Schleife mit einer logischen else-Anweisung kombiniert:
Codeblock | ||||
---|---|---|---|---|
| ||||
<ul> {{#each datasets}} <li>{{ propertyA }}</li> {{else}} <li>Keine Datensätze gefunden.</li> {{/each}} </ul> |
...
Handlebars ist schnell, da jede Vorlage in eine native PHP-Klasse kompiliert und zwischengespeichert wird. Dies geschieht automatisch und Sie müssen nichts tun. Während Sie entwickeln, stellen Sie diese Funktion in der /config.php
. Beispiel:
Codeblock | ||||
---|---|---|---|---|
| ||||
namespace brandbox\config { return [ // ... 'cache' => [ 'hbs' => false ] // ... ]; } |
...
Templates können verschachtelt werden, sodass wiederkehrende Elemente nicht mehrfach geschrieben werden müssen. In Handlebars stehen dafür sogenannte Partials
zur Verfügung.
Codeblock | ||||
---|---|---|---|---|
| ||||
{{> plugin_type/plugin_name.path/to/view parameterA="something"}} |
Im hier gezeigten Beispiel muss es diese Datei geben:
/plugin/remote/plugin_type/plugin_name/views/path/to/view.hbs
Partials sind Dateien, die ohne Logik (ohne PHP) ausgeführt werden.
...
Feature-Aufrufe ermöglichen das gleiche Verhalten wie Partials, zusätzlich wird eine PHP-Methode aufgerufen. Beispiel:
Aufrufendes Template
Codeblock | ||||||
---|---|---|---|---|---|---|
| ||||||
{{{feature "plugin_type/plugin_name.path/to/view" serve parameterA="something"}}} | ||||||
Codeblock | ||||||
language | php | |||||
theme | RDark |
plugin/remote/plugin_type/plugin_name/engine.php (Basis-Controller)
Codeblock | ||
---|---|---|
| ||
namespace brandbox\plugin_type\plugin_name { class engine extends plugin\lib\engineAbstract { public function pathToView($parameterA) { return ['parameterB' => '...'.$parameterA]; } } } |
Die Rückgabe-Werte der Methode pathToView
stehen im Template per serve
zur Verfügung.
...
plugin/remote/plugin_type/plugin_name/views/path/to/view.hbs
Codeblock | ||
---|---|---|
| ||
{{serve.parameterA}} // = something {{serve.parameterB}} // = ...somthing |
Wenn Sie mit der Vererbung von Templates arbeiten, sollten Sie folgende Tipps beachten:
Partials und Feature-Calls unterscheiden sich in der Anzahl verwendeter Klammern. Drei Klammern werden benötigt um den HTML-Code nicht zu escapen.
Partial-Calls werden mit einem>
gepräfixed, mit dem gleichen Ergebnis.Feature-Calls müssen den Rückgabe-Wert der PHP-Methode durchgereicht bekommen, sodass der Kontext auch bei den nächsten Rekursions-Ebenen nicht verloren geht.
Beide Wege bieten die Möglichkeit, statische Parameter durchzureichen. Im Fall von Feature-Calls werden die statischen Parameter nach serve gelistet.
Beachten Sie die Syntax von Handlebars. Geschachtelte Handlebars-Templates können auch ../
Segmente enthalten, die ihre Pfade gegen einen übergeordneten Kontext auswerten. Es kann einfacher sein, direkt auf den Root-Kontext zuzugreifen. Beispiel:
Codeblock | ||||
---|---|---|---|---|
| ||||
{{#each someArray}} {{{feature "plugin_type/plugin_name.path/to/view" ../serve parameterA="something"}}} {{{feature "plugin_type/plugin_name.path/to/view" @root.serve parameterA="something"}}} {{/each}} |
...
Helper sind Funktionen, die beim Verarbeiten der Templates zur Verfügung stehen. So ist es möglich, die Eingabewerte direkt im Template zu verändern. Sie sollten jedoch nach Möglichkeit darauf verzichten, um die Trennung von Templates und Geschäftslogik nicht zu stark aufzuweichen. Auf Handlebars-Helper kann von jedem Kontext in einer Vorlage zugegriffen werden. Sie können Helper mit einer Klasse des Speicherorts lib/helper.php
registrieren und darin Methoden ergänzen. Beachten Sie, dass der Cache geleert werden muss, damit der Helper registriert wird.
...
plugin/remote/plugin_type/plugin_name/lib/helper.php
Codeblock | ||
---|---|---|
| ||
namespace brandbox\brandbox\basic\lib { class helper { use template\helperTrait; public static function helperMultiply($a, $b) { return $a*$b; } public static function helperConditionalFoo($isTrue) { if($isTrue): return $context['fn'](); else: return $context['inverse'] ? $context['inverse']() : ''; endif; } } } |
Bitte verwenden Sie den Präfix helper
, um Helper-Methoden von Variablen bzw. integrierten Methoden unterscheiden zu können.
Codeblock | ||||
---|---|---|---|---|
| ||||
{{helperMultiply 3 5}} // 15 |
Codeblock | ||||
---|---|---|---|---|
| ||||
{{#helperConditionalFoo true}} ja {{else}} nein {{/helperConditionalFoo}} |
...
Handlebars führt beim Rendern von Inhalten automatisch Ausgabe-Escaping aus, um Sie vor Cross-Site-Scripting-Angriffen (XSS) zu schützen.
Codeblock | ||||
---|---|---|---|---|
| ||||
{{helperMultiply 3 5}} // escaped {{{helperMultiply 3 5}}} // nicht escaped |
Debugging
Um zu prüfen, welche Daten im Template ankommen, sind folgende Helper-Funktionen hilfreich:
Codeblock | ||||
---|---|---|---|---|
| ||||
// print_r {{prePrint serve}} // Daten aus Basis-Controller ausgeben. {{prePrint .}} // Kompletten Kontext ausgeben // var_dump {{preDump serve}} // Daten aus Basis-Controller ausgeben. {{preDump .}} // Kompletten Kontext ausgeben |
...