ProcessWire - Hanna Code (Module): Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 7: Zeile 7:
 
=== find parent page ===
 
=== find parent page ===
 
Sometime you need to find a parent page.
 
Sometime you need to find a parent page.
<syntaxhighlight lang>
+
<syntaxhighlight lang="php">
 
if (!function_exists('getPage')) {
 
if (!function_exists('getPage')) {
 
      
 
      
Zeile 29: Zeile 29:
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 
=== Image from RepeaterMatrix or Repeater ===
 
=== Image from RepeaterMatrix or Repeater ===
 
<syntaxhighlight lang="php">
 
<syntaxhighlight lang="php">
Zeile 306: Zeile 307:
 
echo $out;
 
echo $out;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== Formbuilder und Hanna Code ==
 +
Ist nicht ganz einfach, da der HannaCode mehrfach aufgerufen wird. Man kann das umgehen, indem man eine Variable beim ersten Call setzt und diese dann prüft bevor der Rest des Hanns Codes ausgeführt wird.

Aktuelle Version vom 10. November 2025, 08:16 Uhr

TextformatterHannaCode

Easily insert any complex HTML, Javascript or PHP output in your ProcessWire content by creating your own Hanna code tags.

https://github.com/ryancramerdesign/ProcessHannaCode#using-hanna-code-from-the-api

Hanna Code Snippets[Bearbeiten]

find parent page[Bearbeiten]

Sometime you need to find a parent page.

if (!function_exists('getPage')) {
    
    function getPage($myPage, $level=1){
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page
        $maxLevel=5;
        if( get_class($myPage) == 'ProcessWire\RepeaterMatrixPage' || get_class($myPage) == 'ProcessWire\RepeaterPage') {
            $level +=1;
            if($level > $maxLevel) return false;
            $forPage = $myPage->getForPage();
            //var_dump( $myPage->getForPage());
            //echo("<p>next Level: ".get_class($forPage)."</p>");
            return $myPage = getImagePage($forPage);
           
        }else if( get_class($myPage) == 'ProcessWire\Page'){
            
            return $myPage;
        }
    }
}

Image from RepeaterMatrix or Repeater[Bearbeiten]

<?php
// include a image from the parent page
if (!function_exists('getImagePage')) {
    
    function getImagePage($myPage, $level=1){
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page
        $maxLevel=5;
        if( get_class($myPage) == 'ProcessWire\RepeaterMatrixPage' || get_class($myPage) == 'ProcessWire\RepeaterPage') {
            $level +=1;
            if($level > $maxLevel) return false;
            $forPage = $myPage->getForPage();
            //var_dump( $myPage->getForPage());
            //echo("<p>next Level: ".get_class($forPage)."</p>");
            return $myPage = getImagePage($forPage);
           
        }else if( get_class($myPage) == 'ProcessWire\Page'){
            
            return $myPage;
        }
    }
}
$out = '';
$imagePage = getImagePage($page);
$images = $imagePage->images;
$imgTag = '';

if($images){
    if(isset($file)){
        isset($width) ? $image =  $images->get($file)->width($width) : $image = $images->get($file);
        $imgTag .= "<img src='$image->url'"; 
        if(isset($width)) $imgTag .= " width='$width'";
        if(isset($class)) $imgTag .= " class='$class'";
        if(isset($style)) $imgTag .= " style='$style'";
        $imgTag .= '>';
        $out = $imgTag;
    }else{
        $out .= "<p>Gib einen Bildnamen an z.B.</p>";
        foreach($images as $image){
            $out .= '<p>[[image file="'.$image->name.'"]]</p>';
        }
    }
}else{
   $out .= '<p>Keine Bilder auf der Seite gefunden</p>';
    
}
echo $out;

Templates[Bearbeiten]

<?php
echo(urls()->templates);

Video[Bearbeiten]

Von chargercube - todo security / video field statt dateifeld

<?php

// include a image from the parent page
if (!function_exists('getImagePage')) {
    
    function getImagePage($myPage, $level=1){
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page
        $maxLevel=5;
        if( get_class($myPage) == 'ProcessWire\RepeaterMatrixPage' || get_class($myPage) == 'ProcessWire\RepeaterPage') {
            $level +=1;
            if($level > $maxLevel) return false;
            $forPage = $myPage->getForPage();
            //var_dump( $myPage->getForPage());
            //echo("<p>next Level: ".get_class($forPage)."</p>");
            return $myPage = getImagePage($forPage);
           
        }else if( get_class($myPage) == 'ProcessWire\Page'){
            
            return $myPage;
        }
    }
}
$out = '';
$imagePage = getImagePage($page);
//var_dump($imagePage->name);
$files = $imagePage->files;
$videoTag = '';
$videoValid = false;
$styles = '';

if($files){
    if(isset($file)){
        $file = $files->get($file); // we need the file object not the file name
        if(isset($width)) $styles = 'width: '.$width.'; max-width: 100%; height: auto;'; 
        else $styles = 'width: 100%; height: auto;';
        if($file){
            $videoValid = true;
            $videoTag .= '
            <video style="'.$styles.'" preload="preload" playsinline="" controls="" uk-video="autoplay: false" aria-hidden="false">
                <source src="'.$file->url.'" type="video/mp4">
                Ihr Browser unterstützt kein Video Tag
            </video>
            ';
            $out = $videoTag;
        }
    }
    if(!$videoValid){
        $out .= "<p>Gib einen Dateinamen an. Dateien auf dieser Seite:.</p>";
        foreach($files as $file){
            $out .= '<p>[[video file="'.$file->name.'"]]</p>';
        }
    }
}else{
   $out .= '<p>Keine Dateien auf der Seite gefunden</p>'; 
}

echo $out;

Heading[Bearbeiten]

Genbänkle

Attributes

tag=h2
heading
<?php
echo($heading);
?>

Next Events[Bearbeiten]

Genbänkle

<?php
$today = strtotime(date('Y-m-d'));
$eventPage = $pages->get('/termine/');
$mySelector = "template=event,limit=2,sort=event_date,event_date>=$today";
$events = $pages->find($mySelector);
$eventListMarkup = '';

foreach($events as $event){
    $eventListMarkup .= '<div class="date uk-text-muted">'.$event->event_date.'</div>';
    $eventListMarkup .= '<p><a href="'.$event->url().'">'.$event->title.'</a></p>';    
}

echo $eventListMarkup;

Childnavigation[Bearbeiten]

<?php namespace ProcessWire;
$out = '';
($attr['parent']) ? $parent = $pages->get($attr['parent']) : $parent = $page;
$children = $parent->children();
$out .= '<ul class="childnav">';
foreach ($children as $child){
    $out .= '<li class="nav-item"><a class="nav-link" href="'.$child->url.'">'. $child->title . '</a></li>';
}
$out .= '</ul>';
echo $out;

Social Media Icons über Repeater[Bearbeiten]

<?php namespace ProcessWire;

// SOCIALMEDIA
$socialmedia = '';
$p = $pages->get('/site-configuration/');
//bd($p->r_socialicons);
foreach($p->r_socialicons as $item){
    if($item->link){
	    $socialmedia .= '<li><a href="'.$item->link.'" target="_blank" description="'.$item->text.'"><img src="'.$item->single_image->width(48)->url.'" uk-tooltip="'.$item->text.'" alt="'.$item->text.'" title="'.$item->text.'"></a></li>';
    }
}

return '<ul class="nav socialicons uk-flex uk-flex-center@m nmb">'.$socialmedia.'</ul>';

Content einer beliebigen Seite rendern[Bearbeiten]

Hier am Beispiel einer Seite die Charts rendert (Template chart).

chart pageid=1234
<?php namespace ProcessWire;
// if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page
if (!function_exists('getParentPage')) {
    function getParentPage($myPage, $level=1){
        $maxLevel=3;
        if( get_class($myPage) == 'ProcessWire\RepeaterMatrixPage' || get_class($myPage) == 'ProcessWire\RepeaterPage') {
            $level +=1;
            if($level > $maxLevel) return false;
            $forPage = $myPage->getForPage();
            //var_dump( $myPage->getParentPage());
            //echo("<p>next Level: ".get_class($forPage)."</p>");
            return $myPage = getParentPage($forPage);
        }else if( get_class($myPage) == 'ProcessWire\Page'){  
            return $myPage;
        }
    }
}

$parent = getParentPage($page);
$parent->hasChart = true;
$chart = $pages->get($pageid); // this page contains our content. You should ommit appendFile in it's template because we don't want <head> etc. 
$out ='';
$out .= $chart->render();

echo $out;

Hanna Code an externe Funktion weitergeben[Bearbeiten]

Wenn du die Hanna Formatierung für andere Dinge nutzen willst kannst du den Code auch einfach wieder ausgeben und dann die Seite selbst parsen. Wann das sinnvoll ist musst du selbst entscheiden...

Hanna code

// Hanna code [[more]]:
<?php namespace ProcessWire;
// This tag is handled by template (readMore() Function in helpers.inc)
// so we just pass that tag through
echo('[[more]]');

helpers.inc

function readMore($text){
	$readMore = __('Read more');
	$readLess = __('Read less');
	if($text){
		$pos = strpos($text, '[[more]]', true);
		if($pos){
			$moreLink = '<div class="more-trigger" data-more="'.$readMore.'" data-less="'.$readLess.'">'.$readMore.'</div>';
			$before = substr($text,0,$pos);
			$after = substr($text,$pos+8);
			return $before.'<div class="more-text" style="display:none;">'.$after.'</div>'.$moreLink;
		}else return $text;
	}
	return $text;
}

RepeaterMatrixItem von beliebiger Seite rendern[Bearbeiten]

Hierbei gibt es ein paar Dinge zu beachten.

Im Backend wird der Hannacode Snippets in den Labels der Items angezeigt. Das kann das Backend zerhauen. Deshalb testen wir ob wir im Admin Bereich sind und geben etwas anderes aus. Außerdem möchten wir im Template auswergen ob es über Hanna aufgerufen wurde. Dann können wir z.B. Container weglassen, die eh schon über das Elternitem kommen.

<?php namespace ProcessWire;
// shows a layoutblock from another page
// can give you a list of all available blocks on a page if you provide a page id
// @param id - Page Id of a Page or of a RepeaterMatrixPage

$out = '';
//$p = $pages->get(5725);
$p = $pages->get($id);
if( gettype($p) == 'object' ){
    $class=get_class($p);
    if($class == 'ProcessWire\RepeaterMatrixPage'){
        // output
        $currentPath = $_SERVER['REQUEST_URI'];
        $isInAdminPage = (strpos($currentPath, '/processwire/') !== false);
        if(!$isInAdminPage) $out .= $p->render();
        else $out .= 'LAYOUTBLOCK VIA HANNA CODE';
    }else if($class == 'ProcessWire\Page'){
        // information
        $out .= '<p>Gewählte Seite: '.$p->title.'</p>';
        $out .= '<h4>Layout Blocks</h4>';
        $out .= '<p>Du hast die Id einer Seite übergeben. Dieser Hanna Code benötigt die ID eines Layout Blocks. Die Seite enthält folgende Layout Blöcke verwenden:</p>';
        $out .= '<ul>';
        foreach($p->layout_blocks as $i => $item){
            $out .= '<li>#'.($i+1).' [[layoutblock id='.$item->id.']] </li>';
        }
        $out .= '</ul>';
    }else{
        $out .= '<p class="uk-alert">Ungültige ID<p>';
    }
}else{
    $out .= '<p class="uk-alert">Die Id gehört zu keiner Seite.<p>';
}

echo $out;

Formbuilder und Hanna Code[Bearbeiten]

Ist nicht ganz einfach, da der HannaCode mehrfach aufgerufen wird. Man kann das umgehen, indem man eine Variable beim ersten Call setzt und diese dann prüft bevor der Rest des Hanns Codes ausgeführt wird.