ProcessWire - Layout Blöcke mit RepeaterMatrix: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 114: Zeile 114:
 
?>
 
?>
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
==== Responsive Image ====
 +
<pre>
 +
<?php namespace ProcessWire;
 +
$out = '';
 +
$w = 600; // width
 +
foreach($page->images as $image) {
 +
  $out .= '
 +
  <div class="">
 +
    <img class="img-responsive" style="width: 100%; height: auto;" src="'.$image->width($w)->url.'">
 +
  </div>';
 +
}
 +
return $out;
 +
</pre>
  
 
=== Weitere Beispiele ===
 
=== Weitere Beispiele ===

Version vom 15. Februar 2018, 18:57 Uhr

Mit einer RepeaterMatrix, kann man Einzelfelder zu Gruppen zusammenfassen um z.B. verschiedene Layoutblöcke zu definieren. Diese Gruppen kann man wiederholt nutzen. Im Gegensatz zum Repeater Feld können nicht nur gleichartige Felder wiederholt werden. Der Benutzer kann alle in der Matrix definierten Gruppen auswählen.

Quickstart

  • ProFields: Repeater Matrix installieren
  • Ein RepeaterMatrix Feld definieren und dort dann die Gestaltungsblöcke definieren.
Repeater Matrix Feld: layout_blocks
  • Partial zum späteren Inkludieren erstellen
z.B. partials/layout_blocks.inc
  • Partial im Template inkludieren
  • Felder definieren die man später in den Layoutblöcken nutzen möchte -> gut benennen
  • Skripte für die Gestaltungsblöcke anlegen
fields/layout_blocks/accordion.php
fields/layout_blocks/headline.php
  • Eventuell benötigte Skripte einbinden. Bei AJAX Seitenwechseln kann es notwendig sein neu zu initialisieren.

Dateien

partials/layout_blocks.inc (Version 1) Wird die Renderfunktion der RepeaterMatrix aufgerufen, sucht ProcessWire automatisch in fields/repeater_matrix_feldname/item_name.php nach dem Rendering. Es muß einfach

<?php namespace ProcessWire;
/* Shows layout blocks
 * uses repeater Matrix field
 * uses standard render function which looks after templates/fields/matrix_field_name/child_field_name.php for returning markup
 */

function renderLayoutBlocks($page){
  $out = '';
  foreach($page->layout_blocks as $item) {
    switch ($item->type) {
      case 'headline':
        $out .= $item->render(); // looks for templates/fields/layout_blocks_matrix/headline.php
        break;
      case 'content':
        $out .= '<section>'.$item->body.'</section>';
        break;
      case 'responsive_image':
        $out .= $item->render();
        break;
      case 'accordion':
        $out .= $item->render(); // looks for templates/fields/layout_blocks/accordion.php
        break;
      default:
        $out .= '<div class="message">Keine Renderdefinition gefunden für den Typ: '.$item->type.'</div>';
        break;
    }
  }
  return $out;

}

Template einbindung z.b. layout_blocks.php

include("./partials/layout_blocks.inc");
$layoutBlocks = renderLayoutBlocks($page);
$content = $layoutBlocks;

partials/layout_blocks.inc (Kurzversion)

Integriert die layout_blocks.inc ins Template und verkürzt diese. Vorteil: übersichtlich. Nachteil: nicht so schön zu debuggen. Muß noch getestet werden.

<?php namespace ProcessWire;
/* Shows layout blocks
 * uses repeater Matrix field
 * uses standard render function which looks after templates/fields/matrix_field_name/child_field_name.php for returning markup
 */

function renderLayoutBlocks($page){
  $out = '';
  foreach($page->layout_blocks_matrix as $item) {
    $out .= $item->render(); // looks for templates/fields/layout_blocks_matrix/itemTypeName.php
  }
  return $out;
}

Beispiele für Layout Blöcke

Accordion (Bootstrap)

fields/layout_blocks/accordion.php (Bootstrap Accordion Style)

<?php namespace ProcessWire;
  /*
   * Accordion Bootstrap Style
   * Used fields: 
   * accordion_repeater (repeater field)
   * accordion_headline
   * accordion_content
   */

  $markup = '<div class="panel-group accordion" id="accordion-'.$page->id.'">';
	//return "render function Accordion class";
  //$firstClass = 'in'; // used for first panel
  $firstClass = '';
  foreach($page->accordion_repeater as $panel){
    $markup .= '
    <div class="panel panel-default">
      <div class="panel-heading">
        <h4 class="panel-title">
          <a class="collapsed" data-toggle="collapse" data-parent="#accordion-'.$page->id.'" href="#collapse'.$panel->id.'">'
            .$panel->accordion_headline.'
          </a>
        </h4>
      </div>
      <div id="collapse'.$panel->id.'" class="panel-collapse collapse '.$firstClass.'">
        <div class="panel-body">'.$panel->accordion_content.'</div>
      </div>
    </div>';
    $firstClass='';
  }
  $markup .= '</div>';
  return $markup;

?>

Responsive Image

<?php namespace ProcessWire;
$out = '';
$w = 600; // width
foreach($page->images as $image) {
  $out .= '
  <div class="">
    <img class="img-responsive" style="width: 100%; height: auto;" src="'.$image->width($w)->url.'">
  </div>';
}
return $out;

Weitere Beispiele

Layout Block - portfolio_box

Vegas Slider

<?php namespace ProcessWire;

$out = '';
$slides = array();
$width = 600; // todo -> make this accessible via textbox in admin

foreach($page->images as $image){
  $myImage = $image->width($width);
  $slides[] = '{ src: "'.$myImage->url.'" }';
}

$out = '<div class="vegas" style="height:290px;width:auto; padding-top: 12px;">   </div><!-- vegas end -->';
$out .= '
<script type="text/javascript">
function initVegas(){
  $(".vegas").vegas({
    delay:8000,
    timer:false,
    transition: "fade2",
    transitionDuration: 1500,
    animation: "random",
    slides: ['.implode($slides,',').']
  });
}
// use initVegas() from ajax post if loading via ajax
</script>
';

return $out;

Probleme beheben

Vegas Slider und AJAX Page Wechsel

Todo siehe MVZ Seite