ProcessWire - Snippets

Aus Wikizone
Wechseln zu: Navigation, Suche

Hier findest du ein paar Basis Snippets. Codebeispiele zu Feldern findest du z.B. über die Seiten zu den Field Types.

Siehe auch

ProcessWire - Module Snippets
ProcessWire - Navigation Snippets
ProcessWire - Debugging Snippets

Basics

Bild in Template einbinden

<img src="<?php echo $config->urls->templates?>img/menu.png" alt="Home">

Link zu Seite

<a href="<?php echo $pages->get('/kontakt/')->url; ?>">

Wert aus Textfeld

<div class="<? echo $page->get("content_class")?>">

Bilder

Umfassende Renderfunktion zum wiederverwenden

Hier immer wieder aktualisiert. Todo Option für srcset.

/**
 * render image tag from imageobject
 * @todo add srcset version,add ukimage version, other attributes
 * @todo attributes as object or string
 * @param Object Image
 * @param Int width
 * @return String
 */
function renderImage($image,$w=200,$options=array()){
  if(!$image instanceof \ProcessWire\Pageimage) return '';
  $defaults = array(
    'resizeHeight' => false, // use height instead of width to resize
    'srcset' => false, // todo
    'uikit' => false, // todo
    'aspect' => false,
    'noResize' => false,
    'classes' => '', // classes as string
		'attributes' => false, // attributes as array(attr=>val) or string
		'title' => true, // add title tag based on image description
		'alt' => true, // add alt tag based on image description
  );
  $options = array_merge($defaults,$options);
	$attributes = array();
	$strAttr = '';
  $classMarkup = '';

	// ATTRIBUTES
  $attributesMarkup = '';
	if( $options['attributes'] ){
		bd( gettype( $options['attributes'] ) );
		if( gettype($options['attributes'] ) == 'string') $strAttr = (string)$options['attributes'];
		else if( gettype($options['attributes']) == 'array' ){
			foreach( (array)$options['attributes'] as $k => $a ){
				$attributes[$k] = $a;
			}
		}
	}
	if($options['alt'] && $image->description) $attributes['alt'] = $image->description;
	if($options['title'] && $image->description) $attributes['title'] = $image->description;
	$attributesMarkup = implode(' ', $attributes);
	if($strAttr) $attributesMarkup .= " $strAttr";
	
  if($options['classes']) $classMarkup = ' class="'.$options['classes'].'"';

	if($options['resizeHeight']){
    $i = $image->height($w);
  }else if($options['aspect']){
    $i = $image->size($w, intval( $w / $options['aspect']) );
  }else if($options['noResize']){
    // Todo

  }else{
    $i = $image->width($w);
  } 
	$out = '<img src="'.$i->url.'" '.$classMarkup.$attributesMarkup.'>';
	return $out;
}


Advanced Image Manipulation

ImageMagick, Externe Bilder laden, Bilder Vorrendern... Processwire - Advanced Image Manipulation

Praktische Renderfunktionen

/**
 * Image Function
 */

/**
 * get background-position style via focus point if available
 * mainly used in other functions
 * @param Pageimage PW image object
 * @return Array containing background-position
 */
function getFocusStyles($image){
	// Focal Points if available
	$imageStyles = array();
	if($image->focus){
		$focus=$image->focus();
		//var_dump($focus);
		$imageStyles[] = 'background-position:'.number_format($focus["left"],1,".","") .'% '.number_format($focus["top"],1,".","").'%;';
	}
	return $imageStyles;
}

/**
 * get background-image styles and create image
 * @todo - make image set instead of single image
 * @param Pageimage
 * @param Int Image width
 * @param String background-size attribute (cover, contain...)
 * @return array 
 */
function getBgImageStyles($image, $w = 800,$options = array()){
  $defaults = array(
    'size' => 'cover',
    'noResize' => false
  );
  $options = array_merge($defaults,$options);
  
	if($image){
		$styles = array();
    if ($options['noResize']) $myImage = $image;
    else $myImage = $image->width($w);
		$styles[] = "background-image: url($myImage->url);";
		$styles[] = 'background-size: '.$options['size'].'; background-repeat: no-repeat;';
		$styles = array_merge( $styles, getFocusStyles($myImage) );
		return $styles;
	} else return array();
	
}

/**
 * render image tag from imageobject
 * @todo add srcset version, add description, add ukimage version, other attributes
 * @param Object Image
 * @param Int width
 * @return String
 */
function renderImage($image,$w=200,$options=array()){
  if(!$image instanceof \ProcessWire\Pageimage) return '';
  $defaults = array(
    'resizeHeight' => false, // use height instead of width to resize
    'srcset' => false, // todo
    'uikit' => false, // todo
    'aspect' => false,
    'noResize' => false
  );
  $options = array_merge($defaults,$options);
	if($options['resizeHeight']){
    $i = $image->height($w);
  }else if($options['aspect']){
    $i = $image->size($w, intval( $w / $options['aspect']) );
  }else if($options['noResize']){
    // Todo
  
  }else{
    $i = $image->width($w);
  } 
	$out = '<img src="'.$i->url.'" alt="'.$i->description.'">';
	return $out;
}
</php>

Einzelbild einfügen

Maximale Breite oder maximale Höhe je nach Orientierung

$thumburl = $image->width > $image->height ? $image->size(450,0)->url : $image->size(0,320);

Maximale Breite und maximale Höhe berücksichtigen

$mW = 180;
$mH = 80;
$thumbUrl = ($mH / $image->height) > ($mW / $image->width) ? $image->size($mW,0)->url : $image->size(0,$mH)->url;

Bild aus Backend als Hintergrund einfügen

(Feldname hier: main_image)

if($page->main_image){$image = $page->main_image->size(640,960);}
else $image = NULL;
...
if($image){
  echo "
  <div class='a-3-4 team-image' style='background-image:url({$image->url})'>
    <div>{$myContent}</div>
  </div>
  ";
}

n-tes Bild einfügen

$page->images->eq(1); // second image

Mehrere Bilder aus dem Backend

$myImages='';
if(count($page->images)) {
  foreach($page->images as $image) {
    $myImages .=  '<img class="img-responsive" src="'.$image->url.'">';
  }
}

Beispiel 2

echo $page->images->implode(function($item) {
  $large = $item->size(1200,800);
  $thumb = $item->size(400,300);
  return "<li><a href='$large->url'><img src='$thumb->url' alt='$item->description'></a></li>";
}, array('prepend' => '<ul>', 'append' => '</ul>'));

Einfache Galerie

$gallery = '<div class="gallery">';
$images = $page->gallery;

// add thumbnail to gallery
if(count($page->thumbnail)){
    $gallery .= '<a class="chocolat-image gallery-item" href="'.$page->thumbnail->url.'"><img src="'. $page->thumbnail->getThumb('thumbnail') .'" title="'. $image->description .'"></a>';
}

foreach($images as $image){
    $gallery .= '<a class="chocolat-image gallery-item" href="'.$image->url.'"><img src="'. $image->getThumb('thumbnail') .'" title="'. $image->description .'"></a> ';
}
$gallery .= '</div>';


Slider mit Processwire

Processwire - Slider

Videos

Processwire - Working with Video

File Uploads

ProcessWire - Uploads

Navigation

ProcessWire - Navigation Snippets

Seiten

http://processwire.com/api/variables/pages/

Inhalt einer Seite mit $page->get()

Beispiel

<p>Visit us at: 
<?php$contact = $pages->get("/about/contact/");
echo $contact->address;
?>
</p>

Kürzer:

<p>Visit us at: <?=$pages->get("/about/contact/")->address?></p>

Seiten Filtern find()

"Featured" Checkbox im Backend angehakt

<ul>
<?php$features = $pages->find("featured=1");
foreach($features as $feature)
   echo "<li><a href='{$feature->url}'>{$feature->title}</a></li>";
?>
</ul>

Beispiel: Limitierte Ausgabe, Sortieren und in Unterverzeichnis

$pages->find("parent=/about/press/, featured=1, limit=3, sort=-date");

oder

$pages->get("/about/press/")->children("featured=1, limit=3, sort=-date");

Finde in Kategorie

$pages->get("/about/press/")->find("featured=1, limit=3, sort=-date");

Seiten mit Template xyz

$pages->find("template=press_release, featured=1, limit=3, sort=-date");

Ausführliches Beispiel mit Ausgabe

<ul>
<?php$features = $pages->find("template=press_release, featured=1, limit=3, sort=-date");
foreach($features as $feature) {
  echo "<li>" .
    "<h3><a href='{$feature->url}'>{$feature->title}</a></h3>" .
    "<span class='date'>{$feature->date}</span>" .
    "<p>{$feature->summary}</p>" .
    "</li>";}
?></ul>

Felder

Label zu Feldes und Subfeldern ausgeben

Beispiel mit dem Combo Profield. Das Prinzip funktioniert bei allen Feldern.

https://processwire.com/talk/topic/26183-getting-label-of-combo-subfield/#comment-217749
$field = $fields->get('your_combo_field_name');
$settings = $field->getComboSettings();
$subfield = $settings->getSubfield('your_subfield_name');

// get label in current user language
$label = $subfield->getLabel();

// to get in a language other than current user language
$label = $subfield->getLabel('de');

// to get localized description
$description = $subfield->getDescription();

// to get localized notes
$notes = $subfield->getNotes();

// also note you can use getLanguageValue
$label = $subfield->getLanguageValue('de', 'label');

Label eines Felds ausgeben

Geht über das Feld-Objekt.

echo $fields->get("body")->label;

Ist ein Feld leer ?

if($page->summary_de) { ... }
// check whitespace
if(trim($page->summary_de)) { ... }

Datumsfelder formatieren

 
// aus Datumsfeldern
echo date("Y-m-d", $page->getUnformatted("closing")); 

// aus Unix Timestamp mit Vanilla PHP
echo date("Y-m-d", $news->created);

setlocale(LC_TIME, "de_DE.utf8");
$weekday = strftime ( '%A' , $page->getUnformatted("date") );
$date = date("d.m.Y", $page->getUnformatted("date"));

Beispiel aus ProcessWire Blog

setlocale(LC_ALL, array('de_DE','de_DE.iso88591','de_DE.iso885915@euro','de_DE.utf8','de_DE@euro'));
$date = $page->date ? date('d.m.Y',$page->getUnformatted("date")) : date('d.m.Y',$page->getUnformatted("createdStr"));

Optionen eines Select Felds ausgeben (fieldtypeOptions)

$options = $fieldtypes->get('FieldtypeOptions')->getOptions('YOURFIELDNAME'); 
foreach($options as $option) {
  echo $option->id;
  echo $option->value;
  echo $option->title; 
}

Parent von Repeater oder RepeaterMatrix finden

Nutzt man ein Repeater Feld muss man manchmal die Seite herausfinden in der das Feld enthalten ist. Hierfür gibt es die Funktion getForPage().

if( get_class($myPage) == 'ProcessWire\RepeaterMatrixPage' || get_class($myPage) == 'ProcessWire\RepeaterPage') {
            $forPage = $myPage->getForPage();
            //var_dump( $myPage->getForPage());
            return $myPage = getImagePage($forPage);
}

Searchbar

	<!-- search form-->
	<form class='search' action='<?php echo $pages->get('template=search')->url; ?>' method='get'>
		<input type='text' name='q' placeholder='Search' value='<?php echo $sanitizer->entities($input->whitelist('q')); ?>' />
		<button type='submit' name='submit'>Search</button>
	</form>

Create Admin User

Reset Password - Passwort zurücksetzen

<?php
require "index.php";
$admin = $users->get('admin1'); // or whatever your username is
$admin->setAndSave('pass', 'geheim');
?>
https://processwire-recipes.com/recipes/resetting-admin-password-via-api/

Problem For some reason, you have managed to lock yourself out of a site you are currently developing.

Solution Paste the following into a file (e.g. "reset.php") in the root folder of the site, then run it.

ProcessWire version >= 2.6.9

require "index.php";
$admin = $users->get('admin'); // or whatever your username is
$admin->setAndSave('pass', 'yo123456');

ProcessWire version < 2.6.9

require "index.php";
$admin = wire('users')->get('admin');
$admin->setOutputFormatting(false);
$admin->set('pass', 'yo12345');
$admin->save('pass');

Editor Link / Login Logout Link

_main.php

<div class="editor">
<?php 
  if($user->isLoggedin()) {
    // if user is logged in, show a logout link
    echo "<a href='{$config->urls->admin}login/logout/'>Logout ($user->name)</a>";
  } else {
    // if user not logged in, show a login link
    echo "<a href='{$config->urls->admin}'>∆</a>";
  }
  // output an "Edit" link if this page happens to be editable by the current user
  if($page->editable()) echo "<li class='edit nav'><a href='$page->editUrl'>Edit</a></li>";
?>
</div>

Siehe auch ProcessWire - User Login / Logout

Conditions

Bedingungen durch Oder Operator in Feldern

Wenn das eine Feld leer ist nimm das nächste...

$t = $page->get("long_title|title");

Conditions für Navigation

// If the page has children, then render navigation to them under the body.
// See the _func.php for the renderNav example function.
if($page->hasChildren) {
	$content .= renderNav($page->children);
}


// if the rootParent (section) page has more than 1 child, then render 
// section navigation in the sidebar
if($page->rootParent->hasChildren > 1) {
	$sidebar = renderNavTree($page->rootParent, 3) . $page->sidebar; 
}

$page Object

Siehe auch ProcessWire - Page Object

Zugriff auf $page in Funktionen

Beispiel:

function getTitle() {
    $page = wire("page");
    $t = $page->title;

oder einfach übergeben.

Copy and Paste

Copyright / Published Date

$published_date = date('d.m.Y',$page->created);
<?= '©'.$published_date ?>

Stylesheets und Skripte mit AIOM

<script src="<?php echo AIOM::JS(array('scripts/jquery-2.2.4.min.js','scripts/jquery.chocolat.js','scripts/jquery.fitvids.js','scripts/jquery.flexslider-min.js', 'scripts/main.js')); ?>"></script>
<link rel="stylesheet" type="text/css" href="<?php echo AIOM::CSS('styles/main.less'); ?>">
<?php echo $homepage->site_title .' '. Date('Y'); ?>

Link zur Seite anhand URL-Pfad

<?php echo $pages->get('/ueber-uns/')->url; ?>

Feld einer Seite

$content_left = $page->get('content_left');

Bild

if($page->main_image){$image = $page->main_image->size(640,960);}
else $image = NULL;

Bild von der Homepage

in _init.php

$homepage = $pages->get('/');

im Template

if($homepage->config_logo){$logo = $homepage->config_logo->width(280);}
else $logo = NULL;

Simple Navigation

<ul class='nav-list'>
  <?php
  // Childrens
  foreach(($page->children) as $item) {
    if($item->id == $page->rootParent->id) {
      echo '<li class="current">';
    } else {
      echo '<li>';
    }
    echo '<a class="ajax-link" href="'.$item->url.'">'.$item->title.'</a></li>';
  }
  ?>
</ul>

Auflistung mit div. Feldern aus Kindseiten

/**
 * Publications list template
 *
 */
$publications = '';
$children = $page->children;
foreach($children as $child){
  $publications .= '<div class="box">';
  $publications .= '<h2><a class="ajax-link" parent="'. $child->parent->title .'" name="'.$child->title.'" href="'. $child->url. '">'. $child->title . '</a></h2>';
  $publications .= $child->body;
  $publications .= '</div>';
}

$content = $page->body . $publications;

Minigalerie

Thumbnails / Child Pages

$works = '<div class="gallery">';
$children = $page->children;
foreach($children as $child){
  $works .= '<a class="ajax-link" parent="'. $child->parent->title .'" name="'.$child->title.'" href="'. $child->url. '">';
  $works .= '<h2>'. $child->title . '</h2>';

  if(count($child->thumbnail)){
      $works .= '<div class="thumbnail"><img src="'. $child->thumbnail->getThumb('thumbnail') .'" title="'. $image->description .'"></div>';
  }

  $works .= '</a>';
}
$works .= '</div>';


$content = $page->body . $works . '<br/>' . $page->video;

Page Navigation

// add next button if there is another page next
if($page->next->id){
    $next = '<div class="next"><i>Next:</i>&nbsp;<a class="ajax-link" name="'.$page->next->title.'" href="'. $page->next->url .'">'. $page->next->title .'<span class="fa fa-arrow-right"><span></a></div>';
}

$content = '<h2>'. $page->title . '</h2>' . $page->body . '<br/><div class="video">' . $page->video .'</div>' . $next;

Simple Gallery with next Page

$gallery = '<div class="gallery">';
$images = $page->gallery;

// add thumbnail to gallery
if(count($page->thumbnail)){
    $gallery .= '<a class="chocolat-image gallery-item" href="'.$page->thumbnail->url.'"><img src="'. $page->thumbnail->getThumb('thumbnail') .'" title="'. $image->description .'"></a>';
}

foreach($images as $image){
    $gallery .= '<a class="chocolat-image gallery-item" href="'.$image->url.'"><img src="'. $image->getThumb('thumbnail') .'" title="'. $image->description .'"></a> ';
}
$gallery .= '</div>';

// add next button if there is another page next
if($page->next->id){
    $next = '<div class="next"><i>Next:</i>&nbsp;<a class="ajax-link" name="'.$page->next->title.'" href="'. $page->next->url .'">'. $page->next->title .'<span class="fa fa-arrow-right"><span></a></div>';
}


$content = '<h2>'. $page->title . '</h2>' . $page->body . '<br/>' . $gallery . '<br/><div class="video">' . $page->video .'</div>'. $next;

Platzhalter-Seite mit Redirect auf erste Unterseite

Möchte man eine Eltern-Seite für das Menü generieren die keinen eigenen Inhalt besitzt sondern nur Unterseiten enthält, kann man ein Template für diese Seite erstellen, dass den User auf die erste Unterseite weiterleitet.

Diese Lösung ist ein regulärer Redirect. Ob das die Beste Lösung ist müßte man mal überlegen. Auf alle Fälle besser als Duplicate Content.

<?php namespace ProcessWire;
$root = $pages->get("/");
if($page->numChildren){
	$session->redirect($page->child()->url);
} else $session->redirect($root->url);
?>

ProcessWire - Debugging Snippets

ProcessWire - Debugging Snippets