ProcessWire - Hanna Code (Module)
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;
<?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>';
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 von beliebiger 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;