ProcessWire - Rendering Templates mit fields Ordner: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „== Felder mit Templates rendern == ProcessWire's $page->render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes über ein Template rendern…“) |
|||
| Zeile 1: | Zeile 1: | ||
| + | == Links == | ||
| + | |||
== Felder mit Templates rendern == | == Felder mit Templates rendern == | ||
| − | ProcessWire's $page->render Funktion ist extrem flexibel. | + | ProcessWire's $page->render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. |
| + | Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix. | ||
| + | |||
| + | Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist. | ||
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird. | Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird. | ||
Version vom 19. April 2024, 16:52 Uhr
Links
Felder mit Templates rendern
ProcessWire's $page->render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix.
Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.
/site/templates/fields/body.php
<div class='bodycopy'>
<?= $value ?>
</div>
Zur Ausgabe gibt es mehrere Möglichkeiten:
echo $page->render('body');
echo $page->render->body;
echo $page->_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:
$value - The value that needs to be rendered $page - The page that $value lives on $field - The field representing $value (of class Field) if you want it
Weitere Variablen kann man mit $page->set() übergeben.
Varianten (Custom Template)
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel
Beispiel
echo $page->render('body', 'custom');
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.
/site/templates/fields/body/custom.php /site/templates/fields/custom/body.php /site/templates/fields/custom.php /site/templates/fields/body.php (fallback)
Man kann es aber auch genau angeben:
echo $page->render('body', '/custom'); // use only custom.php
echo $page->render('body', '/custom/body'); // use only custom/body.php
Felder mit Repeater Matrix
Matrix Felder könnte man so handeln:
foreach($page->test_matrix as $item) {
if($item->type == 'content') {
echo "
<h3>$item->headline</h3>
<p>$item->summary</p>
";
} else if($item->type == 'quote') {
echo "
<blockquote>
<p>$item->quote</p>
<cite>$item->cite</cite>
</blockquote>
";
} else if( ... ) {
// and so on
}
}
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...
/site/templates/fields/test_matrix.php
foreach($value as $item) {
echo $item->render();
}
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...
/site/templates/fields/test_matrix/content.php
<h3><?= $page->headline ?></h3>
<p><?= $page->summary ?></p>
/site/templates/fields/test_matrix/quote.php
<blockquote>
<p><?= $page->quote ?></p>
<cite><?= $page->cite ?></cite>
</blockquote>
So kann man im Template ganz einfach aufrufen:
echo $page->render('test_matrix');
Felder sinnvoll gruppieren
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:
/site/templates/fields/short/body.php
// render the first found paragraph only
if(preg_match('!(<p>.+?</p>)!', $value, $matches)) {
echo $matches[1];
}
/site/templates/fields/short/images.php
// render a thumbnail of the first image
if(count($value)) {
$image = $value->first()->width(200);
echo "<img src='$image->url' alt='$image->description'>";
}
/site/templates/fields/short/title-link.php
// render a linked title
echo "<a href='$page->url'><h2>$page->title</h2></a>";
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:
foreach($page->children as $child) {
echo $child->render('title', 'short/title-link');
echo $child->render('images', 'short/');
echo $child->render('body', 'short/');
}
Felder aus anderen Seiten rendern
Mit $page->render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()
$results = $pages->find("body%=some text"); // find some pages and store in a PageArray
echo $page->renderValue($results, 'children'); // use the template above to render it
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.
Verschiedenes
// New Functions in 3.x
render()
renderValue()
// Functions for 2.x or for easy snippet inclusion (also possible with render
wireRenderFile() // mostly used for delayed output
wireIncludeFile() // for direct output