ProcessWire - Rendering Templates mit fields Ordner: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
== Links ==
 
== Links ==
 +
[[ProcessWire - Render Funktionen]] (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)
  
 
== Felder mit Templates rendern ==
 
== Felder mit Templates rendern ==
Zeile 145: Zeile 146:
 
echo $page->renderValue($results, 'children'); // use the template above to render it
 
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.
+
Das children.php Template kann auf die Seiten via $page->children zugreifen, weil wir als Feldnamen 'children' übergeben haben.
 
 
<syntaxhighlight lang="php">
 
</syntaxhighlight>
 
 
 
<syntaxhighlight lang="php">
 
</syntaxhighlight>
 
<syntaxhighlight lang="php">
 
</syntaxhighlight>
 
 
 
  
 
== Verschiedenes ==
 
== Verschiedenes ==

Aktuelle Version vom 19. April 2024, 17:19 Uhr

Links[Bearbeiten]

ProcessWire - Render Funktionen (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)

Felder mit Templates rendern[Bearbeiten]

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)[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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

Das children.php Template kann auf die Seiten via $page->children zugreifen, weil wir als Feldnamen 'children' übergeben haben.

Verschiedenes[Bearbeiten]

// 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