ProcessWire - Hanna Code (Module)

Aus Wikizone
Wechseln zu: Navigation, Suche

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

Image from RepeaterMatrix or Repeater

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

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

Video

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 Dateie auf der Seite gefunden</p>'; 
}

echo $out;

Heading

Genbänkle

Attributes

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

Next Events

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

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

<?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>';

Repeater Matrix Item von beliebiger Seite rendern

lb pageid="2965" itemid="" list="1"

Attributes

pageid
itemid
list=1
<?php namespace ProcessWire;

bd($pageid,'page id');
bd($itemid,'item id');
$p = $pages->get($pageid);
$out ='';
if($list){
    // show list of items on the page

    bd($p);
    $out .= '<p>Selected Page: '.$p->title.'</p>';
    $out .= '<h4>Layout Blocks</h4>';
    $out .= '<ul>';
    foreach($p->layout_blocks as $item){
        bd($item);
        $out .= '<li>'.$item->headline.' <br>[[lb pageid='.$p->id.' itemid='.$item->id.' list=0]] </li>';
    }
    $out .= '</ul>';
    $out .= '<p>Next step: Choose a item id, set param itemid equal to this id and set list parameter to 0 to render the selected item in place.</p>';
}else if($pageid && $itemid){
    if($p){
        $item = $p->layout_blocks->findOne("id=".$itemid);
        $item ? $out .= $item->render(): $out .= '<p class="uk-alert">Invalid Item ID</p>';
    }else{
        $out .= '<p class="uk-alert">Invalid Page<p>';
    }
}else{
    $out .= '<p class="uk-alert">To use this Hanna Code you need the parameters pageid (see admin page tree) and itemid. To tet the available item ids you can set the parameter list=1.</p>';
}
echo $out;

Content einer beliebigen Seite rendern

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;

An Funktion durchreichen

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 [[more]]:
<?php namespace ProcessWire;
// This tag is handled by template (readMore() Function in helpers.inc)
// so we just pass that tag through
echo('[[more]]');

// IN HELPERS
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 aus anderer Seite rendern

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;