Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

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
languagexml
themeRDark
<!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
languagexmlthemeRDark
<!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
theme
languagexmlRDark
<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
languagephp
themeRDark
  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
theme
languagexmlRDark
{{> 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
title
Codeblock
theme
languagexmlRDark
titleAufrufendes Template
{{{feature "plugin_type/plugin_name.path/to/view" serve parameterA="something"}}}
Codeblock
languagephp
themeRDark


plugin/remote/plugin_type/plugin_name/engine.php (Basis-Controller)
Codeblock
languagephp
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
languagexml
{{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
theme
languagexmlRDark
{{#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
languagephp
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
languagexmlthemeRDark
{{helperMultiply 3 5}} // 15


Codeblock
theme
languagexmlRDark
{{#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
languagexml
themeRDark
{{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
languagexmlthemeRDark
// 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

...