ProcessWire - Render Funktionen: Unterschied zwischen den Versionen
| Zeile 1: | Zeile 1: | ||
Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates | Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates | ||
== Links == | == Links == | ||
| + | [[ProcessWire - Page Rendering Functions]] | ||
| + | [[ProcessWire - Rendering Funktionen]] | ||
https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue | 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 == | == Felder mit Templates rendern == | ||
| − | ProcessWire | + | ProcessWire's $page->render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist. |
| − | Beispiel | + | 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 | /site/templates/fields/body.php | ||
| Zeile 16: | Zeile 18: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | Ausgabe | + | Zur Ausgabe gibt es mehrere Möglichkeiten: |
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
echo $page->render('body'); | echo $page->render('body'); | ||
echo $page->render->body; | echo $page->render->body; | ||
| − | echo $page->_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. | + | echo $page->_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore. |
</syntaxhighlight> | </syntaxhighlight> | ||
| − | Es stehen folgende Variablen zur Verfügung: | + | Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann: |
$value - The value that needs to be rendered | $value - The value that needs to be rendered | ||
$page - The page that $value lives on | $page - The page that $value lives on | ||
$field - The field representing $value (of class Field) if you want it | $field - The field representing $value (of class Field) if you want it | ||
| + | Weitere Variablen kann man mit '''$page->set()''' übergeben. | ||
=== Varianten (Custom Template) === | === Varianten (Custom Template) === | ||
| Zeile 136: | Zeile 139: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| − | + | === 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() | ||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
| + | $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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| + | Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen. | ||
| + | |||
<syntaxhighlight lang="php"> | <syntaxhighlight lang="php"> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Version vom 19. April 2024, 16:47 Uhr
Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates
Links
ProcessWire - Page Rendering Functions ProcessWire - Rendering Funktionen 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's $page->render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes ü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