ProcessWire - Rendering Templates mit fields Ordner

Aus Wikizone
Version vom 19. April 2024, 16:50 Uhr von 134.3.86.14 (Diskussion) (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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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