ProcessWire - Render Funktionen
Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates
Links
https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue
Felder mit Templates rendern
ProcessWire rendert Felder mit einem Template wenn es in /site/templates/fields/ liegt und richtig benannt ist.
Beispiel
/site/templates/fields/body.php
<div class='bodycopy'>
<?= $value ?>
</div>
Ausgabe z.B. mit:
echo $page->render('body');
echo $page->render->body;
echo $page->_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte.
Es stehen folgende Variablen zur Verfügung:
$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
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/');
}
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