<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.192.169.230</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.192.169.230"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/109.192.169.230"/>
	<updated>2026-05-06T14:41:28Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25374</id>
		<title>Matamo - Website Analytics</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25374"/>
		<updated>2021-07-14T09:40:41Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Matamo - Berichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://matomo.org/docs/videos/&lt;br /&gt;
 https://matomo.org/web-analytics-training/&lt;br /&gt;
 https://matomo.org/docs/log-analytics-tool-how-to/&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Installer bei all-inkl&lt;br /&gt;
* Archiver einrichten&lt;br /&gt;
* Allgemeine Einstellungen&lt;br /&gt;
* Datenschutz&lt;br /&gt;
&lt;br /&gt;
== Websites einrichten ==&lt;br /&gt;
* Webseite einrichen&lt;br /&gt;
* JavaScript hinzufügen - hier ein Beispiel mit deaktivierten Cookies&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Matomo hint: we do not track :-) --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var _paq = window._paq = window._paq || [];&lt;br /&gt;
  /* tracker methods like &amp;quot;setCustomDimension&amp;quot; should be called before &amp;quot;trackPageView&amp;quot; */&lt;br /&gt;
  _paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;enableLinkTracking&amp;#039;]);&lt;br /&gt;
  (function() {&lt;br /&gt;
    var u=&amp;quot;https://matamo.webmynet.de/&amp;quot;;&lt;br /&gt;
    _paq.push([&amp;#039;setTrackerUrl&amp;#039;, u+&amp;#039;matomo.php&amp;#039;]);&lt;br /&gt;
    _paq.push([&amp;#039;setSiteId&amp;#039;, &amp;#039;2&amp;#039;]);&lt;br /&gt;
    var d=document, g=d.createElement(&amp;#039;script&amp;#039;), s=d.getElementsByTagName(&amp;#039;script&amp;#039;)[0];&lt;br /&gt;
    g.type=&amp;#039;text/javascript&amp;#039;; g.async=true; g.src=u+&amp;#039;matomo.js&amp;#039;; s.parentNode.insertBefore(g,s);&lt;br /&gt;
  })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Matomo Code --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datenschutz ==&lt;br /&gt;
Einstieg:&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
 https://github.com/matomo-org/matomo/issues/12600 - GDPR Compliance Project&lt;br /&gt;
Es gibt verschiedene Maßnahmen wie man Matamo rechtskonform gestalten kann. Grob lassen sich 3 Stufen festhalten.&lt;br /&gt;
* Tracking mit Cookies oder anderen Wiedererkennungsmaßnahmen die eine Besucher ID über längere Zeiträume erlauben&lt;br /&gt;
* Tracking nur für die Session. Die Besucher ID wird jeden Tag verworfen.&lt;br /&gt;
* Kein Tracking&lt;br /&gt;
Die Auswertungsmöglichkeiten sind dementsprechend unterschiedlich.&lt;br /&gt;
=== Welche Cookies verwendet Matamo wofür? ===&lt;br /&gt;
 https://matomo.org/faq/general/faq_146/&lt;br /&gt;
==== Cookie Consent einbauen ====&lt;br /&gt;
 https://developer.matomo.org/guides/tracking-consent&lt;br /&gt;
Matamo bietet einige Funktionen in JS mit denen man Consents steuern kann.&lt;br /&gt;
==== Cookies für Tracking ausschalten ====&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-can-i-still-track-a-visitor-without-cookies-even-if-they-decline-the-cookie-consent/&lt;br /&gt;
Im JS Code hinzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Call disableCookies before calling trackPageView &lt;br /&gt;
_paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
_paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cookies die zum identifizieren von Personen genutzt werden sind dann deaktiviert:&lt;br /&gt;
&lt;br /&gt;
    _pk_id : contains a visitor id used to identify unique visitors&lt;br /&gt;
    _pk_ref : to identify from where they came from&lt;br /&gt;
&lt;br /&gt;
Trotzdem können OptIn oder OptOut Cookies unter bestimmten Umständen gesetzt werden:&lt;br /&gt;
* der Opt Out Cookie wenn man die Opt Out Methode gewählt hat (nicht Datenschutzkonform). In dem Fall wird der cookie piwik_ignore über die Matomo server Domain gesetzt (a temporary short-lived cookie called MATOMO_SESSID will also be created).&lt;br /&gt;
* der Opt In Cookie wenn man nach Consent fragt (mtm_consent will be created).&lt;br /&gt;
&lt;br /&gt;
Allerdings nutzt Matamo das sogenannte &amp;#039;&amp;#039;&amp;#039;Fingerprinting&amp;#039;&amp;#039;&amp;#039; zum identifizieren eines Nutzers. Man kann davon ausgehen, das dies zukünftig den Cookies geleich gestellt sein wird. &lt;br /&gt;
&lt;br /&gt;
It is based on several metadata, such as the operating system, browser, browser plugins, IP address, browser language; just to name a few  to identify a unique visitor. As this feature is less accurate than the one using cookies, the number of visitors and visits will be affected.&lt;br /&gt;
 https://matomo.org/faq/general/faq_156/ (Beeinträchtigung des Suchergebenisses mit Fingerprinting)&lt;br /&gt;
&lt;br /&gt;
==== Tracking komplett ausschalten ====&lt;br /&gt;
 https://matomo.org/blog/2018/04/how-to-not-process-any-personal-data-with-matomo-and-what-it-means-for-you/#user-id&lt;br /&gt;
Dürfte die einzige Methode sein, mit der man sicher auch zukünftig ohne Banner auskommt. Evtl. kann man noch mit der Methode die Besucher IDs täglich zu  wechseln durchkommen. Das würde ausreichen, um z.B. Wegeführungen in der Seite zu optimieren.&lt;br /&gt;
&lt;br /&gt;
Matamo sagt in &lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
wenn man Cookies abschaltet und nur Fingerprinting nutzt&lt;br /&gt;
No cookie consent is needed because:&lt;br /&gt;
* the data is not used for any other purpose than analytics (compared to GA which uses it for other purposes and therefore always requires consent)&lt;br /&gt;
* visitors aren’t tracked across websites (compared to GA which does track visitors across many websites)&lt;br /&gt;
* fingerprints change daily for every visitor meaning no visitor can be followed across days within the same website, and no user profiles can be generated when cookies are disabled&lt;br /&gt;
&lt;br /&gt;
==== Do not Track berücksichtigen ====&lt;br /&gt;
Ist die Default Einstellungen&lt;br /&gt;
&lt;br /&gt;
== Analytics via Log Import ==&lt;br /&gt;
Todo - evtl. Performante Lösung, die auch Nachts laufen kann.&lt;br /&gt;
[[Matamo - Analytics mit Logfiles]]&lt;br /&gt;
&lt;br /&gt;
== Wartung - alte Reports löschen ==&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
 https://forum.matomo.org/t/datenbankfahigkeiten/13822&lt;br /&gt;
&lt;br /&gt;
== Custom Tracking ==&lt;br /&gt;
Den JS Tracker kann man modifizieren.&lt;br /&gt;
 https://developer.matomo.org/guides/enrich-js-tracker&lt;br /&gt;
&lt;br /&gt;
== Matamo - Berichte ==&lt;br /&gt;
In Einstellungen &amp;gt; Persönlich lassen sich Berichte automatisch erstellen, die dann z.B. per E-Mail versendet werden.&lt;br /&gt;
&lt;br /&gt;
Die Berichte kann man auch Downloaden, dann kann man oben auch einen eigenen Zeitraum festlegen, auf den sich der Bericht bezieht.&lt;br /&gt;
&lt;br /&gt;
=== Berichte nachträglich erstellen ===&lt;br /&gt;
Ist es möglich PDF-Berichte nachträglich für vergangene Monate oder gar für einen selbst definierten Zeitraum zu erstellen?&lt;br /&gt;
Hintergrund ist, dass zu einer Webseite vergessen wurde, die E-Mailberichte zu aktivieren und die PDF-Berichte nun angefordert wurden.&lt;br /&gt;
&lt;br /&gt;
Ja. In der Übersicht der eingestellten E-Mail-Berichte befindet sich ja ein Link zum Download.&lt;br /&gt;
In diesem Link ist auch das Datum enthalten. Dies kann (manuell) je nach Bedarf geändert werden. Dann sollte auch der entsprechende Bericht generiert werden.&lt;br /&gt;
&lt;br /&gt;
== Spezielles Tracking ==&lt;br /&gt;
=== Videoplayer ===&lt;br /&gt;
Das Video läuft unter HTML5 mit dem video tag. Ich habe folgendes rein geschrieben:&lt;br /&gt;
&lt;br /&gt;
 onPlay=&amp;quot;_paq.push([‘trackEvent’, ‘video’, ‘Play’, ‘name’])&amp;quot;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25373</id>
		<title>Matamo - Website Analytics</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25373"/>
		<updated>2021-07-13T17:00:34Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Matamo - Berichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://matomo.org/docs/videos/&lt;br /&gt;
 https://matomo.org/web-analytics-training/&lt;br /&gt;
 https://matomo.org/docs/log-analytics-tool-how-to/&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Installer bei all-inkl&lt;br /&gt;
* Archiver einrichten&lt;br /&gt;
* Allgemeine Einstellungen&lt;br /&gt;
* Datenschutz&lt;br /&gt;
&lt;br /&gt;
== Websites einrichten ==&lt;br /&gt;
* Webseite einrichen&lt;br /&gt;
* JavaScript hinzufügen - hier ein Beispiel mit deaktivierten Cookies&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Matomo hint: we do not track :-) --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var _paq = window._paq = window._paq || [];&lt;br /&gt;
  /* tracker methods like &amp;quot;setCustomDimension&amp;quot; should be called before &amp;quot;trackPageView&amp;quot; */&lt;br /&gt;
  _paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;enableLinkTracking&amp;#039;]);&lt;br /&gt;
  (function() {&lt;br /&gt;
    var u=&amp;quot;https://matamo.webmynet.de/&amp;quot;;&lt;br /&gt;
    _paq.push([&amp;#039;setTrackerUrl&amp;#039;, u+&amp;#039;matomo.php&amp;#039;]);&lt;br /&gt;
    _paq.push([&amp;#039;setSiteId&amp;#039;, &amp;#039;2&amp;#039;]);&lt;br /&gt;
    var d=document, g=d.createElement(&amp;#039;script&amp;#039;), s=d.getElementsByTagName(&amp;#039;script&amp;#039;)[0];&lt;br /&gt;
    g.type=&amp;#039;text/javascript&amp;#039;; g.async=true; g.src=u+&amp;#039;matomo.js&amp;#039;; s.parentNode.insertBefore(g,s);&lt;br /&gt;
  })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Matomo Code --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datenschutz ==&lt;br /&gt;
Einstieg:&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
 https://github.com/matomo-org/matomo/issues/12600 - GDPR Compliance Project&lt;br /&gt;
Es gibt verschiedene Maßnahmen wie man Matamo rechtskonform gestalten kann. Grob lassen sich 3 Stufen festhalten.&lt;br /&gt;
* Tracking mit Cookies oder anderen Wiedererkennungsmaßnahmen die eine Besucher ID über längere Zeiträume erlauben&lt;br /&gt;
* Tracking nur für die Session. Die Besucher ID wird jeden Tag verworfen.&lt;br /&gt;
* Kein Tracking&lt;br /&gt;
Die Auswertungsmöglichkeiten sind dementsprechend unterschiedlich.&lt;br /&gt;
=== Welche Cookies verwendet Matamo wofür? ===&lt;br /&gt;
 https://matomo.org/faq/general/faq_146/&lt;br /&gt;
==== Cookie Consent einbauen ====&lt;br /&gt;
 https://developer.matomo.org/guides/tracking-consent&lt;br /&gt;
Matamo bietet einige Funktionen in JS mit denen man Consents steuern kann.&lt;br /&gt;
==== Cookies für Tracking ausschalten ====&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-can-i-still-track-a-visitor-without-cookies-even-if-they-decline-the-cookie-consent/&lt;br /&gt;
Im JS Code hinzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Call disableCookies before calling trackPageView &lt;br /&gt;
_paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
_paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cookies die zum identifizieren von Personen genutzt werden sind dann deaktiviert:&lt;br /&gt;
&lt;br /&gt;
    _pk_id : contains a visitor id used to identify unique visitors&lt;br /&gt;
    _pk_ref : to identify from where they came from&lt;br /&gt;
&lt;br /&gt;
Trotzdem können OptIn oder OptOut Cookies unter bestimmten Umständen gesetzt werden:&lt;br /&gt;
* der Opt Out Cookie wenn man die Opt Out Methode gewählt hat (nicht Datenschutzkonform). In dem Fall wird der cookie piwik_ignore über die Matomo server Domain gesetzt (a temporary short-lived cookie called MATOMO_SESSID will also be created).&lt;br /&gt;
* der Opt In Cookie wenn man nach Consent fragt (mtm_consent will be created).&lt;br /&gt;
&lt;br /&gt;
Allerdings nutzt Matamo das sogenannte &amp;#039;&amp;#039;&amp;#039;Fingerprinting&amp;#039;&amp;#039;&amp;#039; zum identifizieren eines Nutzers. Man kann davon ausgehen, das dies zukünftig den Cookies geleich gestellt sein wird. &lt;br /&gt;
&lt;br /&gt;
It is based on several metadata, such as the operating system, browser, browser plugins, IP address, browser language; just to name a few  to identify a unique visitor. As this feature is less accurate than the one using cookies, the number of visitors and visits will be affected.&lt;br /&gt;
 https://matomo.org/faq/general/faq_156/ (Beeinträchtigung des Suchergebenisses mit Fingerprinting)&lt;br /&gt;
&lt;br /&gt;
==== Tracking komplett ausschalten ====&lt;br /&gt;
 https://matomo.org/blog/2018/04/how-to-not-process-any-personal-data-with-matomo-and-what-it-means-for-you/#user-id&lt;br /&gt;
Dürfte die einzige Methode sein, mit der man sicher auch zukünftig ohne Banner auskommt. Evtl. kann man noch mit der Methode die Besucher IDs täglich zu  wechseln durchkommen. Das würde ausreichen, um z.B. Wegeführungen in der Seite zu optimieren.&lt;br /&gt;
&lt;br /&gt;
Matamo sagt in &lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
wenn man Cookies abschaltet und nur Fingerprinting nutzt&lt;br /&gt;
No cookie consent is needed because:&lt;br /&gt;
* the data is not used for any other purpose than analytics (compared to GA which uses it for other purposes and therefore always requires consent)&lt;br /&gt;
* visitors aren’t tracked across websites (compared to GA which does track visitors across many websites)&lt;br /&gt;
* fingerprints change daily for every visitor meaning no visitor can be followed across days within the same website, and no user profiles can be generated when cookies are disabled&lt;br /&gt;
&lt;br /&gt;
==== Do not Track berücksichtigen ====&lt;br /&gt;
Ist die Default Einstellungen&lt;br /&gt;
&lt;br /&gt;
== Analytics via Log Import ==&lt;br /&gt;
Todo - evtl. Performante Lösung, die auch Nachts laufen kann.&lt;br /&gt;
[[Matamo - Analytics mit Logfiles]]&lt;br /&gt;
&lt;br /&gt;
== Wartung - alte Reports löschen ==&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
 https://forum.matomo.org/t/datenbankfahigkeiten/13822&lt;br /&gt;
&lt;br /&gt;
== Custom Tracking ==&lt;br /&gt;
Den JS Tracker kann man modifizieren.&lt;br /&gt;
 https://developer.matomo.org/guides/enrich-js-tracker&lt;br /&gt;
&lt;br /&gt;
== Matamo - Berichte ==&lt;br /&gt;
&lt;br /&gt;
=== Berichte nachträglich erstellen ===&lt;br /&gt;
Ist es möglich PDF-Berichte nachträglich für vergangene Monate oder gar für einen selbst definierten Zeitraum zu erstellen?&lt;br /&gt;
Hintergrund ist, dass zu einer Webseite vergessen wurde, die E-Mailberichte zu aktivieren und die PDF-Berichte nun angefordert wurden.&lt;br /&gt;
&lt;br /&gt;
Ja. In der Übersicht der eingestellten E-Mail-Berichte befindet sich ja ein Link zum Download.&lt;br /&gt;
In diesem Link ist auch das Datum enthalten. Dies kann (manuell) je nach Bedarf geändert werden. Dann sollte auch der entsprechende Bericht generiert werden.&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Analytics_mit_Logfiles&amp;diff=25372</id>
		<title>Matamo - Analytics mit Logfiles</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Analytics_mit_Logfiles&amp;diff=25372"/>
		<updated>2021-07-13T15:21:33Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://www.kuketz-blog.de/matomo-einwilligungsfreies-tracking-mit-der-logfile-analyse/&lt;br /&gt;
 https://matomo.org/docs/log-analytics-tool-how-to/&lt;br /&gt;
 https://matomo.org/faq/log-analytics-tool/&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
* Website in Matamo hinzufügen&lt;br /&gt;
* Logfiles für den Import erreichbar ablegen&lt;br /&gt;
* Python Import vornehmen&lt;br /&gt;
&lt;br /&gt;
Beispiel Import in lokal laufendes Matomo&lt;br /&gt;
 python ~/www/02-Tools/matomo-latest/matomo/misc/log-analytics/import_logs.py --url=http://localhost/matamo --idsite=2 --recorders=4 --enable-http-errors --enable-http-redirects --enable-static --enable-bots access.log&lt;br /&gt;
Pflichtparameter sind --url und der Filename der Rest ist optional&lt;br /&gt;
&lt;br /&gt;
Angepasst werden im Beispiel natürlich der Pfad zum lokalen matomo (--url) die ID der Site in die Importiert werden soll (--idsite) und der Logfilename (ganz am Ende).&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Analytics_mit_Logfiles&amp;diff=25371</id>
		<title>Matamo - Analytics mit Logfiles</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Analytics_mit_Logfiles&amp;diff=25371"/>
		<updated>2021-07-13T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: Die Seite wurde neu angelegt: „ https://www.kuketz-blog.de/matomo-einwilligungsfreies-tracking-mit-der-logfile-analyse/  https://matomo.org/docs/log-analytics-tool-how-to/  https://matomo.or…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://www.kuketz-blog.de/matomo-einwilligungsfreies-tracking-mit-der-logfile-analyse/&lt;br /&gt;
 https://matomo.org/docs/log-analytics-tool-how-to/&lt;br /&gt;
 https://matomo.org/faq/log-analytics-tool/&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25370</id>
		<title>Matamo - Website Analytics</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Matamo_-_Website_Analytics&amp;diff=25370"/>
		<updated>2021-07-13T14:37:03Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Analytics via Log Import */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://matomo.org/docs/videos/&lt;br /&gt;
 https://matomo.org/web-analytics-training/&lt;br /&gt;
 https://matomo.org/docs/log-analytics-tool-how-to/&lt;br /&gt;
== Installation ==&lt;br /&gt;
* Installer bei all-inkl&lt;br /&gt;
* Archiver einrichten&lt;br /&gt;
* Allgemeine Einstellungen&lt;br /&gt;
* Datenschutz&lt;br /&gt;
&lt;br /&gt;
== Websites einrichten ==&lt;br /&gt;
* Webseite einrichen&lt;br /&gt;
* JavaScript hinzufügen - hier ein Beispiel mit deaktivierten Cookies&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Matomo hint: we do not track :-) --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
  var _paq = window._paq = window._paq || [];&lt;br /&gt;
  /* tracker methods like &amp;quot;setCustomDimension&amp;quot; should be called before &amp;quot;trackPageView&amp;quot; */&lt;br /&gt;
  _paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
  _paq.push([&amp;#039;enableLinkTracking&amp;#039;]);&lt;br /&gt;
  (function() {&lt;br /&gt;
    var u=&amp;quot;https://matamo.webmynet.de/&amp;quot;;&lt;br /&gt;
    _paq.push([&amp;#039;setTrackerUrl&amp;#039;, u+&amp;#039;matomo.php&amp;#039;]);&lt;br /&gt;
    _paq.push([&amp;#039;setSiteId&amp;#039;, &amp;#039;2&amp;#039;]);&lt;br /&gt;
    var d=document, g=d.createElement(&amp;#039;script&amp;#039;), s=d.getElementsByTagName(&amp;#039;script&amp;#039;)[0];&lt;br /&gt;
    g.type=&amp;#039;text/javascript&amp;#039;; g.async=true; g.src=u+&amp;#039;matomo.js&amp;#039;; s.parentNode.insertBefore(g,s);&lt;br /&gt;
  })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- End Matomo Code --&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Datenschutz ==&lt;br /&gt;
Einstieg:&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
 https://github.com/matomo-org/matomo/issues/12600 - GDPR Compliance Project&lt;br /&gt;
Es gibt verschiedene Maßnahmen wie man Matamo rechtskonform gestalten kann. Grob lassen sich 3 Stufen festhalten.&lt;br /&gt;
* Tracking mit Cookies oder anderen Wiedererkennungsmaßnahmen die eine Besucher ID über längere Zeiträume erlauben&lt;br /&gt;
* Tracking nur für die Session. Die Besucher ID wird jeden Tag verworfen.&lt;br /&gt;
* Kein Tracking&lt;br /&gt;
Die Auswertungsmöglichkeiten sind dementsprechend unterschiedlich.&lt;br /&gt;
=== Welche Cookies verwendet Matamo wofür? ===&lt;br /&gt;
 https://matomo.org/faq/general/faq_146/&lt;br /&gt;
==== Cookie Consent einbauen ====&lt;br /&gt;
 https://developer.matomo.org/guides/tracking-consent&lt;br /&gt;
Matamo bietet einige Funktionen in JS mit denen man Consents steuern kann.&lt;br /&gt;
==== Cookies für Tracking ausschalten ====&lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-can-i-still-track-a-visitor-without-cookies-even-if-they-decline-the-cookie-consent/&lt;br /&gt;
Im JS Code hinzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Call disableCookies before calling trackPageView &lt;br /&gt;
_paq.push([&amp;#039;disableCookies&amp;#039;]);&lt;br /&gt;
_paq.push([&amp;#039;trackPageView&amp;#039;]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cookies die zum identifizieren von Personen genutzt werden sind dann deaktiviert:&lt;br /&gt;
&lt;br /&gt;
    _pk_id : contains a visitor id used to identify unique visitors&lt;br /&gt;
    _pk_ref : to identify from where they came from&lt;br /&gt;
&lt;br /&gt;
Trotzdem können OptIn oder OptOut Cookies unter bestimmten Umständen gesetzt werden:&lt;br /&gt;
* der Opt Out Cookie wenn man die Opt Out Methode gewählt hat (nicht Datenschutzkonform). In dem Fall wird der cookie piwik_ignore über die Matomo server Domain gesetzt (a temporary short-lived cookie called MATOMO_SESSID will also be created).&lt;br /&gt;
* der Opt In Cookie wenn man nach Consent fragt (mtm_consent will be created).&lt;br /&gt;
&lt;br /&gt;
Allerdings nutzt Matamo das sogenannte &amp;#039;&amp;#039;&amp;#039;Fingerprinting&amp;#039;&amp;#039;&amp;#039; zum identifizieren eines Nutzers. Man kann davon ausgehen, das dies zukünftig den Cookies geleich gestellt sein wird. &lt;br /&gt;
&lt;br /&gt;
It is based on several metadata, such as the operating system, browser, browser plugins, IP address, browser language; just to name a few  to identify a unique visitor. As this feature is less accurate than the one using cookies, the number of visitors and visits will be affected.&lt;br /&gt;
 https://matomo.org/faq/general/faq_156/ (Beeinträchtigung des Suchergebenisses mit Fingerprinting)&lt;br /&gt;
&lt;br /&gt;
==== Tracking komplett ausschalten ====&lt;br /&gt;
 https://matomo.org/blog/2018/04/how-to-not-process-any-personal-data-with-matomo-and-what-it-means-for-you/#user-id&lt;br /&gt;
Dürfte die einzige Methode sein, mit der man sicher auch zukünftig ohne Banner auskommt. Evtl. kann man noch mit der Methode die Besucher IDs täglich zu  wechseln durchkommen. Das würde ausreichen, um z.B. Wegeführungen in der Seite zu optimieren.&lt;br /&gt;
&lt;br /&gt;
Matamo sagt in &lt;br /&gt;
 https://matomo.org/faq/new-to-piwik/how-do-i-use-matomo-analytics-without-consent-or-cookie-banner/&lt;br /&gt;
wenn man Cookies abschaltet und nur Fingerprinting nutzt&lt;br /&gt;
No cookie consent is needed because:&lt;br /&gt;
* the data is not used for any other purpose than analytics (compared to GA which uses it for other purposes and therefore always requires consent)&lt;br /&gt;
* visitors aren’t tracked across websites (compared to GA which does track visitors across many websites)&lt;br /&gt;
* fingerprints change daily for every visitor meaning no visitor can be followed across days within the same website, and no user profiles can be generated when cookies are disabled&lt;br /&gt;
&lt;br /&gt;
==== Do not Track berücksichtigen ====&lt;br /&gt;
Ist die Default Einstellungen&lt;br /&gt;
&lt;br /&gt;
== Analytics via Log Import ==&lt;br /&gt;
Todo - evtl. Performante Lösung, die auch Nachts laufen kann.&lt;br /&gt;
[[Matamo - Analytics mit Logfiles]]&lt;br /&gt;
&lt;br /&gt;
== Wartung - alte Reports löschen ==&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
 https://forum.matomo.org/t/datenbankfahigkeiten/13822&lt;br /&gt;
&lt;br /&gt;
== Custom Tracking ==&lt;br /&gt;
Den JS Tracker kann man modifizieren.&lt;br /&gt;
 https://developer.matomo.org/guides/enrich-js-tracker&lt;br /&gt;
&lt;br /&gt;
== Matamo - Berichte ==&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25369</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25369"/>
		<updated>2021-07-10T10:22:32Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiele für Funktionen (z.B. in _func.php) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Flexible Funktion zum erzeugen von Tree oder Listen Navigationen ===&lt;br /&gt;
* ul-Liste oder nur li&lt;br /&gt;
* Rendertiefe einstellbar&lt;br /&gt;
* Page Objekt von dem Kinder gerendert werden oder PageArray&lt;br /&gt;
* Filter (Selector) für Kindobjekte. &lt;br /&gt;
* Root voranstellen oder auch nicht (z.B. für Homepage)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Rendert eine Navi. Kindseiten wenn eine Page übergeben wird. &lt;br /&gt;
 * Alle Seiten inkl. Kinder wenn ein PageArray übergeben wird.&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
function nav($items,$options = array()){&lt;br /&gt;
	static $depth = 0;&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;ul&amp;#039; =&amp;gt; true, // wrap in &amp;lt;ul&amp;gt; or not&lt;br /&gt;
		&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // class for ul&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 1, // render depth&lt;br /&gt;
		&amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // filters child elements&lt;br /&gt;
		&amp;#039;prependRoot&amp;#039; =&amp;gt; false // if you provide a Page (i.e. home), prepend as menu item&lt;br /&gt;
	);&lt;br /&gt;
	$options = array_merge($defaults, $options);&lt;br /&gt;
	$page = $items-&amp;gt;wire(&amp;#039;page&amp;#039;); // current page&lt;br /&gt;
	$class = $depth ? &amp;quot;nav-sub&amp;quot; : rtrim(&amp;quot;nav $options[class]&amp;quot;);&lt;br /&gt;
	$attr = rtrim(&amp;quot;class=&amp;#039;$class&amp;#039;&amp;quot;);&lt;br /&gt;
	$out = $options[&amp;#039;ul&amp;#039;] ? &amp;quot;&amp;lt;ul $attr&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
	// if given a Page use children as the items and use Page as the header&lt;br /&gt;
	// if given a page array use each Page as the items&lt;br /&gt;
	if($items instanceof Page) {&lt;br /&gt;
		//$header = $items;&lt;br /&gt;
		if($options[&amp;#039;prependRoot&amp;#039;]) $out .= &amp;quot;&amp;lt;li class=&amp;#039;root&amp;#039;&amp;gt; &amp;lt;a href=&amp;#039;$items-&amp;gt;url&amp;#039;&amp;gt;$items-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
		$items = $items-&amp;gt;children($options[&amp;#039;selector&amp;#039;]);&lt;br /&gt;
	}&lt;br /&gt;
	if(!$items-&amp;gt;count) return &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	foreach($items as $n =&amp;gt; $item) {&lt;br /&gt;
		$isParent = $options[&amp;#039;depth&amp;#039;] &amp;amp;&amp;amp; $item-&amp;gt;hasChildren &amp;amp;&amp;amp; $depth &amp;lt; $options[&amp;#039;depth&amp;#039;];&lt;br /&gt;
		$classes = array();&lt;br /&gt;
&lt;br /&gt;
		// determine additional classes&lt;br /&gt;
		if($item-&amp;gt;id == $page-&amp;gt;id) $classes[] = &amp;#039;active&amp;#039;;&lt;br /&gt;
		if($isParent) $classes[] = &amp;#039;parent&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// open the list item&lt;br /&gt;
		$out .= count($classes) ? &amp;quot;&amp;lt;li class=&amp;#039;&amp;quot; . implode(&amp;#039; &amp;#039;, $classes) . &amp;quot;&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		// see if we are working with a nested list and go recursive if so&lt;br /&gt;
		if($isParent) {&lt;br /&gt;
			$depth++;&lt;br /&gt;
			$children = $item-&amp;gt;children($options[&amp;#039;selector&amp;#039;]);&lt;br /&gt;
			$out .= nav($children, array(&lt;br /&gt;
				&amp;#039;depth&amp;#039; =&amp;gt; $options[&amp;#039;depth&amp;#039;],&lt;br /&gt;
				&amp;#039;selector&amp;#039; =&amp;gt; $options[&amp;#039;selector&amp;#039;]&lt;br /&gt;
			));&lt;br /&gt;
			$depth--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;ul&amp;#039;]) $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
=== Externe Links finden ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function isExternalLink($url) {&lt;br /&gt;
		foreach($this-&amp;gt;config-&amp;gt;httpHosts as $hostname) {&lt;br /&gt;
			// If the target host is one of our own hostnames,&lt;br /&gt;
			// this link is not external.&lt;br /&gt;
			if(preg_match(&amp;quot;~^https?://{$hostname}~i&amp;quot;, $url)) return false;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Otherwise, all http(s) links are definitely external&lt;br /&gt;
		// and get redirected.&lt;br /&gt;
		if(preg_match(&amp;#039;~^https?://~i&amp;#039;, $url)) return true;&lt;br /&gt;
		&lt;br /&gt;
		// No match, then we have a relative url (internal) or some other&lt;br /&gt;
		// scheme (e.g. mailto) that we don&amp;#039;t redirect.&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Recht_-_Impressum&amp;diff=25368</id>
		<title>Recht - Impressum</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Recht_-_Impressum&amp;diff=25368"/>
		<updated>2021-07-07T12:38:09Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wer braucht ein Impressum ==&lt;br /&gt;
Alle außer &amp;quot;private&amp;quot;. Schon durch ein Werbebanner, Affiliate Links oder Links zu kommerziellen Inhalten reichen schon aus, damit eine Seite nicht mehr rein privat ist. Auch redaktionelle Inhalte sind nicht mehr rein privat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pflichtangaben ==&lt;br /&gt;
== Wo ==&lt;br /&gt;
* Auch in Facebook, Youtube, dann z.B. auf Homepage aber schreiben, dass diese auch für YouTube gilt&lt;br /&gt;
* Auch in E-Mails wenn diese gewerblich sind&lt;br /&gt;
&lt;br /&gt;
== Wie ==&lt;br /&gt;
* 2 Klick Regel&lt;br /&gt;
* Bezeichnung Impressum&lt;br /&gt;
&lt;br /&gt;
== Was ==&lt;br /&gt;
&lt;br /&gt;
* Name (Bei Einzelperson)&lt;br /&gt;
* Adresse (Postfach reicht nicht)&lt;br /&gt;
* E-Mail (Kontaktformular reicht nicht / rechtlich muss sichergestellt sein, dass man erreichbar ist. Also Tel. oder Mail)&lt;br /&gt;
* UsStID (Wenn vorhanden - nicht Steuernummer)&lt;br /&gt;
&lt;br /&gt;
* Gesellschaftsform (Bei juristischen Personen Vertretungsberechtigter (z.B. Vorstand) )&lt;br /&gt;
* Handelsregisternr. und welches falls vorhanden&lt;br /&gt;
* Vereinsregister wenn Verein&lt;br /&gt;
* UStId falls vorhanden&lt;br /&gt;
&lt;br /&gt;
* Berufshaftpflicht falls vorhanden (Name, Anschrift, räumliche Geltung)&lt;br /&gt;
&lt;br /&gt;
* Freie Berufe -&amp;gt; Aufsichtsbehörde&lt;br /&gt;
&lt;br /&gt;
* Redaktionell -&amp;gt; Verantwortlicher i.s. des Presserechts&lt;br /&gt;
&lt;br /&gt;
* Streitschlichtung&lt;br /&gt;
&lt;br /&gt;
== Infos ==&lt;br /&gt;
=== Berufshaftpflicht ===&lt;br /&gt;
Berufsgruppen wie Anwälte, Architekten oder Ärzte müssen eine Berufshaftpflichtversicherung abschließen. Bitte geben Sie den Unternehmensnamen und die Anschrift der Versicherungsgesellschaft an.&lt;br /&gt;
=== Journalistische Inhalte ===&lt;br /&gt;
Wenn Sie regelmäßig redaktionelle Inhalte veröffentlichen, geben Sie bitte einen Verantwortlichen an. Das kann auch der Seitenbetreiber sein:&lt;br /&gt;
Vorname, Name&lt;br /&gt;
Straße, Nummer&lt;br /&gt;
PLZ, Ort&lt;br /&gt;
&lt;br /&gt;
=== Reglementierte Berufe ===&lt;br /&gt;
Ärzte, Architekten etc...&lt;br /&gt;
&lt;br /&gt;
* dann gesetzl. Bezeichnung, Kammer, Land, Bezeichnung der berufsrechtlichen Regelungen, Link&lt;br /&gt;
* zust. Zulassungsbehörde falls es für den Beruf eine gibt&lt;br /&gt;
&lt;br /&gt;
Liste:&lt;br /&gt;
 http://ec.europa.eu/growth/tools-databases/regprof/&lt;br /&gt;
&lt;br /&gt;
=== Geschäfte mit Endverbrauchern ===&lt;br /&gt;
Als Unternehmen, das Geschäfte mit Endverbraucher macht (egal ob Shops oder Dienstleister), sind Sie verpflichtet auf das Streitschlichtungsportal der EU hinzuweisen.&lt;br /&gt;
&lt;br /&gt;
== Streitschlichtung ==&lt;br /&gt;
Streitschlichtung&lt;br /&gt;
&lt;br /&gt;
Wir sind nicht verpflichtet, am Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen und nehmen an einer solchen auch nicht teil.&lt;br /&gt;
Zur Streitbeilegung stellt die Europäische Kommission eine Plattform bereit:&lt;br /&gt;
&lt;br /&gt;
Plattform zur Online-Streitbeilegung (OS) - https://ec.europa.eu/consumers/odr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disclaimer und Uhrheberrecht ==&lt;br /&gt;
Haftung für Inhalte&lt;br /&gt;
&lt;br /&gt;
Wir sind als Diensteanbieter gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Wir sind nach §§ 8 bis 10 TMG jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen bzw. aktiv Nachforschungen anzustellen um Umstände aufzudecken, die auf eine rechtswidrige Tätigkeit hinweisen.&lt;br /&gt;
Hiervon nicht berührt sind Verpflichtungen zur Entfernung von Informationen aufgrund den allgemeinen Gesetzen. Eine Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer Rechtsverletzung möglich. Wenn uns entsprechende Rechtsverletzungen bekannt werden, werden wir diese Inhalte umgehend entfernen.&lt;br /&gt;
&lt;br /&gt;
Haftung für Links&lt;br /&gt;
&lt;br /&gt;
Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Auf diese fremden Inhalte können wir keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist immer der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Verlinkten Seiten werden von uns zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.&lt;br /&gt;
Eine stetige inhaltliche Kontrolle ist ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumitbar . Bei Bekanntwerden von Rechtsverletzungen werden wir solche Links umgehend entfernen.&lt;br /&gt;
&lt;br /&gt;
Urheberrecht&lt;br /&gt;
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.&lt;br /&gt;
Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
Rechtstexter von Trusted Shops und Solmeke&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Östereich&lt;br /&gt;
 https://www.ris.bka.gv.at/Dokument.wxe?Abfrage=Bundesnormen&amp;amp;Dokumentnummer=NOR40025801&amp;amp;ResultFunctionToken=455e5ea7-4c51-4c33-b76e-275605b811e3&amp;amp;Kundmachungsorgan=&amp;amp;Index=&amp;amp;Titel=ECG&amp;amp;Gesetzesnummer=&amp;amp;VonArtikel=&amp;amp;BisArtikel=&amp;amp;VonParagraf=5&amp;amp;BisParagraf=&amp;amp;VonAnlage=&amp;amp;BisAnlage=&amp;amp;Typ=&amp;amp;Kundmachungsnummer=&amp;amp;Unterzeichnungsdatum=&amp;amp;FassungVom=16.02.2017&amp;amp;VonInkrafttretedatum=&amp;amp;BisInkrafttretedatum=&amp;amp;VonAusserkrafttretedatum=&amp;amp;BisAusserkrafttretedatum=&amp;amp;NormabschnittnummerKombination=Und&amp;amp;ImRisSeit=Undefined&amp;amp;ResultPageSize=100&amp;amp;Suchworte=&lt;br /&gt;
Schweiz&lt;br /&gt;
 https://www.admin.ch/opc/de/classified-compilation/19860391/&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25367</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25367"/>
		<updated>2021-05-26T15:12:40Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiel mit PageReference für Kategorien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
&lt;br /&gt;
=== Paging ===&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
* InputfieldCommentsAdmin&lt;br /&gt;
* FieldtypeComments&lt;br /&gt;
 https://processwire.com/docs/modules/guides/comments/&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* tags (Legt die Tags/Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* tag (steht für eine Blog-Kategorie)&lt;br /&gt;
* tags (unterhalb dieser Seite kann man nur Kategorien / Tags anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25366</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25366"/>
		<updated>2021-05-26T15:06:40Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
&lt;br /&gt;
=== Paging ===&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
* InputfieldCommentsAdmin&lt;br /&gt;
* FieldtypeComments&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* tags (Legt die Tags/Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* tag (steht für eine Blog-Kategorie)&lt;br /&gt;
* tags (unterhalb dieser Seite kann man nur Kategorien / Tags anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25365</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25365"/>
		<updated>2021-05-26T13:49:33Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
&lt;br /&gt;
=== Paging ===&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* tags (Legt die Tags/Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* tag (steht für eine Blog-Kategorie)&lt;br /&gt;
* tags (unterhalb dieser Seite kann man nur Kategorien / Tags anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25364</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25364"/>
		<updated>2021-05-26T11:27:12Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Felder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* tags (Legt die Tags/Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* tag (steht für eine Blog-Kategorie)&lt;br /&gt;
* tags (unterhalb dieser Seite kann man nur Kategorien / Tags anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25363</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25363"/>
		<updated>2021-05-26T11:18:00Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiel mit PageReference für Kategorien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* tag (steht für eine Blog-Kategorie)&lt;br /&gt;
* tags (unterhalb dieser Seite kann man nur Kategorien / Tags anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25362</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25362"/>
		<updated>2021-05-26T11:01:50Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* ProcessBlog Modul von Kongondo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
Zu viel Zeug drin ;-)&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25361</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25361"/>
		<updated>2021-05-26T10:56:16Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== ProcessBlog Modul von Kongondo ==&lt;br /&gt;
 https://processwire.com/modules/process-blog/&lt;br /&gt;
 ProcessBlog&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25360</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25360"/>
		<updated>2021-05-26T10:50:31Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
== Eigenes Blog Modul erstellen ==&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25359</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25359"/>
		<updated>2021-05-26T10:47:33Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Felder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest) - &amp;#039;&amp;#039;&amp;#039;Hier mußt du noch die Parent Page festlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25358</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25358"/>
		<updated>2021-05-26T10:42:34Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Felder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date (Datum des Blog-Eintrags)&lt;br /&gt;
* comments (Verwaltet Kommentare für eine Seite. Hier für einen Blog-Eintrag)&lt;br /&gt;
* categories (Legt die Kategorien für einen Blogeintrag fest)&lt;br /&gt;
* pr_single (Legt die Seite für die Einzelansicht in der Blog-Seite fest)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25357</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25357"/>
		<updated>2021-05-26T10:40:05Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiel mit PageReference für Kategorien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date &lt;br /&gt;
* comments&lt;br /&gt;
* categories&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category (steht für eine Blog-Kategorie)&lt;br /&gt;
* categories (unterhalb dieser Seite kann man nur Kategorien anlegen)&lt;br /&gt;
* blog (Gibt den Blog aus)&lt;br /&gt;
* blog-post (Steht für einen einzelnen Blogeintrag und für die Einzelansicht)&lt;br /&gt;
&lt;br /&gt;
=== Rechte ===&lt;br /&gt;
Benutzerrolle: editor&lt;br /&gt;
* category.add&lt;br /&gt;
* category.edit&lt;br /&gt;
* category.create&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Templates ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;blog&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 76,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;menus&amp;quot;,&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menus&amp;quot;: [],&lt;br /&gt;
            &amp;quot;pr_single&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wähle die Seite aus, welche die Kategorien enthält.&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;blog-post&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 74,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;blog-post&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: -604800,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Blog-Post (News)&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;date&amp;quot;,&lt;br /&gt;
            &amp;quot;body&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;categories&amp;quot;,&lt;br /&gt;
            &amp;quot;comments&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;date&amp;quot;: {&lt;br /&gt;
                &amp;quot;columnWidth&amp;quot;: 25&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;body&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;categories&amp;quot;: [],&lt;br /&gt;
            &amp;quot;comments&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;categories&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 77,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;categories&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;category&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Kategorien&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;category&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 75,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;category&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;categories&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: false,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;,&lt;br /&gt;
            &amp;quot;editor&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25356</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25356"/>
		<updated>2021-05-26T10:29:31Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiel mit PageReference für Kategorien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date &lt;br /&gt;
* comments&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category&lt;br /&gt;
* blog&lt;br /&gt;
* blog-post&lt;br /&gt;
&lt;br /&gt;
=== Kopiervorlage ===&lt;br /&gt;
Felder&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25355</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25355"/>
		<updated>2021-05-26T10:25:40Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Felder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category&lt;br /&gt;
* &lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date &lt;br /&gt;
* comments&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 134,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 133,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j.n.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;d.m.Y&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25354</id>
		<title>ProcessWire - Blog</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Blog&amp;diff=25354"/>
		<updated>2021-05-26T10:20:53Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wie erstellt man einen Blog oder eine News-Section in ProcessWire ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Beispiel mit PageReference für Kategorien ==&lt;br /&gt;
=== Module ===&lt;br /&gt;
* Comments / Kommentare (Core)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
* category&lt;br /&gt;
* &lt;br /&gt;
=== Felder ===&lt;br /&gt;
* date &lt;br /&gt;
* comments&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;comments&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 99,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;comments&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Comments&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeComments&amp;quot;,&lt;br /&gt;
        &amp;quot;schemaVersion&amp;quot;: 6,&lt;br /&gt;
        &amp;quot;moderate&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;redirectAfterPost&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;quietSave&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;useNotify&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;deleteSpamDays&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;depth&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useWebsite&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateFormat&amp;quot;: &amp;quot;relative&amp;quot;,&lt;br /&gt;
        &amp;quot;useVotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useStars&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useGravatar&amp;quot;: &amp;quot;g&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;comment-o&amp;quot;,&lt;br /&gt;
        &amp;quot;notificationEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fromEmail&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;notifySpam&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useAkismet&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;sortNewest&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;date&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 97,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Date&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;j F Y&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;Y/m/d&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;yyyy/mm/dd&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;blog&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1921,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2041,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Beispiel (Anlehnung an Ryans Blog Beispiel) ==&lt;br /&gt;
=== Templates ===&lt;br /&gt;
blog.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// v1.0&lt;br /&gt;
// This is the template file for main /blog/ page that lists blog post summaries.&lt;br /&gt;
// If there are more than 10 posts, it also paginates them.&lt;br /&gt;
include(&amp;quot;./partials/layout-blocks.inc&amp;quot;);&lt;br /&gt;
$layoutBlocks = renderLayoutBlocks($page,$additionalHeaderData);&lt;br /&gt;
&lt;br /&gt;
$pagerOptions = array(&lt;br /&gt;
	 &amp;#039;listMarkup&amp;#039; =&amp;gt; &amp;quot;&amp;lt;ul class=&amp;#039;uk-pagination&amp;#039;&amp;gt;{out}&amp;lt;/ul&amp;gt;&amp;quot;,&lt;br /&gt;
);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;main id=&amp;#039;main&amp;#039; class=&amp;#039;uk-container uk-margin uk-margin-large-bottom&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-grid-large&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;div id=&amp;#039;content&amp;#039; class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			echo ukHeading1(page()-&amp;gt;title, &amp;#039;divider&amp;#039;);&lt;br /&gt;
			$posts = page()-&amp;gt;children(&amp;#039;limit=8,sort=-date&amp;#039;);&lt;br /&gt;
			$pagination = $posts-&amp;gt;renderPager($pagerOptions);&lt;br /&gt;
			echo($pagination);&lt;br /&gt;
			echo ukBlogPosts($posts);&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;aside id=&amp;#039;sidebar&amp;#039;  class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;?php&lt;br /&gt;
			$categories = pages()-&amp;gt;get(&amp;#039;/categories/&amp;#039;);&lt;br /&gt;
			echo &amp;#039;&amp;lt;div class=&amp;quot;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;quot;&amp;gt;&amp;#039;.ukNav($categories-&amp;gt;children, [ &amp;#039;header&amp;#039; =&amp;gt; $categories-&amp;gt;title ]).&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			?&amp;gt;&lt;br /&gt;
		&amp;lt;/aside&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
_uikit.php (Auszug)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for blog support&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a blog post using Uikit “article” component&lt;br /&gt;
 *&lt;br /&gt;
 * @param Page $page Blog post&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `summarize` (bool): Display blog post summary rather than full post? (default=auto-detect).&lt;br /&gt;
 *  - `metaIcon` (string): Icon to use for blog meta info in header (default=info).&lt;br /&gt;
 *  - `moreIcon` (string): Icon to use for more link in summarized blog post (default=more).&lt;br /&gt;
 *  - `categoryIcon` (string): Icon to use for identification of categories in blog header (default=hashtag).&lt;br /&gt;
 *  - `bylineText` (string): Template for byline (default=“Posted by %1$s on %2$s”).&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPost(Page $page, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;summarize&amp;#039; =&amp;gt; null, // Display blog post summary rather than full post? (null=auto-detect)&lt;br /&gt;
		&amp;#039;metaIcon&amp;#039; =&amp;gt; &amp;#039;info&amp;#039;,&lt;br /&gt;
		&amp;#039;moreIcon&amp;#039; =&amp;gt; &amp;#039;arrow-right&amp;#039;,&lt;br /&gt;
		&amp;#039;moreText&amp;#039; =&amp;gt; __(&amp;#039;Read more&amp;#039;),&lt;br /&gt;
		&amp;#039;categoryIcon&amp;#039; =&amp;gt; &amp;#039;hashtag&amp;#039;,&lt;br /&gt;
		//&amp;#039;bylineText&amp;#039; =&amp;gt; __(&amp;#039;Posted by %1$s on %2$s&amp;#039;),&lt;br /&gt;
		&amp;#039;bylineText&amp;#039; =&amp;gt; &amp;#039;%2$s&amp;#039;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$title = $page-&amp;gt;title;&lt;br /&gt;
	$date = $page-&amp;gt;date ? $page-&amp;gt;date : $page-&amp;gt;createdStr;&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
	//$created = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;get(&amp;quot;modified&amp;quot;));&lt;br /&gt;
	$name = $page-&amp;gt;createdUser-&amp;gt;name;&lt;br /&gt;
	$body = $page-&amp;gt;body;&lt;br /&gt;
	$metaIcon = ukIcon($options[&amp;#039;metaIcon&amp;#039;]);&lt;br /&gt;
	$moreIcon = ukIcon($options[&amp;#039;moreIcon&amp;#039;]);&lt;br /&gt;
	$categoryIcon = ukIcon($options[&amp;#039;categoryIcon&amp;#039;]);&lt;br /&gt;
	$n = $page-&amp;gt;comments-&amp;gt;count();&lt;br /&gt;
	$numComments = $n ? &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url#comments&amp;#039;&amp;gt;&amp;quot; . ukIcon(&amp;#039;comments&amp;#039;) . &amp;quot; $n&amp;lt;/a&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;] === null) {&lt;br /&gt;
		// auto-detect: summarize if current page is not the same as the blog post&lt;br /&gt;
		$options[&amp;#039;summarize&amp;#039;] = page()-&amp;gt;id != $page-&amp;gt;id;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$categories = $page-&amp;gt;categories-&amp;gt;each($categoryIcon .&lt;br /&gt;
		&amp;quot;&amp;lt;a class=&amp;#039;uk-button uk-button-text&amp;#039; href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt; &amp;quot;&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		// link to post in title, and use just the first paragraph in teaser mode&lt;br /&gt;
		$title = &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$body = explode(&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;, $body);&lt;br /&gt;
		$body = reset($body) . &amp;#039; &amp;#039;;&lt;br /&gt;
		$body .= &amp;quot;&amp;lt;br&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$options[moreText] $moreIcon&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
		$class = &amp;#039;blog-post-summary&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$class = &amp;#039;blog-post-full&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;summarize&amp;#039;]) {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h2 class=&amp;#039;uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h2&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$heading = &amp;quot;&amp;lt;h1 class=&amp;#039;uk-article-title uk-margin-remove&amp;#039;&amp;gt;$title&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$byline = sprintf($options[&amp;#039;bylineText&amp;#039;], $name, $date);&lt;br /&gt;
&lt;br /&gt;
	// return the blog post article markup&lt;br /&gt;
	return &amp;quot;&lt;br /&gt;
		&amp;lt;article class=&amp;#039;uk-article blog-post $class&amp;#039;&amp;gt;&lt;br /&gt;
			$heading&lt;br /&gt;
			&amp;lt;p class=&amp;#039;uk-margin-small&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;uk-article-meta&amp;#039;&amp;gt;&lt;br /&gt;
				$metaIcon&lt;br /&gt;
				$byline&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;categories&amp;#039;&amp;gt;&lt;br /&gt;
				$categories&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;span class=&amp;#039;num-comments uk-margin-small-left uk-text-muted&amp;#039;&amp;gt;&lt;br /&gt;
				$numComments&lt;br /&gt;
			&amp;lt;/span&amp;gt;&lt;br /&gt;
			&amp;lt;/p&amp;gt;&lt;br /&gt;
			$body&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		&amp;lt;hr&amp;gt;&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render multiple blog posts summarized&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $posts&lt;br /&gt;
 * @param array|string $options See the ukBlogPost() method for options, plus:&lt;br /&gt;
 *  - `paginate` (bool): Use pagination when applicable? (default=true)&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukBlogPosts(PageArray $posts, $options = array()) {&lt;br /&gt;
	if(!$posts-&amp;gt;count) {&lt;br /&gt;
		if(input()-&amp;gt;pageNum &amp;gt; 1) {&lt;br /&gt;
			// redirect to first pagination if accessed at an out-of-bounds pagination&lt;br /&gt;
			session()-&amp;gt;redirect(page()-&amp;gt;url);&lt;br /&gt;
		}&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;paginate&amp;#039; =&amp;gt; false&lt;br /&gt;
	);&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$out = &amp;quot;&amp;lt;div class=&amp;#039;blog-posts&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	foreach($posts as $post) {&lt;br /&gt;
		$out .= ukBlogPost($post, $options);&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;paginate&amp;#039;] &amp;amp;&amp;amp; $posts-&amp;gt;getTotal() &amp;gt; $posts-&amp;gt;count()) {&lt;br /&gt;
		$out .= ukPagination($posts);&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*****************************************************************************************&lt;br /&gt;
 * ProcessWire/Uikit functions for rendering comments and comment forms&lt;br /&gt;
 *&lt;br /&gt;
 * Note: comment threads (depth), stars and votes are not yet supported in here.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a ProcessWire comment using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * (work in progress)&lt;br /&gt;
 *&lt;br /&gt;
 * @param Comment $comment&lt;br /&gt;
 * @param array|string $options Coming soon&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComment(Comment $comment, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; null, // instance of CommentArray when called from ukComments()&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 0,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	// $options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$text = $comment-&amp;gt;getFormatted(&amp;#039;text&amp;#039;);&lt;br /&gt;
	$cite = $comment-&amp;gt;getFormatted(&amp;#039;cite&amp;#039;);&lt;br /&gt;
	$website = $comment-&amp;gt;getFormatted(&amp;#039;website&amp;#039;);&lt;br /&gt;
	$field = $comment-&amp;gt;getField();&lt;br /&gt;
	$page = $comment-&amp;gt;getPage();&lt;br /&gt;
	$classes = array();&lt;br /&gt;
	$metas = array();&lt;br /&gt;
	$gravatar = &amp;#039;&amp;#039;;&lt;br /&gt;
	$replies = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;)) {&lt;br /&gt;
		$img = $comment-&amp;gt;gravatar($field-&amp;gt;get(&amp;#039;useGravatar&amp;#039;), $field-&amp;gt;get(&amp;#039;useGravatarImageset&amp;#039;));&lt;br /&gt;
		if($img) $gravatar = &amp;quot;&amp;lt;div class=&amp;#039;uk-width-auto&amp;#039;&amp;gt;&amp;lt;img class=&amp;#039;uk-comment-avatar&amp;#039; src=&amp;#039;$img&amp;#039; alt=&amp;#039;$cite&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if($website) $cite = &amp;quot;&amp;lt;a href=&amp;#039;$website&amp;#039; rel=&amp;#039;nofollow&amp;#039; target=&amp;#039;_blank&amp;#039;&amp;gt;$cite&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
	$created = wireDate(&amp;#039;relative&amp;#039;, $comment-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
	if($field-&amp;gt;get(&amp;#039;usePermalink&amp;#039;)) {&lt;br /&gt;
		$permalink = $page-&amp;gt;httpUrl;&lt;br /&gt;
		$urlSegmentStr = $this-&amp;gt;wire(&amp;#039;input&amp;#039;)-&amp;gt;urlSegmentStr;&lt;br /&gt;
		if($urlSegmentStr) $permalink .= rtrim($permalink, &amp;#039;/&amp;#039;) . $urlSegmentStr . &amp;#039;/&amp;#039;;&lt;br /&gt;
		$permalink .= &amp;#039;#Comment&amp;#039; . $comment-&amp;gt;id;&lt;br /&gt;
		$permalink = &amp;quot;&amp;lt;a href=&amp;#039;$permalink&amp;#039;&amp;gt;&amp;quot; . __(&amp;#039;Permalink&amp;#039;) . &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		$metas[] = &amp;quot;&amp;lt;li&amp;gt;$permalink&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$classes = implode(&amp;#039; &amp;#039;, $classes);&lt;br /&gt;
	$metas = implode(&amp;#039;&amp;#039;, $metas);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&lt;br /&gt;
		&amp;lt;article id=&amp;#039;Comment$comment-&amp;gt;id&amp;#039; class=&amp;#039;$classes uk-comment uk-comment-primary&amp;#039; data-comment=&amp;#039;$comment-&amp;gt;id&amp;#039;&amp;gt;&lt;br /&gt;
			&amp;lt;header class=&amp;#039;uk-comment-header uk-grid-medium uk-flex-middle&amp;#039; uk-grid&amp;gt;&lt;br /&gt;
				$gravatar&lt;br /&gt;
				&amp;lt;div class=&amp;#039;uk-width-expand&amp;#039;&amp;gt;&lt;br /&gt;
					&amp;lt;h4 class=&amp;#039;uk-comment-title uk-margin-remove&amp;#039;&amp;gt;$cite&amp;lt;/h4&amp;gt;&lt;br /&gt;
					&amp;lt;ul class=&amp;#039;uk-comment-meta uk-subnav uk-subnav-divider uk-margin-remove-top&amp;#039;&amp;gt;&lt;br /&gt;
						&amp;lt;li&amp;gt;$created&amp;lt;/li&amp;gt;&lt;br /&gt;
						$metas&lt;br /&gt;
					&amp;lt;/ul&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/header&amp;gt;&lt;br /&gt;
			&amp;lt;div class=&amp;#039;uk-comment-body&amp;#039;&amp;gt;&lt;br /&gt;
				$text&lt;br /&gt;
			&amp;lt;/div&amp;gt;&lt;br /&gt;
		&amp;lt;/article&amp;gt;&lt;br /&gt;
		$replies&lt;br /&gt;
	&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a list of ProcessWire comments using Uikit markup&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array|string $options Options to modify default behavior&lt;br /&gt;
 *  - `id` (string): HTML id attribute of the comments list (default=&amp;#039;comments&amp;#039;).&lt;br /&gt;
 *  - `parent_id` (int): Database id of the parent comment, when rendering a comment thread.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukComments(CommentArray $comments, $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;id&amp;#039; =&amp;gt; &amp;#039;comments&amp;#039;,&lt;br /&gt;
		&amp;#039;parent_id&amp;#039; =&amp;gt; 0,&lt;br /&gt;
		&amp;#039;comments&amp;#039; =&amp;gt; $comments, // for ukComment() method only&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	if(!count($comments)) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;quot;&amp;lt;ul id=&amp;#039;$options[id]&amp;#039; class=&amp;#039;uk-comment-list&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	foreach($comments as $comment) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;li class=&amp;#039;uk-margin&amp;#039;&amp;gt;&amp;quot; . ukComment($comment, $options) . &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Render a comment posting form&lt;br /&gt;
 *&lt;br /&gt;
 * @param CommentArray $comments&lt;br /&gt;
 * @param array $options See `CommentForm` class for all options.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function ukCommentForm(CommentArray $comments, array $options = array()) {&lt;br /&gt;
&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;headline&amp;#039; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
		&amp;#039;successMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Thank you, your comment has been posted.&amp;#039;),&lt;br /&gt;
		&amp;#039;pendingMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment has been submitted and will appear once approved by the moderator.&amp;#039;),&lt;br /&gt;
		&amp;#039;errorMessage&amp;#039; =&amp;gt;&lt;br /&gt;
			__(&amp;#039;Your comment was not saved due to one or more errors.&amp;#039;) . &amp;#039; &amp;#039; .&lt;br /&gt;
			__(&amp;#039;Please check that you have completed all fields before submitting again.&amp;#039;),&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$options = _ukMergeOptions($defaults, $options);&lt;br /&gt;
	$options[&amp;#039;successMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;successMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;pendingMessage&amp;#039;] = ukAlertSuccess($options[&amp;#039;pendingMessage&amp;#039;], &amp;#039;check&amp;#039;);&lt;br /&gt;
	$options[&amp;#039;errorMessage&amp;#039;] = ukAlertDanger($options[&amp;#039;errorMessage&amp;#039;], &amp;#039;warning&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if(!isset($options[&amp;#039;attrs&amp;#039;]) || !isset($options[&amp;#039;attrs&amp;#039;][&amp;#039;class&amp;#039;])) {&lt;br /&gt;
		$options[&amp;#039;attrs&amp;#039;] = array(&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;uk-comment uk-comment-primary&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$adjustments = array(&lt;br /&gt;
		&amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039;&amp;quot; =&amp;gt; &amp;quot;&amp;lt;input type=&amp;#039;text&amp;#039; class=&amp;#039;uk-input&amp;#039;&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;p class=&amp;#039;CommentForm&amp;quot; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;uk-margin-remove-top CommentForm&amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;textarea &amp;quot; =&amp;gt; &amp;quot;&amp;lt;textarea class=&amp;#039;uk-textarea&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;button &amp;quot; =&amp;gt; &amp;quot;&amp;lt;button class=&amp;#039;uk-button uk-button-primary&amp;#039; &amp;quot;,&lt;br /&gt;
		&amp;quot;&amp;lt;label &amp;quot; =&amp;gt; &amp;quot;&amp;lt;label class=&amp;#039;uk-form-label&amp;#039; &amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
	$out = $comments-&amp;gt;renderForm($options);&lt;br /&gt;
	$out = str_replace(array_keys($adjustments), array_values($adjustments), $out);&lt;br /&gt;
&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_helpers.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function truncateText($text,$characters=500){&lt;br /&gt;
		$summary = strip_tags($text);&lt;br /&gt;
		if(strlen($summary) &amp;gt; $characters) {&lt;br /&gt;
			$summary = substr($summary, 0, $characters); // display no more than 500 chars&lt;br /&gt;
			$trimToSentence = substr($summary, 0, strrpos($summary, &amp;quot;. &amp;quot;)+1); // and truncate to last sentence&lt;br /&gt;
			if( strlen( $trimToSentence) &amp;gt; intval($characters/3) ) $summary = $trimToSentence; // use it if not too short&lt;br /&gt;
		}&lt;br /&gt;
		$summary = trim($summary);&lt;br /&gt;
		return $summary;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25353</id>
		<title>Mac - Autostart</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25353"/>
		<updated>2021-05-25T08:27:54Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Daemon kontrollieren - launchctl */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://support.apple.com/de-de/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac&lt;br /&gt;
 https://www.macwelt.de/ratgeber/OS-X-Autostart-im-Griff-behalten-9775629.html&lt;br /&gt;
&lt;br /&gt;
* Benutzer und Gruppen &amp;gt; Anmeldeobjekte&lt;br /&gt;
* Prozesse werden seit Tiger mit dem Launchdeamon verwaltet. Deamons von Drittanbieter bleiben manchmal nach der Deinstallation übrig.&lt;br /&gt;
 launchctl&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
KnockKnock&lt;br /&gt;
&lt;br /&gt;
== Wissen ==&lt;br /&gt;
&lt;br /&gt;
Seit Sommer 2019 stuft Apple Kernel Extensions generell als abgekündigt (&amp;quot;deprecated&amp;quot;) ein. Zukünftige macOS-Versionen werden die Erweiterungen nicht mehr laden, ob dies bereits mit macOS 10.16 ab Herbst 2020 der Fall ist, wurde bislang noch nicht bekanntgegeben.&lt;br /&gt;
&lt;br /&gt;
Die neuen &amp;quot;System Extensions&amp;quot; sollen schrittweise klassische Kernel-Erweiterungen ablösen. Sie können nicht mehr so tief in das System eingreifen: Statt im Kernelspace laufen die System Extensions im Userspace. Das gehöre zu den Maßnahmen rund um die Modernisierung der Plattform, wie Apple im Developer-Support-Bereich erklärt, zudem solle es Sicherheit und Zuverlässigkeit des Systems erhöhen.&lt;br /&gt;
&lt;br /&gt;
Es ist übrigens nicht nötig, einen Agent oder Daemon zu löschen, man kann ihn über die Funktion „Unload“ deaktivieren. Er wird dann nicht mehr von launchd geladen.&lt;br /&gt;
&lt;br /&gt;
== Glossar – Die wichtigsten Begriffe ==&lt;br /&gt;
 launchd&lt;br /&gt;
Das Framework launchd ist bei OS X das zentrale Framework für das Starten, Beenden und Verwalten von Prozessen und Skripts.&lt;br /&gt;
&lt;br /&gt;
 launchctl&lt;br /&gt;
Für die Administration von launchd ist das Tool launchctl zuständig. Man kann damit beispielsweise sämtliche geladenen Prozesse auflisten oder analysieren.&lt;br /&gt;
&lt;br /&gt;
 Dämonen und Agents&lt;br /&gt;
So genannte „Daemons“ beziehungsweise Dämonen sind systemweit agierende Dienste, die keine Nutzerinteraktion erfordern – sie haben keine eigene Bedienoberfläche. Oft erkennt man sie am Suffix „d“ wie den Time-Machine-Prozess „backupd“. „Agents“ dagegen ist immer auf einen Nutzer bezogen.&lt;br /&gt;
&lt;br /&gt;
 Jobs&lt;br /&gt;
Das Verhalten von Daemons und Agents wird über eine XLM-Datei beziehungsweise Property List verwaltet, die man auch als „Job“ bezeichnet.&lt;br /&gt;
&lt;br /&gt;
 Dienste&lt;br /&gt;
Unter Windows sind Systemdienste das Äquivalent zu den Daemons. Im Web und Fachmedien werden aber auch die Mac-Daemons oft als Systemdienste bezeichnet. Das führt leicht zu Verwirrung, da man beim Mac unter „Dienste“ nur die auch „Services“ genannten Programmfunktionen versteht, die man per Tastaturbefehle oder Dienstemenü aufruft.&lt;br /&gt;
&lt;br /&gt;
 Anmeldeobjekt&lt;br /&gt;
Soll beim Systemstart automatisch ein Programm starten, ist ein Launchagent unnötig. Über die Systemeinstellung Benutzer kann man ein Programm oder auch Skript als Anmeldeobjekte eintragen.&lt;br /&gt;
&lt;br /&gt;
== Daemon kontrollieren - launchctl ==&lt;br /&gt;
Skriptverwaltung mit launchd in Terminal auf dem Mac&lt;br /&gt;
Während macOS den Prozess launchd verwendet, um Daemons und Agents zu verwalten, kannst du damit deine Shell-Skripts ausführen. Du interagierst nicht direkt mit launchd, sondern verwendest stattdessen den Befehl launchctl zum Laden oder Entladen von launchd-Daemons und -Agents.&lt;br /&gt;
&lt;br /&gt;
Wenn das System gestartet wird, ist launchd der erste Prozess, den der Kernel zum Einrichten des Computers ausführt. Soll das Shell-Skript als Daemon ausgeführt werden, muss es von launchd gestartet werden. Andere Mechanismen zum Starten von Daemons und Agents können nach Ermessen von Apple entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdateien in den folgenden Ordnern vermitteln dir einen Eindruck von den verschiedenen Daemons und Agents, die von launchd verwaltet werden:&lt;br /&gt;
&lt;br /&gt;
Ordner | Verwendung&lt;br /&gt;
&lt;br /&gt;
 /System/Library/LaunchDaemons&lt;br /&gt;
Von Apple bereitgestellte System-Daemons&lt;br /&gt;
&lt;br /&gt;
 /System/Library/LaunchAgents&lt;br /&gt;
Von Apple bereitgestellte Agents, die für alle Benutzer auf Benutzerbasis gelten&lt;br /&gt;
&lt;br /&gt;
 /Library/LaunchDaemons&lt;br /&gt;
System-Daemons anderer Anbieter&lt;br /&gt;
&lt;br /&gt;
 /Library/LaunchAgents&lt;br /&gt;
Agents anderer Anbieter, die für alle Benutzer auf Benutzerbasis gelten&lt;br /&gt;
&lt;br /&gt;
 ~/Library/LaunchAgents&lt;br /&gt;
Agents anderer Anbieter, die nur für den angemeldeten Benutzer gelten&lt;br /&gt;
&lt;br /&gt;
=== Laden (aktivieren) Entladen ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 $ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist &lt;br /&gt;
You can stop the service using the unload subcommand.&lt;br /&gt;
&lt;br /&gt;
 $ sudo launchctl unload  /System/Library/LaunchDaemons/ssh.plist &lt;br /&gt;
&lt;br /&gt;
Mit KnockKnock kann man gut die Dienste auflisten die laufen.&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25352</id>
		<title>Mac - Autostart</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25352"/>
		<updated>2021-05-25T08:20:34Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Wissen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://support.apple.com/de-de/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac&lt;br /&gt;
 https://www.macwelt.de/ratgeber/OS-X-Autostart-im-Griff-behalten-9775629.html&lt;br /&gt;
&lt;br /&gt;
* Benutzer und Gruppen &amp;gt; Anmeldeobjekte&lt;br /&gt;
* Prozesse werden seit Tiger mit dem Launchdeamon verwaltet. Deamons von Drittanbieter bleiben manchmal nach der Deinstallation übrig.&lt;br /&gt;
 launchctl&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
KnockKnock&lt;br /&gt;
&lt;br /&gt;
== Wissen ==&lt;br /&gt;
&lt;br /&gt;
Seit Sommer 2019 stuft Apple Kernel Extensions generell als abgekündigt (&amp;quot;deprecated&amp;quot;) ein. Zukünftige macOS-Versionen werden die Erweiterungen nicht mehr laden, ob dies bereits mit macOS 10.16 ab Herbst 2020 der Fall ist, wurde bislang noch nicht bekanntgegeben.&lt;br /&gt;
&lt;br /&gt;
Die neuen &amp;quot;System Extensions&amp;quot; sollen schrittweise klassische Kernel-Erweiterungen ablösen. Sie können nicht mehr so tief in das System eingreifen: Statt im Kernelspace laufen die System Extensions im Userspace. Das gehöre zu den Maßnahmen rund um die Modernisierung der Plattform, wie Apple im Developer-Support-Bereich erklärt, zudem solle es Sicherheit und Zuverlässigkeit des Systems erhöhen.&lt;br /&gt;
&lt;br /&gt;
Es ist übrigens nicht nötig, einen Agent oder Daemon zu löschen, man kann ihn über die Funktion „Unload“ deaktivieren. Er wird dann nicht mehr von launchd geladen.&lt;br /&gt;
&lt;br /&gt;
== Glossar – Die wichtigsten Begriffe ==&lt;br /&gt;
 launchd&lt;br /&gt;
Das Framework launchd ist bei OS X das zentrale Framework für das Starten, Beenden und Verwalten von Prozessen und Skripts.&lt;br /&gt;
&lt;br /&gt;
 launchctl&lt;br /&gt;
Für die Administration von launchd ist das Tool launchctl zuständig. Man kann damit beispielsweise sämtliche geladenen Prozesse auflisten oder analysieren.&lt;br /&gt;
&lt;br /&gt;
 Dämonen und Agents&lt;br /&gt;
So genannte „Daemons“ beziehungsweise Dämonen sind systemweit agierende Dienste, die keine Nutzerinteraktion erfordern – sie haben keine eigene Bedienoberfläche. Oft erkennt man sie am Suffix „d“ wie den Time-Machine-Prozess „backupd“. „Agents“ dagegen ist immer auf einen Nutzer bezogen.&lt;br /&gt;
&lt;br /&gt;
 Jobs&lt;br /&gt;
Das Verhalten von Daemons und Agents wird über eine XLM-Datei beziehungsweise Property List verwaltet, die man auch als „Job“ bezeichnet.&lt;br /&gt;
&lt;br /&gt;
 Dienste&lt;br /&gt;
Unter Windows sind Systemdienste das Äquivalent zu den Daemons. Im Web und Fachmedien werden aber auch die Mac-Daemons oft als Systemdienste bezeichnet. Das führt leicht zu Verwirrung, da man beim Mac unter „Dienste“ nur die auch „Services“ genannten Programmfunktionen versteht, die man per Tastaturbefehle oder Dienstemenü aufruft.&lt;br /&gt;
&lt;br /&gt;
 Anmeldeobjekt&lt;br /&gt;
Soll beim Systemstart automatisch ein Programm starten, ist ein Launchagent unnötig. Über die Systemeinstellung Benutzer kann man ein Programm oder auch Skript als Anmeldeobjekte eintragen.&lt;br /&gt;
&lt;br /&gt;
== Daemon kontrollieren - launchctl ==&lt;br /&gt;
Skriptverwaltung mit launchd in Terminal auf dem Mac&lt;br /&gt;
Während macOS den Prozess launchd verwendet, um Daemons und Agents zu verwalten, kannst du damit deine Shell-Skripts ausführen. Du interagierst nicht direkt mit launchd, sondern verwendest stattdessen den Befehl launchctl zum Laden oder Entladen von launchd-Daemons und -Agents.&lt;br /&gt;
&lt;br /&gt;
Wenn das System gestartet wird, ist launchd der erste Prozess, den der Kernel zum Einrichten des Computers ausführt. Soll das Shell-Skript als Daemon ausgeführt werden, muss es von launchd gestartet werden. Andere Mechanismen zum Starten von Daemons und Agents können nach Ermessen von Apple entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Die Konfigurationsdateien in den folgenden Ordnern vermitteln dir einen Eindruck von den verschiedenen Daemons und Agents, die von launchd verwaltet werden:&lt;br /&gt;
&lt;br /&gt;
Ordner&lt;br /&gt;
&lt;br /&gt;
Verwendung&lt;br /&gt;
&lt;br /&gt;
/System/Library/LaunchDaemons&lt;br /&gt;
&lt;br /&gt;
Von Apple bereitgestellte System-Daemons&lt;br /&gt;
&lt;br /&gt;
/System/Library/LaunchAgents&lt;br /&gt;
&lt;br /&gt;
Von Apple bereitgestellte Agents, die für alle Benutzer auf Benutzerbasis gelten&lt;br /&gt;
&lt;br /&gt;
/Library/LaunchDaemons&lt;br /&gt;
&lt;br /&gt;
System-Daemons anderer Anbieter&lt;br /&gt;
&lt;br /&gt;
/Library/LaunchAgents&lt;br /&gt;
&lt;br /&gt;
Agents anderer Anbieter, die für alle Benutzer auf Benutzerbasis gelten&lt;br /&gt;
&lt;br /&gt;
~/Library/LaunchAgents&lt;br /&gt;
&lt;br /&gt;
Agents anderer Anbieter, die nur für den angemeldeten Benutzer gelten&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25351</id>
		<title>Mac - Autostart</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25351"/>
		<updated>2021-05-25T07:59:56Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://support.apple.com/de-de/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac&lt;br /&gt;
 https://www.macwelt.de/ratgeber/OS-X-Autostart-im-Griff-behalten-9775629.html&lt;br /&gt;
&lt;br /&gt;
* Benutzer und Gruppen &amp;gt; Anmeldeobjekte&lt;br /&gt;
* Prozesse werden seit Tiger mit dem Launchdeamon verwaltet. Deamons von Drittanbieter bleiben manchmal nach der Deinstallation übrig.&lt;br /&gt;
 launchctl&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
KnockKnock&lt;br /&gt;
&lt;br /&gt;
== Wissen ==&lt;br /&gt;
&lt;br /&gt;
Seit Sommer 2019 stuft Apple Kernel Extensions generell als abgekündigt (&amp;quot;deprecated&amp;quot;) ein. Zukünftige macOS-Versionen werden die Erweiterungen nicht mehr laden, ob dies bereits mit macOS 10.16 ab Herbst 2020 der Fall ist, wurde bislang noch nicht bekanntgegeben.&lt;br /&gt;
&lt;br /&gt;
Die neuen &amp;quot;System Extensions&amp;quot; sollen schrittweise klassische Kernel-Erweiterungen ablösen. Sie können nicht mehr so tief in das System eingreifen: Statt im Kernelspace laufen die System Extensions im Userspace. Das gehöre zu den Maßnahmen rund um die Modernisierung der Plattform, wie Apple im Developer-Support-Bereich erklärt, zudem solle es Sicherheit und Zuverlässigkeit des Systems erhöhen.&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25350</id>
		<title>Mac - Autostart</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Autostart&amp;diff=25350"/>
		<updated>2021-05-25T07:51:26Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: Die Seite wurde neu angelegt: „Links   https://support.apple.com/de-de/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac  https://www.macwelt.de/ratgeber/OS-X-Autostart-im-Griff-beh…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Links&lt;br /&gt;
&lt;br /&gt;
 https://support.apple.com/de-de/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac&lt;br /&gt;
 https://www.macwelt.de/ratgeber/OS-X-Autostart-im-Griff-behalten-9775629.html&lt;br /&gt;
&lt;br /&gt;
* Benutzer und Gruppen &amp;gt; Anmeldeobjekte&lt;br /&gt;
* Prozesse werden seit Tiger mit dem Launchdeamon verwaltet. Deamons von Drittanbieter bleiben manchmal nach der Deinstallation übrig.&lt;br /&gt;
 launchctl&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tipps_und_Tricks&amp;diff=25349</id>
		<title>Mac - Tipps und Tricks</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Tipps_und_Tricks&amp;diff=25349"/>
		<updated>2021-05-25T07:48:15Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Autostart von Programmen auf dem Mac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Shell Skripte ==&lt;br /&gt;
http://stackoverflow.com/questions/26235324/how-to-create-a-batch-file-in-mac&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
FILENAME=`date +&amp;quot;/Volumes/path/to/network/share/Backup/%Y-%m-%d.tgz&amp;quot;`&lt;br /&gt;
cd /directory/to/backup || exit 1&lt;br /&gt;
tar -cvz &amp;quot;$FILENAME&amp;quot; .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You can save that on your Desktop as backup and then go in Terminal and type:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;winbatch&amp;quot;&amp;gt;&lt;br /&gt;
chmod +x ~/Desktop/backup&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mac Wartung ==&lt;br /&gt;
=== Recovery Mode ===&lt;br /&gt;
=== PRAM löschen ===&lt;br /&gt;
== Benutzerordner verschieben ==&lt;br /&gt;
=== Variante 1 - Versteckte Option Speicherort ===&lt;br /&gt;
Hinweis: Sinnvoll ist ein &amp;#039;&amp;#039;&amp;#039;Adminkonto auf dem Startvolume zu belassen&amp;#039;&amp;#039;&amp;#039;, mit dem man im Notfall arbeiten kann, falls es mal Probleme gibt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Privatorder&amp;#039;&amp;#039;&amp;#039; des Benutzers auf ein anderes Volume &amp;#039;&amp;#039;&amp;#039;kopieren&amp;#039;&amp;#039;&amp;#039; (dabei darf aber die Funktion &amp;quot;Eigentümer auf diesem Volume ignorieren&amp;quot; nicht aktiviert sein; siehe Info-Fenster für diese Festplatte unter &amp;quot;Freigaben &amp;amp; Zugriffsrechte&amp;quot;). &lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Systemeinstellung &amp;gt; &amp;quot;Benutzer&amp;quot; Kontextmenü&amp;#039;&amp;#039;&amp;#039; des betreffenden Benutzers &amp;#039;&amp;#039;&amp;#039;&amp;quot;Erweiterte Optionen&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;&amp;quot;Benutzerordner&amp;quot; &amp;gt; &amp;quot;Auswählen&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Alten Ordner löschen und &amp;#039;&amp;#039;&amp;#039;Neustart&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Nachteil: Manche aus Linux portierte Apps (z.B. Filezilla) arbeiten nicht mit dem Library Ordner und finden u.U. manche User-Einstellungen nicht, bzw. wollen suchen im Standardpfad. Dafür ist die Symlink Methode besser.&lt;br /&gt;
 &lt;br /&gt;
=== Variante 2 - Symlink ===&lt;br /&gt;
Hinweis: Vielleicht ist es hier Sinnvoll nur die Dokumente zu verschieben. Auf diese Weise bleiben die Library Daten im schnellen Zugriff auf der SSD?&lt;br /&gt;
&lt;br /&gt;
http://www.macnotes.de/2011/08/31/mac-os-x-benutzerordner-auf-anderes-volume-verschieben/&lt;br /&gt;
&lt;br /&gt;
====  Vorbereitung ====&lt;br /&gt;
* Temporären Admin User anlegen (s.o.)&lt;br /&gt;
* Festplatten sollten finalen Namen haben&lt;br /&gt;
* Mit temporärem Admin anmelden&lt;br /&gt;
==== Benutzerordner verschieben ====&lt;br /&gt;
* Benutzerordner verschieben über Terminal&lt;br /&gt;
 sudo ditto -rsrcFork /Users/Benutzer /Volumes/Daten/Benutzer&lt;br /&gt;
sudo gibt root Rechte, ditto sorgt dafür, daß Metadaten verschoben werden können.&lt;br /&gt;
&lt;br /&gt;
* Original umbenennen / verstecken&lt;br /&gt;
 sudo mv /Users/Benutzer /Users/Benutzer.backup&lt;br /&gt;
&lt;br /&gt;
* Symlink erzeugen&lt;br /&gt;
 sudo ln -s /Volumes/Daten/Benutzer /Users/Benutzer&lt;br /&gt;
&lt;br /&gt;
* Prüfen ob alles stimmt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rechnername:~ testadmin$ ls -l /Users&lt;br /&gt;
total 10&lt;br /&gt;
drwxrwxrwt 5 root wheel 170 23 Aug 17:54 Shared&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 testadmin&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 Benutzer.backup&lt;br /&gt;
lrwxr-xr-x 1 root admin 21 23 Aug 16:10 Benutzer -&amp;gt; /Volumes/Daten/Benutzer&lt;br /&gt;
rechnername:~ testadmin$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Temporären Account wieder löschen&lt;br /&gt;
&lt;br /&gt;
==== Einzelne Ordner verschieben ====&lt;br /&gt;
Dafür sind die Schritte mit ditto, mv und ln für alle Ordner zu wiederholen, die weg sollen. Zu beachten ist, dass die Ordner für “Musik”, “Filme”, “Bilder” usw. auf englisch sind – wer nachschauen möchte, wie sie im Original heißen, gibt im Terminal ein:&lt;br /&gt;
&lt;br /&gt;
 ls -l /Users/Benutzer/&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
=== Screenshots erstellen ===&lt;br /&gt;
&lt;br /&gt;
 Command-Shift-3 -&amp;gt; Desktop Foto&lt;br /&gt;
 Command-Shift-4 -&amp;gt; Bereich auswählen und fotografieren&lt;br /&gt;
 Command-Shift-4 danach Space -&amp;gt; App Window fotografieren&lt;br /&gt;
 + Control -&amp;gt; speichert das Foto in einem beliebigen Ordner&lt;br /&gt;
&lt;br /&gt;
Außerdem ist die App &amp;#039;&amp;#039;&amp;#039;Bildschirmfoto&amp;#039;&amp;#039;&amp;#039; (Grab) mit an Bord&lt;br /&gt;
&lt;br /&gt;
=== Dictionary ===&lt;br /&gt;
Cursor über Text und Command + Control + D&lt;br /&gt;
&lt;br /&gt;
== Sonderzeichen ==&lt;br /&gt;
In den meisten Menüs kann man sie über Bearbeiten -&amp;gt; Sonderzeichen aufrufen. Shortcut ctrl+cmd + Leertaste.&lt;br /&gt;
&lt;br /&gt;
Viele sind über Alt+Key zu erreichen z.B. die Tilde über Alt+N&lt;br /&gt;
&lt;br /&gt;
== Nützliche Shortcuts ==&lt;br /&gt;
Grundsätzlich viel was auf Windows mit STRG + Taste geht, geht auf dem Mac mit Apfel (CMD) + Taste&lt;br /&gt;
&lt;br /&gt;
 Command + Shift + V to paste text without formatting.&lt;br /&gt;
 Command + Entfernen -&amp;gt; Löschen statt Papierkorb&lt;br /&gt;
 Command + Option + Control + 8 -&amp;gt; Invertierte Farben&lt;br /&gt;
&lt;br /&gt;
== Prozesse und System ==&lt;br /&gt;
=== Energy Management ===&lt;br /&gt;
[[Mac - Hibernation statt Standby]]&lt;br /&gt;
=== Schnell mal Speicher frei machen wenn der Rechner langsam wird===&lt;br /&gt;
&lt;br /&gt;
Terminal eingeben:&lt;br /&gt;
 purge&lt;br /&gt;
=== Schnell zwischen Audiodevices umschalten ===&lt;br /&gt;
Option + Klick auf Lautsprechersymbol&lt;br /&gt;
&lt;br /&gt;
=== Lautstärke und Helligkeit ===&lt;br /&gt;
FineTuning&lt;br /&gt;
 Shift + Alt + Lautstärke/Helligkeit&lt;br /&gt;
Kein Restart Sound&lt;br /&gt;
 Beim Restart Mute Knopf drücken&lt;br /&gt;
Kein Geräusch beim Lautstärke verändern&lt;br /&gt;
 + Shift&lt;br /&gt;
&lt;br /&gt;
== Finder Tricks ==&lt;br /&gt;
=== Library Ordner anzeigen ===&lt;br /&gt;
 Gehe zu &amp;gt; Alt Taste&lt;br /&gt;
&lt;br /&gt;
oder im Finder&lt;br /&gt;
 cmd - j&lt;br /&gt;
&lt;br /&gt;
oder dauerhaft anzeigen mit Terminal&lt;br /&gt;
 chflags nohidden ~/Library/&lt;br /&gt;
verstecke ihn wieder mit&lt;br /&gt;
 chflags hidden ~/Library/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firefox und Thunderbird Benutzerprofile wieder herstellen ====&lt;br /&gt;
https://support.mozilla.org/de/kb/benutzerprofile-mit-ihren-persoenlichen-daten#w_wie-finde-ich-mein-profil&lt;br /&gt;
&lt;br /&gt;
https://support.mozilla.org/de/kb/Benutzerprofile-Thunderbird#w_wo-wird-mein-profil-gespeichert&lt;br /&gt;
&lt;br /&gt;
Firefox Profil im Mac liegt in:&lt;br /&gt;
 Library &amp;gt; Application Support &amp;gt; Firefox &amp;gt; Profiles&lt;br /&gt;
&lt;br /&gt;
Thunderbird:&lt;br /&gt;
 Library &amp;gt; Thunderbird &amp;gt; Profiles&lt;br /&gt;
&lt;br /&gt;
Tipp den versteckten Ordner Library kann man sehen wenn man im Finder auf Gehe zu geht und dann die alt Taste drückt.&lt;br /&gt;
&lt;br /&gt;
Man kann Profile einfach verschieben. Das Profil sollte nachher den gleichen Namen haben wir vorher, damit Firefox es übernimmt. Im Zweifel Ordner umbenennen.&lt;br /&gt;
&lt;br /&gt;
== Programme ==&lt;br /&gt;
=== Mac Mail ===&lt;br /&gt;
[[Mac Mail - E-Mail Programm]]&lt;br /&gt;
=== Shortcuts ===&lt;br /&gt;
http://www.hcs.harvard.edu/~jrus/Site/System%20Bindings.html&lt;br /&gt;
&lt;br /&gt;
=== Einstellungen und Konfiguration von Programmen auf dem Mac ===&lt;br /&gt;
Es gibt eine Reihe von Orten in denen Programme ihre Einstellungen hinterlegen, bzw beziehen.&lt;br /&gt;
# Systemeinstellungen (Systemeinstellungen &amp;gt; Keyboard) Standardkeybindings sind z.B. hier hinterlegt: &amp;#039;&amp;#039;/System/‍Library/‍Frameworks/‍AppKit.framework/‍Resources/‍StandardKeyBinding.dict&amp;#039;&amp;#039;). Man kann sie auch überschreiben im obigen Fall legt man dann eine Datei hier an: &amp;#039;&amp;#039;~/Library/‍KeyBindings/‍DefaultKeyBinding.dict&amp;#039;&amp;#039;.&lt;br /&gt;
# Programmordner (z.B.: &amp;#039;&amp;#039;/path/‍to/‍TextMate.app/‍Contents/‍Resources/‍&amp;#039;&amp;#039;)&lt;br /&gt;
# User Ordner (z.b.: &amp;#039;&amp;#039;~/Library/‍Application Support/‍TextMate&amp;#039;&amp;#039; )&lt;br /&gt;
In vielen Fällen kann man Einstellungen aus dem Programmordner kopieren und im User Ordner die Datei abändern. Die Einstellungen dort haben dann Vorrang.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel Shortcuts von Textmate ====&lt;br /&gt;
Default ist in&lt;br /&gt;
 /path/‍to/‍TextMate.app/‍Contents/‍Resources/‍KeyBindings.dict&lt;br /&gt;
Und kann man hierhin kopieren und ändern:&lt;br /&gt;
 ~/Library/‍Application Support/‍TextMate/KeyBindings.dict&lt;br /&gt;
&lt;br /&gt;
== Autostart von Programmen auf dem Mac ==&lt;br /&gt;
# Checken ob das Programm selbst eine &amp;#039;&amp;#039;Option zum Einstellen&amp;#039;&amp;#039; hat&lt;br /&gt;
# &amp;#039;&amp;#039;Einstellungen &amp;gt; Benutzer und Gruppen &amp;gt; MeinBenutzer &amp;gt; Anmeldeobjekte &amp;#039;&amp;#039;Alles was hier drin ist wird automatisch gestartet. Ausblenden bedeutet, dass das Programm zwar gestartet, aber nicht im Vordergrund angezeigt wird.&lt;br /&gt;
# &amp;#039;&amp;#039;/Library/LaunchDaemons&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;LaunchAgents&amp;#039;&amp;#039; &lt;br /&gt;
[[Mac - Autostart]]&lt;br /&gt;
=== Firefox ===&lt;br /&gt;
==== Firefox Lesezeichen wieder herstellen ====&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
== Bedienung verbessern ==&lt;br /&gt;
=== Mauszeiger beschleunigen ===&lt;br /&gt;
Selbst mit der schnellsten Einstellung in den Einstellungen ist die Maus noch recht langsam. Im Terminal kann man die Beschleunigung (wahrscheinlich auf Kosten der Genauigkeit) verstärken.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Befehl zum Anzeigen der aktuellen Maus-Geschwindigkeit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 defaults read -g com.apple.mouse.scaling&lt;br /&gt;
Selbst mit maximaler Beschleunigung der Zeigerbewegung zeigte OS X 10.6 bei einer Apple Magic Mouse nur einen Wert von “3” an. Um die Mouse zu beschleunigen, kann man diesen Wert aber auch selber eingeben.&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Befehl zum Setzen der Maus-Geschwindigkeit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 defaults write -g com.apple.mouse.scaling 10&lt;br /&gt;
Der Wert am Ende ist die gewünschte Maus-Geschwindigkeit, hier “10”. Wir empfehlen dazu verschiedene Werte nacheinander zu testen – am Ende war der Wert “20” für uns eine gute Wahl – das ist aber von Maus-Benutzer zu Maus-Benutzer unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
Achtung: Die Änderung wird meistens erst nach dem Mac-Neustart wirklich deutlich bemerkbar!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gefunden bei http://www.computerhilfen.de&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Hanna_Code_(Module)&amp;diff=25348</id>
		<title>ProcessWire - Hanna Code (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Hanna_Code_(Module)&amp;diff=25348"/>
		<updated>2021-05-21T08:14:50Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TextformatterHannaCode&lt;br /&gt;
&lt;br /&gt;
Easily insert any complex HTML, Javascript or PHP output in your ProcessWire content by creating your own Hanna code tags.&lt;br /&gt;
 https://github.com/ryancramerdesign/ProcessHannaCode#using-hanna-code-from-the-api&lt;br /&gt;
&lt;br /&gt;
== Hanna Code Snippets ==&lt;br /&gt;
=== Image from RepeaterMatrix or Repeater ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// include a image from the parent page&lt;br /&gt;
if (!function_exists(&amp;#039;getImagePage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
    function getImagePage($myPage, $level=1){&lt;br /&gt;
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
        $maxLevel=5;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
           &lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
            &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$imagePage = getImagePage($page);&lt;br /&gt;
$images = $imagePage-&amp;gt;images;&lt;br /&gt;
$imgTag = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
if($images){&lt;br /&gt;
    if(isset($file)){&lt;br /&gt;
        isset($width) ? $image =  $images-&amp;gt;get($file)-&amp;gt;width($width) : $image = $images-&amp;gt;get($file);&lt;br /&gt;
        $imgTag .= &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039;&amp;quot;; &lt;br /&gt;
        if(isset($width)) $imgTag .= &amp;quot; width=&amp;#039;$width&amp;#039;&amp;quot;;&lt;br /&gt;
        if(isset($class)) $imgTag .= &amp;quot; class=&amp;#039;$class&amp;#039;&amp;quot;;&lt;br /&gt;
        if(isset($style)) $imgTag .= &amp;quot; style=&amp;#039;$style&amp;#039;&amp;quot;;&lt;br /&gt;
        $imgTag .= &amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
        $out = $imgTag;&lt;br /&gt;
    }else{&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Gib einen Bildnamen an z.B.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        foreach($images as $image){&lt;br /&gt;
            $out .= &amp;#039;&amp;lt;p&amp;gt;[[image file=&amp;quot;&amp;#039;.$image-&amp;gt;name.&amp;#039;&amp;quot;]]&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}else{&lt;br /&gt;
   $out .= &amp;#039;&amp;lt;p&amp;gt;Keine Bilder auf der Seite gefunden&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Templates ===&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 echo(urls()-&amp;gt;templates);&lt;br /&gt;
&lt;br /&gt;
=== Video ===&lt;br /&gt;
Von chargercube - todo security / video field statt dateifeld&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// include a image from the parent page&lt;br /&gt;
if (!function_exists(&amp;#039;getImagePage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
    function getImagePage($myPage, $level=1){&lt;br /&gt;
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
        $maxLevel=5;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
           &lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
            &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$imagePage = getImagePage($page);&lt;br /&gt;
//var_dump($imagePage-&amp;gt;name);&lt;br /&gt;
$files = $imagePage-&amp;gt;files;&lt;br /&gt;
$videoTag = &amp;#039;&amp;#039;;&lt;br /&gt;
$videoValid = false;&lt;br /&gt;
$styles = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
if($files){&lt;br /&gt;
    if(isset($file)){&lt;br /&gt;
        $file = $files-&amp;gt;get($file); // we need the file object not the file name&lt;br /&gt;
        if(isset($width)) $styles = &amp;#039;width: &amp;#039;.$width.&amp;#039;; max-width: 100%; height: auto;&amp;#039;; &lt;br /&gt;
        else $styles = &amp;#039;width: 100%; height: auto;&amp;#039;;&lt;br /&gt;
        if($file){&lt;br /&gt;
            $videoValid = true;&lt;br /&gt;
            $videoTag .= &amp;#039;&lt;br /&gt;
            &amp;lt;video style=&amp;quot;&amp;#039;.$styles.&amp;#039;&amp;quot; preload=&amp;quot;preload&amp;quot; playsinline=&amp;quot;&amp;quot; controls=&amp;quot;&amp;quot; uk-video=&amp;quot;autoplay: false&amp;quot; aria-hidden=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&lt;br /&gt;
                Ihr Browser unterstützt kein Video Tag&lt;br /&gt;
            &amp;lt;/video&amp;gt;&lt;br /&gt;
            &amp;#039;;&lt;br /&gt;
            $out = $videoTag;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(!$videoValid){&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Gib einen Dateinamen an. Dateien auf dieser Seite:.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        foreach($files as $file){&lt;br /&gt;
            $out .= &amp;#039;&amp;lt;p&amp;gt;[[video file=&amp;quot;&amp;#039;.$file-&amp;gt;name.&amp;#039;&amp;quot;]]&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}else{&lt;br /&gt;
   $out .= &amp;#039;&amp;lt;p&amp;gt;Keine Dateie auf der Seite gefunden&amp;lt;/p&amp;gt;&amp;#039;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Heading ===&lt;br /&gt;
Genbänkle&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
 tag=h2&lt;br /&gt;
 heading&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo($heading);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Events ===&lt;br /&gt;
Genbänkle&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$today = strtotime(date(&amp;#039;Y-m-d&amp;#039;));&lt;br /&gt;
$eventPage = $pages-&amp;gt;get(&amp;#039;/termine/&amp;#039;);&lt;br /&gt;
$mySelector = &amp;quot;template=event,limit=2,sort=event_date,event_date&amp;gt;=$today&amp;quot;;&lt;br /&gt;
$events = $pages-&amp;gt;find($mySelector);&lt;br /&gt;
$eventListMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
foreach($events as $event){&lt;br /&gt;
    $eventListMarkup .= &amp;#039;&amp;lt;div class=&amp;quot;date uk-text-muted&amp;quot;&amp;gt;&amp;#039;.$event-&amp;gt;event_date.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    $eventListMarkup .= &amp;#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$event-&amp;gt;url().&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$event-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;#039;;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $eventListMarkup;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Childnavigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
($attr[&amp;#039;parent&amp;#039;]) ? $parent = $pages-&amp;gt;get($attr[&amp;#039;parent&amp;#039;]) : $parent = $page;&lt;br /&gt;
$children = $parent-&amp;gt;children();&lt;br /&gt;
$out .= &amp;#039;&amp;lt;ul class=&amp;quot;childnav&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($children as $child){&lt;br /&gt;
    $out .= &amp;#039;&amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;#039;.$child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;. $child-&amp;gt;title . &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_MotionPathPlugin&amp;diff=25346</id>
		<title>GSAP - MotionPathPlugin</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_MotionPathPlugin&amp;diff=25346"/>
		<updated>2021-05-17T06:16:13Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: Die Seite wurde neu angelegt: „Zum Animieren von Objekten entlang eines Pfades.  == Helper == === Ankerpunkte auf Progress Werte umrechnen === Benötigt man wenn man bestimmte Punkte anfahre…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zum Animieren von Objekten entlang eines Pfades.&lt;br /&gt;
&lt;br /&gt;
== Helper ==&lt;br /&gt;
=== Ankerpunkte auf Progress Werte umrechnen ===&lt;br /&gt;
Benötigt man wenn man bestimmte Punkte anfahren möchte.&lt;br /&gt;
https://greensock.com/docs/v3/HelperFunctions#anchorsToProgress&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Snippets&amp;diff=25345</id>
		<title>GSAP - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Snippets&amp;diff=25345"/>
		<updated>2021-05-17T06:14:19Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
 https://greensock.com/cheatsheet/&lt;br /&gt;
 https://greensock.com/get-started&lt;br /&gt;
 https://codepen.io/GreenSock/&lt;br /&gt;
 https://css-tricks.com/writing-smarter-animation-code/ *****&lt;br /&gt;
 https://greensock.com/forums/topic/17401-multiple-timelinemax-oncomplete-function-help/&lt;br /&gt;
Cool Stuff&lt;br /&gt;
 https://greensock.com/forums/topic/18128-svg-stroke-dasharray-quick-tip/&lt;br /&gt;
Read On&lt;br /&gt;
 https://greensock.com/forums/topic/22793-how-to-work-with-new-labels-object-in-gsap-3/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einfache Animationen ==&lt;br /&gt;
&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300}); // Dies nennt sich eine Timeline. 300px nach rechts bewegen in 2s mit Standardwerten (ease out...)&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300, backgroundColor: &amp;quot;#c2c4c8&amp;quot;}); // CSS Eigenschaften die normal ein - haben, werden als Camelcase geschrieben.&lt;br /&gt;
// Eigenschaften mit Zeichen in Anführungsstrichen. Fast alles lässt sich Animieren.&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300, backgroundColor: &amp;quot;#c2c4c8&amp;quot;, borderRadius: &amp;quot;50%&amp;quot;, border: &amp;quot;4px solid white&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
=== Ease In Out ===&lt;br /&gt;
&lt;br /&gt;
 https://greensock.com/docs/v3/Eases&lt;br /&gt;
 gsap.to(&amp;quot;.logo&amp;quot;, {duration: 1, x:300, ease: &amp;quot;power2.inOut&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
Ease Möglichkeiten&lt;br /&gt;
&lt;br /&gt;
 //OLD ==&amp;gt; NEW&lt;br /&gt;
 Elastic.easeOut ==&amp;gt; &amp;quot;elastic.out&amp;quot; //or just &amp;quot;elastic&amp;quot; because &amp;quot;.out&amp;quot; is the default flavor&lt;br /&gt;
 Elastic.easeIn ==&amp;gt; &amp;quot;elastic.in&amp;quot;&lt;br /&gt;
 Elastic.easeInOut ==&amp;gt; &amp;quot;elastic.inOut&amp;quot;&lt;br /&gt;
 Elastic.easeOut.config(1, 0.5) ==&amp;gt; &amp;quot;elastic.out(1, 0.5)&amp;quot; //or just &amp;quot;elastic(1, 0.5)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 //and the other configurable eases are much easier!:&lt;br /&gt;
 SteppedEase.config(5) ==&amp;gt; &amp;quot;steps(5)&amp;quot;&lt;br /&gt;
 SlowMo.ease.config(0.5, 0.8) ==&amp;gt; &amp;quot;slow(0.5, 0.8)&amp;quot;&lt;br /&gt;
 RoughEase.ease.config({points:40}) ==&amp;gt; &amp;quot;rough(40)&amp;quot;&lt;br /&gt;
 ExpoScaleEase.config(0.5, 3) ==&amp;gt; &amp;quot;expoScale(0.5, 3)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
  x:&amp;quot;+=100&amp;quot;,&lt;br /&gt;
  duration:1,&lt;br /&gt;
  stagger: 0.5 //simple stagger of 0.5 seconds&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//or get advanced:&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
  x:&amp;quot;+=100&amp;quot;,&lt;br /&gt;
  duration:1,&lt;br /&gt;
  stagger: {&lt;br /&gt;
    amount:2,&lt;br /&gt;
    from:&amp;quot;center&amp;quot;,&lt;br /&gt;
    grid:&amp;quot;auto&amp;quot;,&lt;br /&gt;
    onComplete: myFunction //define callbacks inside the stagger to make them apply to each sub-tween&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relative position prefix ==&lt;br /&gt;
Relative “&amp;gt;” and “&amp;lt;” position prefix&lt;br /&gt;
This feature helps with positioning animations in a timeline. It puts a tween relative to the previous tween’s start or end time and removes the need to add labels through your code.&lt;br /&gt;
&lt;br /&gt;
gsap.method(&amp;#039;selector&amp;#039;,{}, &amp;quot;&amp;lt;&amp;quot; ) //Inserts a tween at the start of the previous tween&lt;br /&gt;
&lt;br /&gt;
gsap.method(&amp;#039;selector&amp;#039;,{}, &amp;quot;&amp;gt;&amp;quot; ) //Inserts a tween at the end of the previous&lt;br /&gt;
&lt;br /&gt;
== Keyframes ==&lt;br /&gt;
&lt;br /&gt;
Anstatt mehrerer Tweens kann man auch mehrere TweenProperties als keyframes kombinieren und hat weniger Tipparbeit.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {keyframes: [ //&amp;lt;-- an array of keyframes!&lt;br /&gt;
  {x:100, duration:1},&lt;br /&gt;
  {y:200, duration:1, delay:0.5}, //create a 0.5 second gap&lt;br /&gt;
  {rotation:360, duration:2, delay:-0.25} //overlap by 0.25 seconds&lt;br /&gt;
]});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timelines ==&lt;br /&gt;
=== Reset Timeline ===&lt;br /&gt;
 If you want to set the values to the original position set in the animation you can move the the playhead&amp;#039;s position before you kill it:&lt;br /&gt;
&lt;br /&gt;
 tl.pause(0).kill(true);&lt;br /&gt;
 ScrollTrigger.getById(&amp;quot;trigger1&amp;quot;).kill(true); // you have to do a extra kill for ScrollTrigger if used&lt;br /&gt;
&lt;br /&gt;
If you want to remove all inline styles you can use clearProps:&lt;br /&gt;
&lt;br /&gt;
 tl.kill(true);&lt;br /&gt;
 ScrollTrigger.getById(&amp;quot;trigger1&amp;quot;).kill(true);&lt;br /&gt;
 gsap.set(&amp;quot;#element&amp;quot;, {clearProps: true});&lt;br /&gt;
&lt;br /&gt;
=== Globale Timeline kontrollieren (timeScale)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gsap.globalTimeline.timeScale(0.1); //slow everything down&lt;br /&gt;
gsap.globalTimeline.pause(); //stop everything, though you might want to use gsap.exportRoot() instead so that you can exclude delayedCalls()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rotation ==&lt;br /&gt;
=== Richtung der Rotation ===&lt;br /&gt;
 rotation:&amp;quot;270_short&amp;quot; //animates in the shortest direction!&lt;br /&gt;
 rotation:&amp;quot;270_cw&amp;quot;    //animates clockwise&lt;br /&gt;
 rotation:&amp;quot;270_ccw&amp;quot;   //animates counter-clockwise&lt;br /&gt;
&lt;br /&gt;
== Scroll To ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&amp;quot;button&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
  gsap.to(window, { duration: 0.75, scrollTo: &amp;quot;.target&amp;quot; });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GSAP Scroll Trigger ==&lt;br /&gt;
Update: Die beste Möglichkeit ist mit dem neuen ScrollTrigger Plugin.&lt;br /&gt;
 [[GSAP - ScrollTrigger]]&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Good Practice and Time Savers ==&lt;br /&gt;
=== Timeline schneller abspielen ===&lt;br /&gt;
 tl.timeScale(3).repeat(2);&lt;br /&gt;
=== Bestimmten Teil abspielen ===&lt;br /&gt;
 tl.play(&amp;quot;myLabel&amp;quot;);&lt;br /&gt;
wobei die Labels so definiert werden:&lt;br /&gt;
 .addLabel(&amp;quot;out3&amp;quot;);&lt;br /&gt;
oder&lt;br /&gt;
 .to(&amp;quot;#myElement&amp;quot;,{duration:1, rotation:90}, &amp;quot;in3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Geeignet für gleiche Animation auf mehreren Elementen hintereinander. Dabei übergeben wir in einer Schleife ein DOM Element und erstellen in einer anonymen Funktion den Tween.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;.fade-in&amp;quot;).each(function(){&lt;br /&gt;
  var tween = gsap.from($(this), {duration: 0.5, scale: 0.7, y: &amp;#039;+=30&amp;#039;, ease: Linear.easeNone });&lt;br /&gt;
  // possible with ScrollMagic&lt;br /&gt;
  var scene = new ScrollMagic.Scene({&lt;br /&gt;
    triggerElement: this,&lt;br /&gt;
  })&lt;br /&gt;
    .setTween(tween);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Werte ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.timeline({defaults:{ease:&amp;quot;power2.out&amp;quot;, duration:5}})&lt;br /&gt;
    .to(&amp;quot;.selector1&amp;quot;, {x:200})&lt;br /&gt;
    .to(&amp;quot;.selector2&amp;quot;, {y:500}) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Nesting Timelines ===&lt;br /&gt;
&lt;br /&gt;
=== Functions to create timelines ===&lt;br /&gt;
&lt;br /&gt;
== Responsive Animations &amp;amp; Media Queries==&lt;br /&gt;
 https://greensock.com/forums/topic/18719-how-to-manage-gsap-animation-in-mobile-device/&lt;br /&gt;
 https://greensock.com/forums/topic/18280-truly-responsive-animations/&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
=== MotionPathPlugin ===&lt;br /&gt;
[[GSAP - MotionPathPlugin]]&lt;br /&gt;
=== SVGMorph ===&lt;br /&gt;
 gsap.to(&amp;quot;#circle&amp;quot;, {duration: 1, morphSVG:&amp;quot;#hippo&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
== ScrollTrigger ==&lt;br /&gt;
[[GSAP - ScrollTrigger]]&lt;br /&gt;
&lt;br /&gt;
 https://codepen.io/noeldelgado/pen/BaogqYy&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Array erstellen um Animation auf viele Elemente anzuwenden&lt;br /&gt;
    var panels = gsap.utils.toArray(&amp;quot;.panel&amp;quot;);&lt;br /&gt;
    let container = document.querySelector(&amp;#039;.scroll-container&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    tl = gsap.timeline();&lt;br /&gt;
    tl.to(panels, { //each panel&lt;br /&gt;
        xPercent: -100 * (panels.length -1), // move complete width i.e. -500%&lt;br /&gt;
        scrollTrigger: {&lt;br /&gt;
            trigger: &amp;quot;.scroll-container&amp;quot;,&lt;br /&gt;
            pin: true,&lt;br /&gt;
            markers: true,&lt;br /&gt;
            end: () =&amp;gt; &amp;quot;+=&amp;quot; + document.querySelector(&amp;quot;.scroll-container&amp;quot;).offsetWidth,&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
// ODER&lt;br /&gt;
&lt;br /&gt;
panels.forEach((panel, i) =&amp;gt; {&lt;br /&gt;
    gsap.to(panel, {&lt;br /&gt;
        //...&lt;br /&gt;
    }&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Helpers ==&lt;br /&gt;
=== gsap loader ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.registerPlugin(ScrollTrigger);&lt;br /&gt;
&lt;br /&gt;
const images = gsap.utils.toArray(&amp;#039;img&amp;#039;);&lt;br /&gt;
const loader = document.querySelector(&amp;#039;.loader--text&amp;#039;);&lt;br /&gt;
const updateProgress = (instance) =&amp;gt; &lt;br /&gt;
  loader.textContent = `${Math.round(instance.progressedCount * 100 / images.length)}%`;&lt;br /&gt;
&lt;br /&gt;
const showDemo = () =&amp;gt; {&lt;br /&gt;
  document.body.style.overflow = &amp;#039;auto&amp;#039;;&lt;br /&gt;
  document.scrollingElement.scrollTo(0, 0);&lt;br /&gt;
  gsap.to(document.querySelector(&amp;#039;.loader&amp;#039;), { autoAlpha: 0 });&lt;br /&gt;
  // do some cool stuff&lt;br /&gt;
  gsap.utils.toArray(&amp;#039;section&amp;#039;).forEach((section, index) =&amp;gt; {&lt;br /&gt;
    const w = section.querySelector(&amp;#039;.wrapper&amp;#039;);&lt;br /&gt;
    const [x, xEnd] = (index % 2) ? [&amp;#039;100%&amp;#039;, (w.scrollWidth - section.offsetWidth) * -1] : [w.scrollWidth * -1, 0];&lt;br /&gt;
    gsap.fromTo(w, {  x  }, {&lt;br /&gt;
      x: xEnd,&lt;br /&gt;
      scrollTrigger: { &lt;br /&gt;
        trigger: section, &lt;br /&gt;
        scrub: 0.5 &lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
// check how much is loaded&lt;br /&gt;
imagesLoaded(images).on(&amp;#039;progress&amp;#039;, updateProgress).on(&amp;#039;always&amp;#039;, showDemo);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25343</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25343"/>
		<updated>2021-05-12T10:03:55Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Flexible Funktion zum erzeugen von Tree oder Listen Navigationen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Flexible Funktion zum erzeugen von Tree oder Listen Navigationen ===&lt;br /&gt;
* ul-Liste oder nur li&lt;br /&gt;
* Rendertiefe einstellbar&lt;br /&gt;
* Page Objekt von dem Kinder gerendert werden oder PageArray&lt;br /&gt;
* Filter (Selector) für Kindobjekte. &lt;br /&gt;
* Root voranstellen oder auch nicht (z.B. für Homepage)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Rendert eine Navi. Kindseiten wenn eine Page übergeben wird. &lt;br /&gt;
 * Alle Seiten inkl. Kinder wenn ein PageArray übergeben wird.&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
function nav($items,$options = array()){&lt;br /&gt;
	static $depth = 0;&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;ul&amp;#039; =&amp;gt; true, // wrap in &amp;lt;ul&amp;gt; or not&lt;br /&gt;
		&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // class for ul&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 1, // render depth&lt;br /&gt;
		&amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // filters child elements&lt;br /&gt;
		&amp;#039;prependRoot&amp;#039; =&amp;gt; false // if you provide a Page (i.e. home), prepend as menu item&lt;br /&gt;
	);&lt;br /&gt;
	$options = array_merge($defaults, $options);&lt;br /&gt;
	$page = $items-&amp;gt;wire(&amp;#039;page&amp;#039;); // current page&lt;br /&gt;
	$class = $depth ? &amp;quot;nav-sub&amp;quot; : rtrim(&amp;quot;nav $options[class]&amp;quot;);&lt;br /&gt;
	$attr = rtrim(&amp;quot;class=&amp;#039;$class&amp;#039;&amp;quot;);&lt;br /&gt;
	$out = $options[&amp;#039;ul&amp;#039;] ? &amp;quot;&amp;lt;ul $attr&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
	// if given a Page use children as the items and use Page as the header&lt;br /&gt;
	// if given a page array use each Page as the items&lt;br /&gt;
	if($items instanceof Page) {&lt;br /&gt;
		//$header = $items;&lt;br /&gt;
		if($options[&amp;#039;prependRoot&amp;#039;]) $out .= &amp;quot;&amp;lt;li class=&amp;#039;root&amp;#039;&amp;gt; &amp;lt;a href=&amp;#039;$items-&amp;gt;url&amp;#039;&amp;gt;$items-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
		$items = $items-&amp;gt;children($options[&amp;#039;selector&amp;#039;]);&lt;br /&gt;
	}&lt;br /&gt;
	if(!$items-&amp;gt;count) return &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	foreach($items as $n =&amp;gt; $item) {&lt;br /&gt;
		$isParent = $options[&amp;#039;depth&amp;#039;] &amp;amp;&amp;amp; $item-&amp;gt;hasChildren &amp;amp;&amp;amp; $depth &amp;lt; $options[&amp;#039;depth&amp;#039;];&lt;br /&gt;
		$classes = array();&lt;br /&gt;
&lt;br /&gt;
		// determine additional classes&lt;br /&gt;
		if($item-&amp;gt;id == $page-&amp;gt;id) $classes[] = &amp;#039;active&amp;#039;;&lt;br /&gt;
		if($isParent) $classes[] = &amp;#039;parent&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// open the list item&lt;br /&gt;
		$out .= count($classes) ? &amp;quot;&amp;lt;li class=&amp;#039;&amp;quot; . implode(&amp;#039; &amp;#039;, $classes) . &amp;quot;&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		// see if we are working with a nested list and go recursive if so&lt;br /&gt;
		if($isParent) {&lt;br /&gt;
			$depth++;&lt;br /&gt;
			$children = $item-&amp;gt;children($options[&amp;#039;selector&amp;#039;]);&lt;br /&gt;
			$out .= nav($children, array(&lt;br /&gt;
				&amp;#039;depth&amp;#039; =&amp;gt; $options[&amp;#039;depth&amp;#039;],&lt;br /&gt;
				&amp;#039;selector&amp;#039; =&amp;gt; $options[&amp;#039;selector&amp;#039;]&lt;br /&gt;
			));&lt;br /&gt;
			$depth--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;ul&amp;#039;]) $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25342</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25342"/>
		<updated>2021-05-12T09:50:00Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Weitere Menübeispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Flexible Funktion zum erzeugen von Tree oder Listen Navigationen ===&lt;br /&gt;
* ul-Liste oder nur li&lt;br /&gt;
* Rendertiefe einstellbar&lt;br /&gt;
* Page Objekt von dem Kinder gerendert werden oder PageArray&lt;br /&gt;
* Filter (Selector) für Kindobjekte. &lt;br /&gt;
* Root voranstellen oder auch nicht (z.B. für Homepage)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Rendert eine Navi. Kindseiten wenn eine Page übergeben wird. &lt;br /&gt;
 * Alle Seiten inkl. Kinder wenn ein PageArray übergeben wird.&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
function nav($items,$options = array()){&lt;br /&gt;
	static $depth = 0;&lt;br /&gt;
	$defaults = array(&lt;br /&gt;
		&amp;#039;ul&amp;#039; =&amp;gt; true, // wrap in &amp;lt;ul&amp;gt; or not&lt;br /&gt;
		&amp;#039;class&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // class for ul&lt;br /&gt;
		&amp;#039;depth&amp;#039; =&amp;gt; 1, // render depth&lt;br /&gt;
		&amp;#039;selector&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // filters child elements&lt;br /&gt;
		&amp;#039;prependRoot&amp;#039; =&amp;gt; false // if you provide a Page (i.e. home), prepend as menu item&lt;br /&gt;
	);&lt;br /&gt;
	$options = array_merge($defaults, $options);&lt;br /&gt;
	$page = $items-&amp;gt;wire(&amp;#039;page&amp;#039;); // current page&lt;br /&gt;
	$class = $depth ? &amp;quot;nav-sub&amp;quot; : rtrim(&amp;quot;nav $options[class]&amp;quot;);&lt;br /&gt;
	$attr = rtrim(&amp;quot;class=&amp;#039;$class&amp;#039;&amp;quot;);&lt;br /&gt;
	$out = $options[&amp;#039;ul&amp;#039;] ? &amp;quot;&amp;lt;ul $attr&amp;gt;&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
	// if given a Page use children as the items and use Page as the header&lt;br /&gt;
	// if given a page array use each Page as the items&lt;br /&gt;
	if($items instanceof Page) {&lt;br /&gt;
		//$header = $items;&lt;br /&gt;
		$items = $items-&amp;gt;children($options[&amp;#039;selector&amp;#039;]);&lt;br /&gt;
	}&lt;br /&gt;
	if(!$items-&amp;gt;count) return &amp;#039;&amp;#039;;&lt;br /&gt;
	// CYCLE&lt;br /&gt;
	foreach($items as $n =&amp;gt; $item) {&lt;br /&gt;
		$isParent = $options[&amp;#039;depth&amp;#039;] &amp;amp;&amp;amp; $item-&amp;gt;hasChildren &amp;amp;&amp;amp; $depth &amp;lt; $options[&amp;#039;depth&amp;#039;];&lt;br /&gt;
		$classes = array();&lt;br /&gt;
&lt;br /&gt;
		// determine additional classes&lt;br /&gt;
		if($item-&amp;gt;id == $page-&amp;gt;id) $classes[] = &amp;#039;active&amp;#039;;&lt;br /&gt;
		if($isParent) $classes[] = &amp;#039;parent&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// open the list item&lt;br /&gt;
		$out .= count($classes) ? &amp;quot;&amp;lt;li class=&amp;#039;&amp;quot; . implode(&amp;#039; &amp;#039;, $classes) . &amp;quot;&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
		// see if we are working with a nested list and go recursive if so&lt;br /&gt;
		if($isParent) {&lt;br /&gt;
			$depth++;&lt;br /&gt;
			$out .= nav($item-&amp;gt;children, array(&lt;br /&gt;
				&amp;#039;depth&amp;#039; =&amp;gt; $options[&amp;#039;depth&amp;#039;],&lt;br /&gt;
				&amp;#039;selector&amp;#039; =&amp;gt; $options[&amp;#039;selector&amp;#039;]&lt;br /&gt;
			));&lt;br /&gt;
			$depth--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;ul&amp;#039;]) $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25341</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25341"/>
		<updated>2021-05-12T07:38:20Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Basic Navigation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25340</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25340"/>
		<updated>2021-05-12T07:37:07Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Child Menu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25339</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=25339"/>
		<updated>2021-05-12T07:31:13Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Zweispaltige Navigation aus Kindseiten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TODO Seite aufräumen ==&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[Processwire Module: MarkupSimpleNavigation]] automatisch Navigation aus Seitenbaum erstellen&lt;br /&gt;
 [[Aligator (ProcessWire)]] - automatische Navigation, gut wenn manipuliert werden muss.&lt;br /&gt;
 [[Menu Builder (ProcessWire)]] - Menüs im Backend erstellen (Wordpress like)&lt;br /&gt;
&lt;br /&gt;
== Navigation in Pagewire - Einführung ==&lt;br /&gt;
=== Navigationstypen allgemein ===&lt;br /&gt;
Es gibt verschiedene &amp;#039;&amp;#039;&amp;#039;Typen von Navigationen&amp;#039;&amp;#039;&amp;#039;. In Processwire hat man ein &amp;#039;&amp;#039;&amp;#039;Pages Objekt&amp;#039;&amp;#039;&amp;#039;, indem auch Zugriff auf Kind- und Elternseiten möglich sind. Es bildet also immer die Sitestruktur ab. Daher übergibt man an die unten aufgeführten Funktionen entweder die Homepage oder die aktuelle Seite.&lt;br /&gt;
&lt;br /&gt;
Unter dem Aspekt auf welcher Seite man sich befindet kann man unterscheiden zwischen:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;absolute Navigation&amp;#039;&amp;#039;&amp;#039; normalerweise ausgehend von der Rootseite. diese ist dann auf allen Seiten gleich.&lt;br /&gt;
** z.B. alle Seiten des ersten Levels stehen in der Hauptnavigation egal auf welcher Seite ich im Moment bin&lt;br /&gt;
** z.B. verschachtelte Liste mit 2 oder mehr Leveln für Dropdown Navigationen wie Superfish, Megamenüs (mit zusätzlichen Infos...) oder Bootstrap Navigationen.&lt;br /&gt;
** Sitemap&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Navigation relativ zur Seite&amp;#039;&amp;#039;&amp;#039; Diese kann sich von Seite zu Seite unterscheiden.&lt;br /&gt;
** Alle &amp;#039;&amp;#039;&amp;#039;Seiten der aktuellen Ebene&amp;#039;&amp;#039;&amp;#039; (oft kombiniert mit Breadcrumb / Hier-bin-ich) ) &lt;br /&gt;
** Hauptebene &amp;#039;&amp;#039;&amp;#039;und&amp;#039;&amp;#039;&amp;#039; aktueller Level&lt;br /&gt;
** Alle Ebenen &amp;#039;&amp;#039;&amp;#039;bis zur aktuellen Seite + deren Unterseiten&amp;#039;&amp;#039;&amp;#039; falls vorhanden. &lt;br /&gt;
In letzten Fall könnte man auch Varianten bauen in denen eine Verschachtelte Liste erzeugt wird aber nur bestimmte Teile absolut Positioniert angezeigt werden und andere versteckt werden. Manchmal möchte man bestimmte Level aber auch an anderer Position zeigen (z.B. Sidebar)&lt;br /&gt;
In der Praxis hat man in der Regel&lt;br /&gt;
* Mindestens eine Hauptnavigation mit allen Seiten der 1. Ebene oder eine Hauptnavigation mit mehreren Ebenen für Dropdown Navigationen, mobile Navigation oder auch Sitemapartige Navigationen für den Footer (oft mit kleinen Beschreibungen).&lt;br /&gt;
* Eine Metanavigation mit Service Seiten wie Kontakt, Impressum etc. oft ist diese im Footer.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede zwischen Verstecken, Veröffentlichen, Sperren ===&lt;br /&gt;
In Processwire sind diese Begriffe mit Userrechten verknüpft. Eine unveröffentlichte Seite kann also durchaus im Frontend aufgerufen werden (es sei denn man regelt das anders.) Vielmehr geht es darum das man User Rollen so gestalten kann, dass man z.B. einem User nur erlaubt unveröffentlichte Seiten zu editieren.&lt;br /&gt;
&lt;br /&gt;
Denoch gibt es auch ein paar weitere Unterschiede.&lt;br /&gt;
&lt;br /&gt;
Gesperrt -&amp;gt; Man kann die Seite nicht zum Editieren aufrufen. Über die Url kann Sie aufgerufen werden.&lt;br /&gt;
&lt;br /&gt;
Unpublished -&amp;gt; Die Seite kann sobald sie gespeichert ist auch aufgerufen werden, WENN der User berechtigt ist. Nicht für Guest User (der normale Viewer)&lt;br /&gt;
&lt;br /&gt;
TODO checken ob die Tabelle so für nicht angemeldete User stimmt.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Im Menü ($pages-&amp;gt;find) !! Über URL erreichbar($pages-&amp;gt;get) !! Ausgabe im Frontend !! &lt;br /&gt;
|-&lt;br /&gt;
| Unpublished / Unveröffentlicht || Nein || Nur User mit passenden Rechten. Gäste -&amp;gt; leere Seite ||&lt;br /&gt;
|-&lt;br /&gt;
| Hidden / Versteckt || Nein || Ja || Ja - leere Seite (keine Feldausgabe)&lt;br /&gt;
|-&lt;br /&gt;
| Locked / Gesperrt || Ja || Ja  || Ja&lt;br /&gt;
|-&lt;br /&gt;
| Trash || Nein || Nein ||&lt;br /&gt;
|}&lt;br /&gt;
==== Seiten auf unveröffentlicht stellen ====&lt;br /&gt;
https://processwire.com/talk/topic/29-how-to-unpublish-a-page-without-deleting-it/&lt;br /&gt;
&lt;br /&gt;
Was soll man tun wenn man eine Seite tatsächlich nicht mehr anzeigen will, sie aber noch nicht wegwerfen will?&lt;br /&gt;
Ryan schlägt folgendes vor:&lt;br /&gt;
* Mülleimer&lt;br /&gt;
* Remove Guest Role in Template&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Basic Navigation ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
Now you have a PageArray with the required items, you can iterate over them one at a time, and print the title of the page and the link to the page itself and wrap the whole thing in your list tag.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Basic mit active Class ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get the homepage object&lt;br /&gt;
  $homePage = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
  // get PageArray of homepage object and child page objects&lt;br /&gt;
  $navItems = $homePage-&amp;gt;and($homePage-&amp;gt;children);&lt;br /&gt;
  // or if you don&amp;#039;t want the home link&lt;br /&gt;
  // $navItems = $homePage-&amp;gt;children;&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($navItems as $navItem):&lt;br /&gt;
&lt;br /&gt;
// if the id of the page currently being&lt;br /&gt;
// iterated equals the id of the current page&lt;br /&gt;
$activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $navItem-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $navItem-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Child Menu ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul class=&amp;quot;sub-menu&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // get children of the parent of the current page&lt;br /&gt;
  $childPages = $page-&amp;gt;parent-&amp;gt;children;&lt;br /&gt;
&lt;br /&gt;
  // iterate over the $navItems PageArray&lt;br /&gt;
  foreach ($childPages as $childPage):&lt;br /&gt;
&lt;br /&gt;
  // if the id of the page currently being&lt;br /&gt;
  // iterated equals the id of the current page&lt;br /&gt;
  $activeClass = ($navItem-&amp;gt;id == $page-&amp;gt;id) ? &amp;quot; active&amp;quot; : &amp;quot;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;nav-link&amp;lt;?php echo $activeClass; ?&amp;gt;&amp;quot; href=&amp;quot;&amp;lt;?php echo $childPage-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;?php echo $childPage-&amp;gt;title; ?&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;?php endforeach; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Level ===&lt;br /&gt;
In which level in page tree we are?&lt;br /&gt;
 $level = count($page-&amp;gt;parents);&lt;br /&gt;
&lt;br /&gt;
=== Link to Subpage und Platzhalter (Spacer) ===&lt;br /&gt;
Kann man gut für Superfish Menüs etc. benutzen. Bildet das Verhalten von Shortcuts und Spacern aus TYPO3 nach.&lt;br /&gt;
&lt;br /&gt;
Anpassung der renderNavTree() Funktion von Ryan Cramer. Options Field Installieren und als globales Feld &amp;quot;navigation_type&amp;quot; mit den Optionen &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=normal|Normal&lt;br /&gt;
2=doNotLink|Do not link&lt;br /&gt;
3=linkToFirstChild|Link to first childpage&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
konfigurieren. Dann Funktion etwa so anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect (301) ===&lt;br /&gt;
==== Redirect zu erster Unterseite ====&lt;br /&gt;
https://processwire.com/talk/topic/15-how-do-i-create-a-page-that-redirects-to-its-first-child/&lt;br /&gt;
&lt;br /&gt;
Field &amp;#039;&amp;#039;redirects_to_first_child&amp;#039;&amp;#039; erstellen und im Template einfügen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;redirects_to_first_child) &lt;br /&gt;
  $session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url); &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erzeugt 301 Weiterleitung&lt;br /&gt;
&lt;br /&gt;
Anderer Ansatz wäre evtl. den Link bei der Menügenerierung direkt zu generieren. finde ich persönlich besser siehe &amp;#039;&amp;#039;Link to subpage und Platzhalter&amp;#039;&amp;#039; Beispiel. Allerdings sollte man dann vielleicht die Seite trotzdem per 301 Weiterleiten, falls die URL mal direkt aufgerufen wird oder bei Google gelistet ist.&lt;br /&gt;
&lt;br /&gt;
==== Redirect zu anderer Seite in der Navigation ====&lt;br /&gt;
https://processwire.com/talk/topic/762-howto-menu-item-that-links-to-another-page/&lt;br /&gt;
&lt;br /&gt;
1. Create a new field and call it &amp;#039;redirect_url&amp;#039; or something like that, and use the &amp;#039;URL&amp;#039; fieldtype. &lt;br /&gt;
&lt;br /&gt;
2. Add that field to your template where you&amp;#039;d want to use it, or create a new template just for the purpose, like a template named &amp;#039;redirect&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
3. Edit the page that you want to be a symlink and populate the &amp;#039;redirect_url&amp;#039; field with the URL you want it to redirect to.&lt;br /&gt;
&lt;br /&gt;
4. In your nav-generation code that links to the pages, do something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$url = $subpage-&amp;gt;get(&amp;quot;redirect_url|url&amp;quot;); // use redirect_url if there, otherwise use url&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$url&amp;#039;&amp;gt;{$subpage-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
5. You might also want to add this to your template that has the &amp;#039;redirect_url&amp;#039; field: just in case there&amp;#039;s anything linking to it directly. That way it&amp;#039;ll send people to the right place either way:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 if($page-&amp;gt;redirect_url) $session-&amp;gt;redirect($page-&amp;gt;redirect_url); &lt;br /&gt;
&lt;br /&gt;
=== Breadcrumb ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- breadcrumbs --&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;breadcrumbs&amp;#039;&amp;gt;&amp;lt;?php &lt;br /&gt;
		// breadcrumbs are the current page&amp;#039;s parents&lt;br /&gt;
		foreach($page-&amp;gt;parents() as $item) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;span&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
		}&lt;br /&gt;
		// optionally output the current page as the last item&lt;br /&gt;
		echo &amp;quot;&amp;lt;span&amp;gt;$page-&amp;gt;title&amp;lt;/span&amp;gt; &amp;quot;; &lt;br /&gt;
	?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== One Level Navigation Bar ===&lt;br /&gt;
[[ProcessWire - One Level Navigation]]&lt;br /&gt;
=== Nächste Seite / Next Page Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;ajax-link&amp;quot; name=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $page-&amp;gt;next-&amp;gt;url .&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;. $page-&amp;gt;next-&amp;gt;title .&amp;#039;&amp;lt;span class=&amp;quot;fa fa-arrow-right&amp;quot;&amp;gt;&amp;lt;span&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel 2 (mit zurück zur Elternseite)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$next = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
  $next = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;next-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-right&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$prev = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;prev-&amp;gt;id){&lt;br /&gt;
  $prev = &amp;#039;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;prev-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;w-inline-block paginaton-but&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-angle-left&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$pagination = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;container pagination&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$prev.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;i class=&amp;quot;fa fa-th&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col col-md-4&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;align-right center&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;#039;.$next.&amp;#039;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
echo $pagination;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zurück zur Elternseite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$page-&amp;gt;parent()-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;zurück&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kindseiten mit $page-&amp;gt;children ===&lt;br /&gt;
 &amp;lt;?=$page-&amp;gt;children?&amp;gt;&lt;br /&gt;
Output&lt;br /&gt;
 5723,4958,5937&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($page-&amp;gt;children as $child)&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$child-&amp;gt;url}&amp;#039;&amp;gt;{$child-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/contact/&amp;#039;&amp;gt;Contact Us&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/press/&amp;#039;&amp;gt;Press Releases&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;/about/staff/&amp;#039;&amp;gt;Our Staff&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Children Tree ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function listChildrenTree($children, $current, $w) {&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($children as $page) {&lt;br /&gt;
&lt;br /&gt;
	$class = &amp;#039;&amp;#039;;&lt;br /&gt;
	if($page === $current || $current-&amp;gt;parents-&amp;gt;slice(1)-&amp;gt;has($page) ) {&lt;br /&gt;
		$class = &amp;quot;class=&amp;#039;on&amp;#039; style=&amp;#039;font-weight:bold&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$rootid = $w-&amp;gt;pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$page-&amp;gt;url}&amp;#039; $class&amp;gt;&amp;quot;;&lt;br /&gt;
	if($page-&amp;gt;id == $rootid) echo &amp;quot;&amp;lt;img src=&amp;#039;&amp;quot; . $w-&amp;gt;config-&amp;gt;urls-&amp;gt;templates . &amp;quot;styles/images/home.png&amp;#039; width=&amp;#039;24&amp;#039; height=&amp;#039;28&amp;#039; alt=&amp;#039;&amp;#039; /&amp;gt;&amp;quot;;&lt;br /&gt;
	echo &amp;quot;{$page-&amp;gt;title}&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if($page-&amp;gt;numChildren &amp;amp;&amp;amp; $page-&amp;gt;id != $rootid) listChildrenTree($page-&amp;gt;children, $current, $w);&lt;br /&gt;
&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$children = $pages-&amp;gt;get(&amp;quot;/&amp;quot;)-&amp;gt;children();&lt;br /&gt;
$children-&amp;gt;prepend($pages-&amp;gt;get(&amp;quot;/&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
listChildrenTree($children, $page, $wire);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bootstrap Navigation ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// Markup to use wicht navigation_type field (normal=1, no-link=2,subpage=3)&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// bundle up the first level pages and prepend the root home page&lt;br /&gt;
$homepage = $pages-&amp;gt;get(1);&lt;br /&gt;
$pa = $homepage-&amp;gt;children;&lt;br /&gt;
$pa = $pa-&amp;gt;prepend($homepage);&lt;br /&gt;
&lt;br /&gt;
// Set the ball rolling...&lt;br /&gt;
$myMenu = renderChildrenOf($pa);&lt;br /&gt;
$wrapper = &amp;#039;&lt;br /&gt;
&amp;lt;nav class=&amp;quot;navbar navbar-default&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;navbar-header&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;navbar-toggle collapsed&amp;quot; data-toggle=&amp;quot;collapse&amp;quot; data-target=&amp;quot;#navbar-collapse-1&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;sr-only&amp;quot;&amp;gt;Menü&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;span class=&amp;quot;icon-bar&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;collapse navbar-collapse&amp;quot; id=&amp;quot;navbar-collapse-1&amp;quot;&amp;gt;&lt;br /&gt;
      |&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
$myMenu = wrap($myMenu,$wrapper);&lt;br /&gt;
echo $myMenu;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Navigation for ProcessWire using the Bootstrap 2.2.2 markup&lt;br /&gt;
This menu was written by Soma based on work by NetCarver and a bit thrown in by Joss&lt;br /&gt;
Bootstrap 3 update by Damienov, with multi level dropdown support fix&lt;br /&gt;
*/&lt;br /&gt;
function renderChildrenOf($pa, $output = &amp;#039;&amp;#039;, $level = 0)&lt;br /&gt;
{&lt;br /&gt;
    $output = &amp;#039;&amp;#039;;&lt;br /&gt;
    $level++;&lt;br /&gt;
&lt;br /&gt;
    foreach ($pa as $child) {&lt;br /&gt;
        $atoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1 ) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-submenu&amp;#039;;&lt;br /&gt;
            $atoggle .= &amp;#039; class=&amp;quot;dropdown-toggle&amp;quot;&amp;#039;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $class .= &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Makes the current page and it&amp;#039;s top level parent add an active class&lt;br /&gt;
        $class .= ($child === wire(&amp;quot;page&amp;quot;) || $child === wire(&amp;quot;page&amp;quot;)-&amp;gt;rootParent) ? &amp;quot; active&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
        $class = strlen($class) ? &amp;quot; class=&amp;#039;&amp;quot; . trim($class) . &amp;quot;&amp;#039;&amp;quot; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) == 1) {&lt;br /&gt;
            // Add Caret if have children&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title &amp;lt;b class=&amp;#039;caret&amp;#039;&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; count($child-&amp;gt;parents) &amp;gt; 1) {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a tabindex=&amp;#039;-1&amp;#039; href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        } else {&lt;br /&gt;
            $output .= &amp;quot;&amp;lt;li$class&amp;gt;&amp;lt;a href=&amp;#039;$child-&amp;gt;url&amp;#039;$atoggle&amp;gt;$child-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If this child is itself a parent and not the root page, then render it&amp;#039;s children in their own menu too...&lt;br /&gt;
        if ($child-&amp;gt;numChildren &amp;amp;&amp;amp; $child-&amp;gt;id != 1) {&lt;br /&gt;
            $output .= renderChildrenOf($child-&amp;gt;children, $output, $level);&lt;br /&gt;
        }&lt;br /&gt;
        $output .= &amp;#039;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    $outerclass = ($level == 1) ? &amp;quot;nav navbar-nav&amp;quot; : &amp;#039;dropdown-menu&amp;#039;;&lt;br /&gt;
    return &amp;quot;&amp;lt;ul class=&amp;#039;$outerclass&amp;#039;&amp;gt;$output&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modul: MarkupSimpleNavigation==&lt;br /&gt;
[[Processwire Modul - MarkupSimpleNavigation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Menübeispiele ==&lt;br /&gt;
=== Standard Tree Navigation ===&lt;br /&gt;
Für viele Zwecke ausreichend und leicht anpassbar, die klassische verschachtelte Liste.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Menüauswahl Hauptmenü / Metamenü / Footer-Navigation ===&lt;br /&gt;
Beispiel 1&lt;br /&gt;
Backend Feld menus anlegen Options: &lt;br /&gt;
&lt;br /&gt;
 1=Main Menu&lt;br /&gt;
 2=Meta Menu &lt;br /&gt;
&lt;br /&gt;
topnav.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pa = $homepage-&amp;gt;and($homepage-&amp;gt;children(&amp;quot;menus.id=1&amp;quot;));//only if main menu is checked&lt;br /&gt;
$options = array(&amp;#039;level&amp;#039; =&amp;gt; &amp;#039;1&amp;#039;, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;sf-menu&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;);&lt;br /&gt;
echo &amp;quot;&amp;lt;div&amp;gt;&amp;quot;.renderNavTreeType($pa, $maxDepth = 1, $fieldNames = &amp;#039;&amp;#039;, $options).&amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2 (älter)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Checkbox anlegen (footer_nav), und dann das Seitenarray etwa so modifizieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$footer_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox=1&amp;quot;);&lt;br /&gt;
$main_nav = $pages-&amp;gt;find(&amp;quot;parent=1, footer_checkbox!=1&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zweispaltige Navigation aus Kindseiten ===&lt;br /&gt;
Verbesserungsvorschlag: Anstatt if lieber zwei for Schleifen -&amp;gt; bessere Performance&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Childrens&lt;br /&gt;
$n = count($page-&amp;gt;children);&lt;br /&gt;
$m = ceil($n/2);&lt;br /&gt;
$c = 0;&lt;br /&gt;
&lt;br /&gt;
// NAVIGATION &amp;amp; SLIDER Items&lt;br /&gt;
$listItem = &amp;#039;&amp;#039;;&lt;br /&gt;
$navList = &amp;#039;&amp;#039;;&lt;br /&gt;
$col1 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$col2 = &amp;#039;&amp;lt;ul class=&amp;quot;nav-list col2&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($page-&amp;gt;children as $item) {&lt;br /&gt;
	if($item-&amp;gt;id == $page-&amp;gt;rootParent-&amp;gt;id) {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$listItem = &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$listItem .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	($c &amp;lt; $m) ? $col1 .= $listItem : $col2 .= $listItem;&lt;br /&gt;
	$c++;&lt;br /&gt;
}&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$col1 .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
$navList = $col1.$col2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mehrspaltige Navigationen lassen sich auch mit der slice Funktion erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$categories = $pages-&amp;gt;get(&amp;#039;/about/sites/categories/&amp;#039;)-&amp;gt;children();&lt;br /&gt;
foreach($categories-&amp;gt;slices(3) as $items) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;div class=&amp;#039;uk-width-1-3&amp;#039;&amp;gt;&amp;lt;ul&amp;gt;&amp;quot;;&lt;br /&gt;
  echo $items-&amp;gt;each(&amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{url}&amp;#039;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;quot;);&lt;br /&gt;
  echo &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pushy Menu ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 * Assumes there is a field navigation_type to decide how a list item is&lt;br /&gt;
 * rendered&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param array $options extra options for classes configuration etc.&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderPushyMenu($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    //if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) {&lt;br /&gt;
      // BUTTON instead of Link&lt;br /&gt;
      $out .= &amp;#039;&amp;lt;li class=&amp;quot;pushy-submenu&amp;quot;&amp;gt;&amp;lt;button&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/button&amp;gt;&amp;#039;;&lt;br /&gt;
		}else{&lt;br /&gt;
      $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
  		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
      unset($classes);&lt;br /&gt;
&lt;br /&gt;
  		// A ITEM&lt;br /&gt;
  		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
  		$classes = $liClasses;&lt;br /&gt;
  		switch ( $navigation_type ) {&lt;br /&gt;
  			case 2: // do not link&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  			case 3: // link to subpage&lt;br /&gt;
  				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
  					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				}else{&lt;br /&gt;
  					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
  				}&lt;br /&gt;
  				break;&lt;br /&gt;
  			default:&lt;br /&gt;
  				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
  				break;&lt;br /&gt;
  		}&lt;br /&gt;
  		unset($classes);&lt;br /&gt;
		}&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do not link / link to subpage ==&lt;br /&gt;
=== MarkupSimpleNavigation XTemplate + Redirect Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://github.com/s...default-options&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Menü Platzhalter&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;xtemplate&amp;quot; =&amp;gt; &amp;quot;folder|placeholder&amp;quot;, // specify one or more templates&lt;br /&gt;
&amp;quot;xitem_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;, // default markup for page with this template&lt;br /&gt;
&amp;quot;xitem_current_tpl&amp;quot; =&amp;gt; &amp;quot;&amp;lt;span&amp;gt;{title}&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
echo $nav-&amp;gt;render(array(&lt;br /&gt;
   &amp;#039;max_levels&amp;#039;=&amp;gt;2,&lt;br /&gt;
   &amp;#039;selector&amp;#039;=&amp;gt;&amp;quot;limit=10&amp;quot;,&lt;br /&gt;
   &amp;#039;xtemplates&amp;#039; =&amp;gt; &amp;#039;placeholder|folder&amp;#039;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Redirect Template&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
You could also have a template &amp;quot;redirect&amp;quot; with only a title and a page field (single page) to select any page you want to go.&lt;br /&gt;
&lt;br /&gt;
Then in the code you should be able to write&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
array(&amp;#039;item_tpl&amp;#039; =&amp;gt; &amp;#039;&amp;lt;a href=&amp;quot;{redirect_page|url}&amp;quot;&amp;gt;{title}&amp;lt;/a&amp;gt;&amp;#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So it would take the url of the referenced page in the page field if found, or if not it takes the url of the page itself. Assuming the page field is named &amp;quot;redirect_page&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== In der Navi ===&lt;br /&gt;
Zusätzliches Feld (Options) im Backend mit Namen navigation_type&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 * If there is a field navigation_type the vals have following meaning&lt;br /&gt;
 * 1 = Normal&lt;br /&gt;
 * 2 = Do not link&lt;br /&gt;
 * 3 = Link to subpage&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTreeType($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $options = array(&amp;#039;level&amp;#039; =&amp;gt; 0, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;nav&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;aClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;) ) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
  $c = 0;&lt;br /&gt;
  $liClasses = array();&lt;br /&gt;
  $ulClasses = array();&lt;br /&gt;
	$level = 0;&lt;br /&gt;
	$liClass = &amp;#039;&amp;#039;;&lt;br /&gt;
	$ulClass = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;level&amp;#039;])) $level = $options[&amp;#039;level&amp;#039;];&lt;br /&gt;
	if(!empty($options[&amp;#039;ulClass&amp;#039;])) {&lt;br /&gt;
		$ulClasses[] = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
		$ulClass = $options[&amp;#039;ulClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!empty($options[&amp;#039;liClass&amp;#039;])) {&lt;br /&gt;
		$liClasses[] = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
		$liClass = $options[&amp;#039;liClass&amp;#039;];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
    //$level = count($page-&amp;gt;parents);&lt;br /&gt;
		// LI ITEM&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
    if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) $classes[] = &amp;#039;cur&amp;#039;;&lt;br /&gt;
		if($item-&amp;gt;hasChildren) $classes[] = &amp;#039;has_children&amp;#039;;&lt;br /&gt;
    $classes[] = &amp;#039;level-&amp;#039;.$level;&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode($classes,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    unset($classes);&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$navigation_type = $item-&amp;gt;navigation_type-&amp;gt;id;&lt;br /&gt;
		$classes = $liClasses;&lt;br /&gt;
		switch ( $navigation_type ) {&lt;br /&gt;
			case 2: // do not link&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;span class=&amp;quot;spacer&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
			case 3: // link to subpage&lt;br /&gt;
				if( $item-&amp;gt;hasChildren() ){&lt;br /&gt;
					$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;child-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				}else{&lt;br /&gt;
					$out .= &amp;quot;&amp;lt;span class=&amp;#039;spacer&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				$out .= &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot; class=&amp;quot;ajax-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
		unset($classes);&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			//if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$nextLevelOptions = array(&amp;#039;level&amp;#039; =&amp;gt; $level+1, &amp;#039;ulClass&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;liClass&amp;#039; =&amp;gt; $liClass);&lt;br /&gt;
			$out .= renderNavTreeType($item-&amp;gt;children, $maxDepth-1, $fieldNames, $nextLevelOptions);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	if($out) $out = &amp;quot;\n&amp;quot;.&amp;#039;&amp;lt;ul class=&amp;quot;&amp;#039;.implode($ulClasses,&amp;#039; &amp;#039;).&amp;#039;&amp;quot;&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;.$out.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redirect über das Template ===&lt;br /&gt;
Sinnvoll wenn die URL direkt aufgerufen wird:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;redirect_page-&amp;gt;url);&lt;br /&gt;
or how about &amp;quot;redirect-to-firstchild&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;redirect($page-&amp;gt;children-&amp;gt;first()-&amp;gt;url);&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Funktionen (z.B. in _func.php)==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiele für Funktionen die Navigationen erzeugen. &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
=== One Level ===&lt;br /&gt;
==== Original ProcessWire Demo Beispiel ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Nested List ausgehend von einer Seite (meistens Homepage) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages, render a ONE LEVEL NAVBAR&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavMain($pa,$pageId){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;nav class=&amp;quot;menu menu--ferdinand&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;nav navbar-nav menu__list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item) {&lt;br /&gt;
     if($item-&amp;gt;id == $pageId) {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item menu__item--current cur\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     } else {&lt;br /&gt;
       $out .= &amp;quot;&amp;lt;li class=\&amp;quot;menu__item\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
     // if template isotope-parent add first isotope-child name as hash&lt;br /&gt;
     if($item-&amp;gt;template-&amp;gt;name == &amp;#039;isotope-parent&amp;#039;){&lt;br /&gt;
       $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;#&amp;#039;.$item-&amp;gt;child-&amp;gt;name.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
     }else $out .= &amp;#039;&amp;lt;a class=&amp;quot;menu__link&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
     $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/nav&amp;gt;&amp;quot;;&lt;br /&gt;
     return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Given a group of pages render a standard ISOTOP MARKUP&lt;br /&gt;
  *&lt;br /&gt;
  * @param array|PageArray $items&lt;br /&gt;
  * @return string&lt;br /&gt;
  *&lt;br /&gt;
  */&lt;br /&gt;
 function renderNavIsotope($pa){&lt;br /&gt;
   if($pa instanceof Page) $pa = array($pa);&lt;br /&gt;
   $out = &amp;#039;&amp;lt;ul class=&amp;quot;submenu&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
   foreach($pa as $item){&lt;br /&gt;
     $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;#039;.$item-&amp;gt;name.&amp;#039;&amp;quot; class=&amp;quot;isotope-link&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
   }&lt;br /&gt;
   $out .= &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
   return $out;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a simple &amp;lt;ul&amp;gt; navigation&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a simple shared function.&lt;br /&gt;
 * Usage is completely optional.&lt;br /&gt;
 *&lt;br /&gt;
 * @param PageArray $items&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNav(PageArray $items) {&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// render markup for each navigation item as an &amp;lt;li&amp;gt;&lt;br /&gt;
		if($item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id) {&lt;br /&gt;
			// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			// otherwise just a regular list item&lt;br /&gt;
			$out .= &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if the item has summary text, include that too&lt;br /&gt;
		if($item-&amp;gt;summary) $out .= &amp;quot;&amp;lt;div class=&amp;#039;summary&amp;#039;&amp;gt;$item-&amp;gt;summary&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;nav&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Given a group of pages, render a &amp;lt;ul&amp;gt; navigation tree&lt;br /&gt;
 *&lt;br /&gt;
 * This is here to demonstrate an example of a more intermediate level&lt;br /&gt;
 * shared function and usage is completely optional. This is very similar to&lt;br /&gt;
 * the renderNav() function above except that it can output more than one&lt;br /&gt;
 * level of navigation (recursively) and can include other fields in the output.&lt;br /&gt;
 *&lt;br /&gt;
 * @param array|PageArray $items&lt;br /&gt;
 * @param int $maxDepth How many levels of navigation below current should it go?&lt;br /&gt;
 * @param string $fieldNames Any extra field names to display (separate multiple fields with a space)&lt;br /&gt;
 * @param string $class CSS class name for containing &amp;lt;ul&amp;gt;&lt;br /&gt;
 * @return string&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
function renderNavTree($items, $maxDepth = 0, $fieldNames = &amp;#039;&amp;#039;, $class = &amp;#039;nav&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
	// if we were given a single Page rather than a group of them, we&amp;#039;ll pretend they&lt;br /&gt;
	// gave us a group of them (a group/array of 1)&lt;br /&gt;
	if($items instanceof Page) $items = array($items);&lt;br /&gt;
&lt;br /&gt;
	// $out is where we store the markup we are creating in this function&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// cycle through all the items&lt;br /&gt;
	foreach($items as $item) {&lt;br /&gt;
&lt;br /&gt;
		// markup for the list item...&lt;br /&gt;
		// if current item is the same as the page being viewed, add a &amp;quot;current&amp;quot; class to it&lt;br /&gt;
		$out .= $item-&amp;gt;id == wire(&amp;#039;page&amp;#039;)-&amp;gt;id ? &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot; : &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// markup for the link&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		// if there are extra field names specified, render markup for each one in a &amp;lt;div&amp;gt;&lt;br /&gt;
		// having a class name the same as the field name&lt;br /&gt;
		if($fieldNames) foreach(explode(&amp;#039; &amp;#039;, $fieldNames) as $fieldName) {&lt;br /&gt;
			$value = $item-&amp;gt;get($fieldName);&lt;br /&gt;
			if($value) $out .= &amp;quot; &amp;lt;div class=&amp;#039;$fieldName&amp;#039;&amp;gt;$value&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if the item has children and we&amp;#039;re allowed to output tree navigation (maxDepth)&lt;br /&gt;
		// then call this same function again for the item&amp;#039;s children&lt;br /&gt;
		if($item-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth) {&lt;br /&gt;
			if($class == &amp;#039;nav&amp;#039;) $class = &amp;#039;nav nav-tree&amp;#039;;&lt;br /&gt;
			$out .= renderNavTree($item-&amp;gt;children, $maxDepth-1, $fieldNames, $class);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// close the list item&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// if output was generated above, wrap it in a &amp;lt;ul&amp;gt;&lt;br /&gt;
	if($out) $out = &amp;quot;&amp;lt;ul class=&amp;#039;$class&amp;#039;&amp;gt;$out&amp;lt;/ul&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	// return the markup we generated above&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplette Beispiele ==&lt;br /&gt;
[[ProcessWire - Navigation Beispiele]]&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25338</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25338"/>
		<updated>2021-05-11T10:48:05Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
MatchMedia verwaltet bei Resize Events auch die Timelines, killt diese wenn nötig oder erzeugt neue. Das erleichtert unglaublich viel Arbeit.&lt;br /&gt;
&lt;br /&gt;
Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Timeline Animation erstellen&lt;br /&gt;
* ScrollTrigger Konfiguration in Timeline aufsetzen&lt;br /&gt;
* MatchMedia erstellen und Timeline Animation einsetzen.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei MediaQueries umschließt MatchMedia die Animation. Genauer gesagt man übergibt in der MatchMedia Funktion alles was in diesem Query ausgeführt werden soll. MatchMedia überwacht aber auch Veränderungen und setzt alle Animationen zurück, wenn der Query nicht mehr passt. Timelines etc. werden also wieder gekillt und der Urzustand wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
=== MatchMedia aufsetzen ===&lt;br /&gt;
Im Konfigurationsobjekt von MatchMedia übergeben wir als Schlüssel der das MediaQuery enthält. Als Wert übergeben wie eine Funktion. In dieser Funktion werden alle Timelines / Animationen gesetzt die für das Query gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ScrollTrigger.matchMedia({&lt;br /&gt;
  &amp;quot;(minWidth: 800px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for 800px and up go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;(maxWidth: 799px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for smaller screens than 799px go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;all&amp;quot;: function(){&lt;br /&gt;
    // animations valid for all viewport sizes go here&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit Inline Styles und mediaQuery beheben - ScrollTrigger.saveStyles() ===&lt;br /&gt;
Manchmal kommt es vor, dass eine &amp;#039;&amp;#039;&amp;#039;Animation einen Inline Style setzt, der ein mediaQuery in CSS &amp;quot;überschreibt&amp;quot;&amp;#039;&amp;#039;&amp;#039;. Wenn man dieses Verhalten nicht möchte und lieber den &amp;#039;&amp;#039;&amp;#039;Zustand beim Laden der Seite herstellen&amp;#039;&amp;#039;&amp;#039; möchte kann man die Funktion saveStyles nutzen. Mit saveStyles kann man vor der Animation den Zustand von DOM-Objekten speichern. GSAP setzt diese dann wieder zurück wenn der MatchMedia Zweig nicht mehr zutrifft.&lt;br /&gt;
 ScrollTrigger.saveStyles(&amp;#039;.myElement, .myOtherElement);&lt;br /&gt;
&lt;br /&gt;
== Beispiele Tipps etc. ==&lt;br /&gt;
=== Horizontal Scroll ===&lt;br /&gt;
 https://codepen.io/GreenSock/pen/896549f0a83297debd9111fe9b205a97&lt;br /&gt;
&lt;br /&gt;
Mit Tablet Swipe:&lt;br /&gt;
 https://greensock.com/forums/topic/28016-horizontal-scroll-with-draggable-syncing-the-two/?tab=comments#comment-138080&lt;br /&gt;
 https://codepen.io/GreenSock/pen/ZELQqeJ?editors=0010&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ScrollMagic&amp;diff=25337</id>
		<title>ScrollMagic</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ScrollMagic&amp;diff=25337"/>
		<updated>2021-05-11T10:46:50Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Plugin zum Steuern von Events und Animationen abhängig von der Scrollposition. Kombiniert mit GSAP Animationen sehr mächtig.&lt;br /&gt;
&lt;br /&gt;
Benötigt man nicht mehr mit [[GSAP - ScrollTrigger]]&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://scrollmagic.io&lt;br /&gt;
 https://scrollmagic.io/docs/&lt;br /&gt;
&lt;br /&gt;
== ScrollMagic und GSAP ==&lt;br /&gt;
Timeline Controlling mit ScrollMagic&lt;br /&gt;
=== ScrollMagic mit GSAP Basics ===&lt;br /&gt;
# GSAP Timeline Animation erstellen&lt;br /&gt;
# MagicScroll Controller erstellen.&lt;br /&gt;
# MagicScroll Szene definieren und GSAP-Timeline an den MagicScroll Tween übergeben (dafür ist das animation.gsap Plugin von MagicScroll notwendig)&lt;br /&gt;
==== ScrollMagic Basisbeispiele ====&lt;br /&gt;
 var controller = new ScrollMagic.Controller();&lt;br /&gt;
Szenen definieren wie und an welcher Stelle der Controller reagieren soll. Der Szene übergibt man Eigenschaften&lt;br /&gt;
&lt;br /&gt;
 var scene = new ScrollMagic.Scene();&lt;br /&gt;
 var scene = new ScrollMagic.Scene({&lt;br /&gt;
   offset: 100, // start scene after scrolling for 100px&lt;br /&gt;
   duration: 400 // pin the element for 400px of scrolling&lt;br /&gt;
 })&lt;br /&gt;
            &lt;br /&gt;
Dann übergibst du die Szene an den Controller. Auch mehrere Szenen (mit Komma getrennt) sind möglich.&lt;br /&gt;
&lt;br /&gt;
 controller.addScene(scene);&lt;br /&gt;
Alternativ kannst du die Szene direkt aus dem Scene Objekt mit der addTo() Funktion zum Controller hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;           &lt;br /&gt;
var scene = new ScrollMagic.Scene({&lt;br /&gt;
    triggerElement: &amp;#039;#trigger1&amp;#039;&lt;br /&gt;
    })&lt;br /&gt;
    .addTo(controller); // Add Scene to ScrollMagic Controller&lt;br /&gt;
    &lt;br /&gt;
    var scene2 = new ScrollMagic.Scene({&lt;br /&gt;
    triggerElement: &amp;#039;#trigger2&amp;#039;&lt;br /&gt;
    })&lt;br /&gt;
    .addTo(controller); // Add Scene to ScrollMagic Controller&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Trigger Animation ====&lt;br /&gt;
Im ersten Fall wird die Animation an einer bestimmten &amp;#039;&amp;#039;&amp;#039;Scroll Position ausgelöst&amp;#039;&amp;#039;&amp;#039;. &amp;#039;&amp;#039;&amp;#039;Die Animation selbst läuft nach dem Start automatisch ab.&amp;#039;&amp;#039;&amp;#039; Folgendermaßen definieren wir die Szene.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; &lt;br /&gt;
// Create a new ScrollMagic Scene &lt;br /&gt;
var scene = new ScrollMagic.Scene({&lt;br /&gt;
    triggerElement: &amp;quot;#trigger1&amp;quot;, &lt;br /&gt;
    duration: 0, // 0 because duration is handled by gsap&lt;br /&gt;
    triggerHook: 0.5, // 0.5 -&amp;gt; trigger position at middle of browser window&lt;br /&gt;
    offset: 0&lt;br /&gt;
})    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;       &lt;br /&gt;
In der ScrollMagic Scene ist die &amp;#039;&amp;#039;&amp;#039;Dauer auf 0 gesetzt&amp;#039;&amp;#039;&amp;#039;. Das bedeutet die Dauer wird von der GSAP Timeline bestimmt.&lt;br /&gt;
&lt;br /&gt;
==== Animation by Scroll ====&lt;br /&gt;
Im zweiten Beispiel soll die Timeline &amp;#039;&amp;#039;&amp;#039;über die Scrollposition gesteuert&amp;#039;&amp;#039;&amp;#039; werden. Das geht ganz einfach indem wir in der ScrollMagic Szene eine &amp;#039;&amp;#039;&amp;#039;Scrolldauer&amp;#039;&amp;#039;&amp;#039; übergeben. Scrolldauer bedeutet ein &amp;#039;&amp;#039;&amp;#039;Zahlenwert der als Pixel interpretiert wird&amp;#039;&amp;#039;&amp;#039;. Oder ein &amp;#039;&amp;#039;&amp;#039;Prozentwert (als String) der für &amp;quot;Prozent der Viewport-Höhe steht&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 duration: &amp;quot;25%&amp;quot;, // 50% means scrolling half window. Number i.e. 300 means while scrolling 300 pixel&lt;br /&gt;
&lt;br /&gt;
==== Pinned Animation ====&lt;br /&gt;
ScrollMagic liefert mit der setPin() Funktion eine einfache Möglichkeit ein Element auf dem Screen zu fixieren, solange die Animation läuft. In diesem Beispiel wurde einfach die Zeile&lt;br /&gt;
&lt;br /&gt;
 .setPin(&amp;quot;#animation2 .animation&amp;quot;) // pin this element&lt;br /&gt;
hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pinned = Expanded Content&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Beachte, dass die Section dieser Animation höher ist, als die der vorigen, obwohl es die gleiche Animation ist. Das liegt daran, dass &amp;#039;&amp;#039;&amp;#039;die angepinnte Animation sich Platz verschafft&amp;#039;&amp;#039;&amp;#039;, indem sie den nachfolgenden Inhalt nach unten verschiebt.&lt;br /&gt;
&lt;br /&gt;
Wenn du das nicht möchtest kannst du der setPin() Funktion die Eigenschaft pushFollowers: false mitgeben.&lt;br /&gt;
&lt;br /&gt;
 scene.setPin(&amp;quot;#pin&amp;quot;, {pushFollowers: false});&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Snippets&amp;diff=25336</id>
		<title>GSAP - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Snippets&amp;diff=25336"/>
		<updated>2021-05-11T10:45:20Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* ScrollTrigger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
 https://greensock.com/cheatsheet/&lt;br /&gt;
 https://greensock.com/get-started&lt;br /&gt;
 https://codepen.io/GreenSock/&lt;br /&gt;
 https://css-tricks.com/writing-smarter-animation-code/ *****&lt;br /&gt;
 https://greensock.com/forums/topic/17401-multiple-timelinemax-oncomplete-function-help/&lt;br /&gt;
Cool Stuff&lt;br /&gt;
 https://greensock.com/forums/topic/18128-svg-stroke-dasharray-quick-tip/&lt;br /&gt;
Read On&lt;br /&gt;
 https://greensock.com/forums/topic/22793-how-to-work-with-new-labels-object-in-gsap-3/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Einfache Animationen ==&lt;br /&gt;
&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300}); // Dies nennt sich eine Timeline. 300px nach rechts bewegen in 2s mit Standardwerten (ease out...)&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300, backgroundColor: &amp;quot;#c2c4c8&amp;quot;}); // CSS Eigenschaften die normal ein - haben, werden als Camelcase geschrieben.&lt;br /&gt;
// Eigenschaften mit Zeichen in Anführungsstrichen. Fast alles lässt sich Animieren.&lt;br /&gt;
gsap.to(&amp;quot;.logo&amp;quot;, {duration: 2, x: 300, backgroundColor: &amp;quot;#c2c4c8&amp;quot;, borderRadius: &amp;quot;50%&amp;quot;, border: &amp;quot;4px solid white&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
=== Ease In Out ===&lt;br /&gt;
&lt;br /&gt;
 https://greensock.com/docs/v3/Eases&lt;br /&gt;
 gsap.to(&amp;quot;.logo&amp;quot;, {duration: 1, x:300, ease: &amp;quot;power2.inOut&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
Ease Möglichkeiten&lt;br /&gt;
&lt;br /&gt;
 //OLD ==&amp;gt; NEW&lt;br /&gt;
 Elastic.easeOut ==&amp;gt; &amp;quot;elastic.out&amp;quot; //or just &amp;quot;elastic&amp;quot; because &amp;quot;.out&amp;quot; is the default flavor&lt;br /&gt;
 Elastic.easeIn ==&amp;gt; &amp;quot;elastic.in&amp;quot;&lt;br /&gt;
 Elastic.easeInOut ==&amp;gt; &amp;quot;elastic.inOut&amp;quot;&lt;br /&gt;
 Elastic.easeOut.config(1, 0.5) ==&amp;gt; &amp;quot;elastic.out(1, 0.5)&amp;quot; //or just &amp;quot;elastic(1, 0.5)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 //and the other configurable eases are much easier!:&lt;br /&gt;
 SteppedEase.config(5) ==&amp;gt; &amp;quot;steps(5)&amp;quot;&lt;br /&gt;
 SlowMo.ease.config(0.5, 0.8) ==&amp;gt; &amp;quot;slow(0.5, 0.8)&amp;quot;&lt;br /&gt;
 RoughEase.ease.config({points:40}) ==&amp;gt; &amp;quot;rough(40)&amp;quot;&lt;br /&gt;
 ExpoScaleEase.config(0.5, 3) ==&amp;gt; &amp;quot;expoScale(0.5, 3)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Staggering ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
  x:&amp;quot;+=100&amp;quot;,&lt;br /&gt;
  duration:1,&lt;br /&gt;
  stagger: 0.5 //simple stagger of 0.5 seconds&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//or get advanced:&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
  x:&amp;quot;+=100&amp;quot;,&lt;br /&gt;
  duration:1,&lt;br /&gt;
  stagger: {&lt;br /&gt;
    amount:2,&lt;br /&gt;
    from:&amp;quot;center&amp;quot;,&lt;br /&gt;
    grid:&amp;quot;auto&amp;quot;,&lt;br /&gt;
    onComplete: myFunction //define callbacks inside the stagger to make them apply to each sub-tween&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Relative position prefix ==&lt;br /&gt;
Relative “&amp;gt;” and “&amp;lt;” position prefix&lt;br /&gt;
This feature helps with positioning animations in a timeline. It puts a tween relative to the previous tween’s start or end time and removes the need to add labels through your code.&lt;br /&gt;
&lt;br /&gt;
gsap.method(&amp;#039;selector&amp;#039;,{}, &amp;quot;&amp;lt;&amp;quot; ) //Inserts a tween at the start of the previous tween&lt;br /&gt;
&lt;br /&gt;
gsap.method(&amp;#039;selector&amp;#039;,{}, &amp;quot;&amp;gt;&amp;quot; ) //Inserts a tween at the end of the previous&lt;br /&gt;
&lt;br /&gt;
== Keyframes ==&lt;br /&gt;
&lt;br /&gt;
Anstatt mehrerer Tweens kann man auch mehrere TweenProperties als keyframes kombinieren und hat weniger Tipparbeit.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.to(&amp;quot;.class&amp;quot;, {keyframes: [ //&amp;lt;-- an array of keyframes!&lt;br /&gt;
  {x:100, duration:1},&lt;br /&gt;
  {y:200, duration:1, delay:0.5}, //create a 0.5 second gap&lt;br /&gt;
  {rotation:360, duration:2, delay:-0.25} //overlap by 0.25 seconds&lt;br /&gt;
]});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Timelines ==&lt;br /&gt;
=== Reset Timeline ===&lt;br /&gt;
 If you want to set the values to the original position set in the animation you can move the the playhead&amp;#039;s position before you kill it:&lt;br /&gt;
&lt;br /&gt;
 tl.pause(0).kill(true);&lt;br /&gt;
 ScrollTrigger.getById(&amp;quot;trigger1&amp;quot;).kill(true); // you have to do a extra kill for ScrollTrigger if used&lt;br /&gt;
&lt;br /&gt;
If you want to remove all inline styles you can use clearProps:&lt;br /&gt;
&lt;br /&gt;
 tl.kill(true);&lt;br /&gt;
 ScrollTrigger.getById(&amp;quot;trigger1&amp;quot;).kill(true);&lt;br /&gt;
 gsap.set(&amp;quot;#element&amp;quot;, {clearProps: true});&lt;br /&gt;
&lt;br /&gt;
=== Globale Timeline kontrollieren (timeScale)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gsap.globalTimeline.timeScale(0.1); //slow everything down&lt;br /&gt;
gsap.globalTimeline.pause(); //stop everything, though you might want to use gsap.exportRoot() instead so that you can exclude delayedCalls()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rotation ==&lt;br /&gt;
=== Richtung der Rotation ===&lt;br /&gt;
 rotation:&amp;quot;270_short&amp;quot; //animates in the shortest direction!&lt;br /&gt;
 rotation:&amp;quot;270_cw&amp;quot;    //animates clockwise&lt;br /&gt;
 rotation:&amp;quot;270_ccw&amp;quot;   //animates counter-clockwise&lt;br /&gt;
&lt;br /&gt;
== Scroll To ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.querySelector(&amp;quot;button&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function() {&lt;br /&gt;
  gsap.to(window, { duration: 0.75, scrollTo: &amp;quot;.target&amp;quot; });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GSAP Scroll Trigger ==&lt;br /&gt;
Update: Die beste Möglichkeit ist mit dem neuen ScrollTrigger Plugin.&lt;br /&gt;
 [[GSAP - ScrollTrigger]]&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Good Practice and Time Savers ==&lt;br /&gt;
=== Timeline schneller abspielen ===&lt;br /&gt;
 tl.timeScale(3).repeat(2);&lt;br /&gt;
=== Bestimmten Teil abspielen ===&lt;br /&gt;
 tl.play(&amp;quot;myLabel&amp;quot;);&lt;br /&gt;
wobei die Labels so definiert werden:&lt;br /&gt;
 .addLabel(&amp;quot;out3&amp;quot;);&lt;br /&gt;
oder&lt;br /&gt;
 .to(&amp;quot;#myElement&amp;quot;,{duration:1, rotation:90}, &amp;quot;in3&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
Geeignet für gleiche Animation auf mehreren Elementen hintereinander. Dabei übergeben wir in einer Schleife ein DOM Element und erstellen in einer anonymen Funktion den Tween.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(&amp;quot;.fade-in&amp;quot;).each(function(){&lt;br /&gt;
  var tween = gsap.from($(this), {duration: 0.5, scale: 0.7, y: &amp;#039;+=30&amp;#039;, ease: Linear.easeNone });&lt;br /&gt;
  // possible with ScrollMagic&lt;br /&gt;
  var scene = new ScrollMagic.Scene({&lt;br /&gt;
    triggerElement: this,&lt;br /&gt;
  })&lt;br /&gt;
    .setTween(tween);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Werte ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.timeline({defaults:{ease:&amp;quot;power2.out&amp;quot;, duration:5}})&lt;br /&gt;
    .to(&amp;quot;.selector1&amp;quot;, {x:200})&lt;br /&gt;
    .to(&amp;quot;.selector2&amp;quot;, {y:500}) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Nesting Timelines ===&lt;br /&gt;
&lt;br /&gt;
=== Functions to create timelines ===&lt;br /&gt;
&lt;br /&gt;
== Responsive Animations &amp;amp; Media Queries==&lt;br /&gt;
 https://greensock.com/forums/topic/18719-how-to-manage-gsap-animation-in-mobile-device/&lt;br /&gt;
 https://greensock.com/forums/topic/18280-truly-responsive-animations/&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
&lt;br /&gt;
== Plugins ==&lt;br /&gt;
=== SVGMorph ===&lt;br /&gt;
 gsap.to(&amp;quot;#circle&amp;quot;, {duration: 1, morphSVG:&amp;quot;#hippo&amp;quot;});&lt;br /&gt;
&lt;br /&gt;
== ScrollTrigger ==&lt;br /&gt;
[[GSAP - ScrollTrigger]]&lt;br /&gt;
&lt;br /&gt;
 https://codepen.io/noeldelgado/pen/BaogqYy&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Array erstellen um Animation auf viele Elemente anzuwenden&lt;br /&gt;
    var panels = gsap.utils.toArray(&amp;quot;.panel&amp;quot;);&lt;br /&gt;
    let container = document.querySelector(&amp;#039;.scroll-container&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    tl = gsap.timeline();&lt;br /&gt;
    tl.to(panels, { //each panel&lt;br /&gt;
        xPercent: -100 * (panels.length -1), // move complete width i.e. -500%&lt;br /&gt;
        scrollTrigger: {&lt;br /&gt;
            trigger: &amp;quot;.scroll-container&amp;quot;,&lt;br /&gt;
            pin: true,&lt;br /&gt;
            markers: true,&lt;br /&gt;
            end: () =&amp;gt; &amp;quot;+=&amp;quot; + document.querySelector(&amp;quot;.scroll-container&amp;quot;).offsetWidth,&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
// ODER&lt;br /&gt;
&lt;br /&gt;
panels.forEach((panel, i) =&amp;gt; {&lt;br /&gt;
    gsap.to(panel, {&lt;br /&gt;
        //...&lt;br /&gt;
    }&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Helpers ==&lt;br /&gt;
=== gsap loader ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.registerPlugin(ScrollTrigger);&lt;br /&gt;
&lt;br /&gt;
const images = gsap.utils.toArray(&amp;#039;img&amp;#039;);&lt;br /&gt;
const loader = document.querySelector(&amp;#039;.loader--text&amp;#039;);&lt;br /&gt;
const updateProgress = (instance) =&amp;gt; &lt;br /&gt;
  loader.textContent = `${Math.round(instance.progressedCount * 100 / images.length)}%`;&lt;br /&gt;
&lt;br /&gt;
const showDemo = () =&amp;gt; {&lt;br /&gt;
  document.body.style.overflow = &amp;#039;auto&amp;#039;;&lt;br /&gt;
  document.scrollingElement.scrollTo(0, 0);&lt;br /&gt;
  gsap.to(document.querySelector(&amp;#039;.loader&amp;#039;), { autoAlpha: 0 });&lt;br /&gt;
  // do some cool stuff&lt;br /&gt;
  gsap.utils.toArray(&amp;#039;section&amp;#039;).forEach((section, index) =&amp;gt; {&lt;br /&gt;
    const w = section.querySelector(&amp;#039;.wrapper&amp;#039;);&lt;br /&gt;
    const [x, xEnd] = (index % 2) ? [&amp;#039;100%&amp;#039;, (w.scrollWidth - section.offsetWidth) * -1] : [w.scrollWidth * -1, 0];&lt;br /&gt;
    gsap.fromTo(w, {  x  }, {&lt;br /&gt;
      x: xEnd,&lt;br /&gt;
      scrollTrigger: { &lt;br /&gt;
        trigger: section, &lt;br /&gt;
        scrub: 0.5 &lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
// check how much is loaded&lt;br /&gt;
imagesLoaded(images).on(&amp;#039;progress&amp;#039;, updateProgress).on(&amp;#039;always&amp;#039;, showDemo);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Outdated_Browser&amp;diff=25335</id>
		<title>Outdated Browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Outdated_Browser&amp;diff=25335"/>
		<updated>2021-05-07T16:09:53Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* IE 10 / IE 11 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IE 10 / IE 11 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {  &lt;br /&gt;
  /* IE10+ specific styles go here */  &lt;br /&gt;
  #outdated{&lt;br /&gt;
    display: block!important;&lt;br /&gt;
    margin: 2em auto;&lt;br /&gt;
    max-width: 640px;&lt;br /&gt;
  }&lt;br /&gt;
  #page{&lt;br /&gt;
      display: none!important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 https://getbutterfly.com/how-to-show-an-outdated-browser-alert-on-internet-explorer-11/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, as the title says, here’s how to detect an IE 11 browser:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Method #1: Detect IE 10 and IE 11&lt;br /&gt;
function isIE() {&lt;br /&gt;
    // IE 10 and IE 11&lt;br /&gt;
    return /Trident\/|MSIE/.test(window.navigator.userAgent);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or IE 11-only:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let isIE11 = (function () {&lt;br /&gt;
    // true on IE11, false on Edge and other IEs/browsers.&lt;br /&gt;
    let isIE11 = !!window.MSInputMethodContext &amp;amp;&amp;amp; !!document.documentMode,&lt;br /&gt;
        ua = window.navigator.userAgent;&lt;br /&gt;
&lt;br /&gt;
    if (ua.indexOf(&amp;quot;AppleWebKit&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    } else if (ua.indexOf(&amp;quot;Lunascape&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    } else if (ua.indexOf(&amp;quot;Sleipnir&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    array = /(msie|rv:?)\s?([\d\.]+)/.exec(ua);&lt;br /&gt;
    version = (array) ? array[2] : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    return (version === 11) ? true : false;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we need to display an outdated/unsupported browser alert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let showBrowserAlert = (function () {&lt;br /&gt;
    if (document.querySelector(&amp;#039;.unsupported-browser&amp;#039;)) {&lt;br /&gt;
        let d = document.getElementsByClassName(&amp;#039;unsupported-browser&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        is_IE11 = isIE11();&lt;br /&gt;
&lt;br /&gt;
        if (is_IE11) {&lt;br /&gt;
            d[0].innerHTML = &amp;#039;&amp;lt;b&amp;gt;Unsupported Browser!&amp;lt;/b&amp;gt; This website will offer limited functionality in this browser. We only support the recent versions of major browsers like Chrome, Firefox, Safari, and Edge.&amp;#039;;&lt;br /&gt;
            d[0].style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, showBrowserAlert);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don’t forget to add an empty &lt;br /&gt;
 &amp;lt;div class=&amp;quot;unsupported-browser&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
right after the opening &amp;lt;body&amp;gt;.&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Outdated_Browser&amp;diff=25334</id>
		<title>Outdated Browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Outdated_Browser&amp;diff=25334"/>
		<updated>2021-05-07T16:09:26Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: Die Seite wurde neu angelegt: „== IE 10 / IE 11 == &amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt; @media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {     /* IE10+ specific st…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== IE 10 / IE 11 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) {  &lt;br /&gt;
  /* IE10+ specific styles go here */  &lt;br /&gt;
  #outdated{&lt;br /&gt;
    display: block!important;&lt;br /&gt;
    margin: 2em auto;&lt;br /&gt;
    max-width: 640px;&lt;br /&gt;
  }&lt;br /&gt;
  #page{&lt;br /&gt;
      display: none!important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 https://getbutterfly.com/how-to-show-an-outdated-browser-alert-on-internet-explorer-11/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, as the title says, here’s how to detect an IE 11 browser:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Method #1: Detect IE 10 and IE 11&lt;br /&gt;
function isIE() {&lt;br /&gt;
    // IE 10 and IE 11&lt;br /&gt;
    return /Trident\/|MSIE/.test(window.navigator.userAgent);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or IE 11-only:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let isIE11 = (function () {&lt;br /&gt;
    // true on IE11, false on Edge and other IEs/browsers.&lt;br /&gt;
    let isIE11 = !!window.MSInputMethodContext &amp;amp;&amp;amp; !!document.documentMode,&lt;br /&gt;
        ua = window.navigator.userAgent;&lt;br /&gt;
&lt;br /&gt;
    if (ua.indexOf(&amp;quot;AppleWebKit&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    } else if (ua.indexOf(&amp;quot;Lunascape&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    } else if (ua.indexOf(&amp;quot;Sleipnir&amp;quot;) &amp;gt; 0) {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    array = /(msie|rv:?)\s?([\d\.]+)/.exec(ua);&lt;br /&gt;
    version = (array) ? array[2] : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    return (version === 11) ? true : false;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, we need to display an outdated/unsupported browser alert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let showBrowserAlert = (function () {&lt;br /&gt;
    if (document.querySelector(&amp;#039;.unsupported-browser&amp;#039;)) {&lt;br /&gt;
        let d = document.getElementsByClassName(&amp;#039;unsupported-browser&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        is_IE11 = isIE11();&lt;br /&gt;
&lt;br /&gt;
        if (is_IE11) {&lt;br /&gt;
            d[0].innerHTML = &amp;#039;&amp;lt;b&amp;gt;Unsupported Browser!&amp;lt;/b&amp;gt; This website will offer limited functionality in this browser. We only support the recent versions of major browsers like Chrome, Firefox, Safari, and Edge.&amp;#039;;&lt;br /&gt;
            d[0].style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, showBrowserAlert);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don’t forget to add an empty &amp;lt;div class=&amp;quot;unsupported-browser&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; right after the opening &amp;lt;body&amp;gt;.&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25333</id>
		<title>Processwire - Working with Video</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25333"/>
		<updated>2021-05-05T07:30:09Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Allgemeines zu HTML5 Video ==&lt;br /&gt;
Autostart von Videos mit Ton ist in vielen Browsern wegen der Sicherheitsbeschränkungen nicht möglich. Hier muss man im JavaScript Fallbackmöglichkeiten vorsehen (siehe Codepen Beispiel oder DEKRA GB)&lt;br /&gt;
&lt;br /&gt;
== Beispiel - HTML5 Video über Dateiname ==&lt;br /&gt;
Große Videos lassen sich besser mit FTP hochladen. Z.B. in ein definiertes Verzeichnis und man gibt einfach den Dateinamen an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Video specs&lt;br /&gt;
$videoButtonUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bVideo.svg&amp;#039;;&lt;br /&gt;
$videoPauseUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bPause.svg&amp;#039;;&lt;br /&gt;
$videoFolder = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/videos/&amp;#039;;&lt;br /&gt;
$videoPoster = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;video_poster){&lt;br /&gt;
    $videoPoster = $page-&amp;gt;video_poster-&amp;gt;width(800)-&amp;gt;url;&lt;br /&gt;
}&lt;br /&gt;
$vid = &amp;#039;v-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
$bid = &amp;#039;vb-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
preg_match(&amp;#039;^(?:https?:\/\/)^&amp;#039;,$page-&amp;gt;video_name,$match);&lt;br /&gt;
if($match){    // link&lt;br /&gt;
    $videoUrl = $page-&amp;gt;video_name;&lt;br /&gt;
    // z.B. http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&lt;br /&gt;
}else{&lt;br /&gt;
    $videoUrl = $videoFolder.$page-&amp;gt;video_name;&lt;br /&gt;
}&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
&amp;lt;video id=&amp;quot;&amp;#039;.$vid.&amp;#039;&amp;quot; data-toggle=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot; class=&amp;quot;na-16-9&amp;quot;&lt;br /&gt;
src=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; &lt;br /&gt;
preload=&amp;quot;true&amp;quot; &lt;br /&gt;
poster=&amp;quot;&amp;#039;.$videoPoster.&amp;#039;&amp;quot; &lt;br /&gt;
playsinline&amp;gt;&lt;br /&gt;
Entschuldigung, dein Browser kann keine Inline Videos abspielen. Schau das Video hier an:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;ZUM VIDEO&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;video-button&amp;quot; id=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-play&amp;quot; src=&amp;quot;&amp;#039;.$videoButtonUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-pause&amp;quot; src=&amp;quot;&amp;#039;.$videoPauseUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Beispiel - HTML5 Video mit Fallback ==&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Umfangreiche Konfiguration in Isotope Matrix ===&lt;br /&gt;
Basiert auf Isotope Elements in 3B. Die Isotope Matrix wird hier nicht im Detail erklärt.&lt;br /&gt;
&lt;br /&gt;
* Processwire Modul: &amp;#039;&amp;#039;&amp;#039;FieldtypeSelectFile&amp;#039;&amp;#039;&amp;#039; installieren (funktioniert auch auf 3.x angegeben ist nur bis 2.7 in 09/2017). InputfieldSelectFile wird automatisch mitinstalliert.&lt;br /&gt;
* Feld iso_elem_videos mit Typ File anlegen (Das Beispiel nutzt das RepeaterMatrix Pro Modul. Aber es geht natürlich auch in anderen Feldern. Siehe unten Felderübersicht)&lt;br /&gt;
* Bei Details: Valid File Extensions: mp4 ogv mpeg mov webm&lt;br /&gt;
* In der Repeater Matrix &amp;#039;iso_elem_matrix&amp;#039; neuen Inhaltstyp anlegen (Name: video_box, Label: Video Box)&lt;br /&gt;
* Als Felder  iso_elem_size, iso_elem_image, iso_elem_videos auswählen.&lt;br /&gt;
* Templates erweitern bzw. anlegen (siehe unten)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
==== layout_blocks.inc ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
/* Shows layout blocks&lt;br /&gt;
 * uses repeater Matrix field&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function renderLayoutBlocks($page){&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_matrix as $item) {&lt;br /&gt;
    switch ($item-&amp;gt;type) { // type refers to name field&lt;br /&gt;
      case &amp;#039;portfolio_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render(); // looks for templates/fields/iso_elem_matrix/portfolio_box.php&lt;br /&gt;
        break;&lt;br /&gt;
      //...&lt;br /&gt;
      case &amp;#039;video_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render();&lt;br /&gt;
        break;&lt;br /&gt;
      //..&lt;br /&gt;
      default:&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;Keine Renderdefinition gefunden für den Typ: &amp;#039;.$item-&amp;gt;type.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== video_box.php ====&lt;br /&gt;
Wird durch das render Statement in layout_block.inc automatisch ausgeführt.&lt;br /&gt;
&lt;br /&gt;
site/templates/fields/iso_elem_matrix/video_box.php&lt;br /&gt;
&lt;br /&gt;
Gekürztes Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$pathToVideos = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;img/video/&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$templateName = $page-&amp;gt;getForPage()-&amp;gt;template-&amp;gt;name;&lt;br /&gt;
if($templateName == &amp;quot;isotope-child&amp;quot;) $isotopeFilterClass = $page-&amp;gt;getForpage()-&amp;gt;name;// class if template is isotope-child&lt;br /&gt;
else $isotopeFilterClass = &amp;quot;home&amp;quot;;// for all other templates we want to show content imediately (home class inits first isotope element)&lt;br /&gt;
$myImage = &amp;quot;&amp;quot;;&lt;br /&gt;
$myPoster = &amp;quot;&amp;quot;;&lt;br /&gt;
$myUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
$has_link = 0;&lt;br /&gt;
$sizeClass = &amp;quot;&amp;quot;;&lt;br /&gt;
// Element size&lt;br /&gt;
switch ($page-&amp;gt;iso_elem_size) {&lt;br /&gt;
  case &amp;#039;1&amp;#039;: // small 1-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-s&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 400; //image width&lt;br /&gt;
    $imgH = 400;&lt;br /&gt;
    $icoW = 200; //icon width&lt;br /&gt;
    break;&lt;br /&gt;
  case &amp;#039;2&amp;#039;: // medium 2-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-m&amp;quot;;&lt;br /&gt;
    //...&lt;br /&gt;
  default: // big 2-2&lt;br /&gt;
    $sizeClass = &amp;quot;size-l&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 800;&lt;br /&gt;
    $imgH = 800;&lt;br /&gt;
    $icoW = 200;&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
// Image&lt;br /&gt;
if($page-&amp;gt;iso_elem_image){&lt;br /&gt;
  $imgOptions = array(&lt;br /&gt;
    &amp;#039;quality&amp;#039; =&amp;gt; 80,&lt;br /&gt;
    &amp;#039;upscaling&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $myImage = $page-&amp;gt;iso_elem_image-&amp;gt;size($imgW,$imgH,$imgOptions);&lt;br /&gt;
  $myPoster = &amp;#039; poster=&amp;quot;&amp;#039;.$myImage-&amp;gt;url.&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
// Video&lt;br /&gt;
&lt;br /&gt;
$videoMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
if ($page-&amp;gt;iso_elem_videos-&amp;gt;count()) {&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_videos as $file){&lt;br /&gt;
    $videoMarkup .= &amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/&amp;#039;.$file-&amp;gt;ext.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Video Container Markup&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;element-with-video-bg jquery-background-video-wrapper stretch&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;video data-bgvideo=&amp;quot;true&amp;quot; class=&amp;quot;my-background-video jquery-background-video&amp;quot; loop autoplay muted&amp;#039;.$myPoster.&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;#039;.$videoMarkup.&amp;#039;&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ======== &amp;lt;?=$isotopeFilterClass?&amp;gt; Element: Video Box item ======== --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;element video-box &amp;lt;?=$sizeClass?&amp;gt; &amp;lt;?=$isotopeFilterClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;aspect-wrapper transition &amp;lt;?=$aspectClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;element-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;portfolio-item stretch&amp;quot; style=&amp;quot;overflow:hidden&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$videoMarkup?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- ======== / Element ======== --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_contents();&lt;br /&gt;
ob_end_clean();&lt;br /&gt;
&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Felder ====&lt;br /&gt;
iso_elem_videos -&amp;gt; Type Select File (Ein oder mehrere Videos)&lt;br /&gt;
iso_elem_image -&amp;gt; Type Image (Fallback)&lt;br /&gt;
iso_elem_size -&amp;gt; Type Integer (Select Field)&lt;br /&gt;
iso_elem_matrix -&amp;gt; RepeaterMatrix&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25332</id>
		<title>Processwire - Working with Video</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25332"/>
		<updated>2021-05-05T07:28:26Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Beispiel - HTML5 Video über Dateiname */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beispiel - HTML5 Video über Dateiname ==&lt;br /&gt;
Große Videos lassen sich besser mit FTP hochladen. Z.B. in ein definiertes Verzeichnis und man gibt einfach den Dateinamen an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Video specs&lt;br /&gt;
$videoButtonUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bVideo.svg&amp;#039;;&lt;br /&gt;
$videoPauseUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bPause.svg&amp;#039;;&lt;br /&gt;
$videoFolder = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/videos/&amp;#039;;&lt;br /&gt;
$videoPoster = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;video_poster){&lt;br /&gt;
    $videoPoster = $page-&amp;gt;video_poster-&amp;gt;width(800)-&amp;gt;url;&lt;br /&gt;
}&lt;br /&gt;
$vid = &amp;#039;v-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
$bid = &amp;#039;vb-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
preg_match(&amp;#039;^(?:https?:\/\/)^&amp;#039;,$page-&amp;gt;video_name,$match);&lt;br /&gt;
if($match){    // link&lt;br /&gt;
    $videoUrl = $page-&amp;gt;video_name;&lt;br /&gt;
    // z.B. http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&lt;br /&gt;
}else{&lt;br /&gt;
    $videoUrl = $videoFolder.$page-&amp;gt;video_name;&lt;br /&gt;
}&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
&amp;lt;video id=&amp;quot;&amp;#039;.$vid.&amp;#039;&amp;quot; data-toggle=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot; class=&amp;quot;na-16-9&amp;quot;&lt;br /&gt;
src=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; &lt;br /&gt;
preload=&amp;quot;true&amp;quot; &lt;br /&gt;
poster=&amp;quot;&amp;#039;.$videoPoster.&amp;#039;&amp;quot; &lt;br /&gt;
playsinline&amp;gt;&lt;br /&gt;
Entschuldigung, dein Browser kann keine Inline Videos abspielen. Schau das Video hier an:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;ZUM VIDEO&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;video-button&amp;quot; id=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-play&amp;quot; src=&amp;quot;&amp;#039;.$videoButtonUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-pause&amp;quot; src=&amp;quot;&amp;#039;.$videoPauseUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Beispiel - HTML5 Video mit Fallback ==&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Umfangreiche Konfiguration in Isotope Matrix ===&lt;br /&gt;
Basiert auf Isotope Elements in 3B. Die Isotope Matrix wird hier nicht im Detail erklärt.&lt;br /&gt;
&lt;br /&gt;
* Processwire Modul: &amp;#039;&amp;#039;&amp;#039;FieldtypeSelectFile&amp;#039;&amp;#039;&amp;#039; installieren (funktioniert auch auf 3.x angegeben ist nur bis 2.7 in 09/2017). InputfieldSelectFile wird automatisch mitinstalliert.&lt;br /&gt;
* Feld iso_elem_videos mit Typ File anlegen (Das Beispiel nutzt das RepeaterMatrix Pro Modul. Aber es geht natürlich auch in anderen Feldern. Siehe unten Felderübersicht)&lt;br /&gt;
* Bei Details: Valid File Extensions: mp4 ogv mpeg mov webm&lt;br /&gt;
* In der Repeater Matrix &amp;#039;iso_elem_matrix&amp;#039; neuen Inhaltstyp anlegen (Name: video_box, Label: Video Box)&lt;br /&gt;
* Als Felder  iso_elem_size, iso_elem_image, iso_elem_videos auswählen.&lt;br /&gt;
* Templates erweitern bzw. anlegen (siehe unten)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
==== layout_blocks.inc ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
/* Shows layout blocks&lt;br /&gt;
 * uses repeater Matrix field&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function renderLayoutBlocks($page){&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_matrix as $item) {&lt;br /&gt;
    switch ($item-&amp;gt;type) { // type refers to name field&lt;br /&gt;
      case &amp;#039;portfolio_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render(); // looks for templates/fields/iso_elem_matrix/portfolio_box.php&lt;br /&gt;
        break;&lt;br /&gt;
      //...&lt;br /&gt;
      case &amp;#039;video_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render();&lt;br /&gt;
        break;&lt;br /&gt;
      //..&lt;br /&gt;
      default:&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;Keine Renderdefinition gefunden für den Typ: &amp;#039;.$item-&amp;gt;type.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== video_box.php ====&lt;br /&gt;
Wird durch das render Statement in layout_block.inc automatisch ausgeführt.&lt;br /&gt;
&lt;br /&gt;
site/templates/fields/iso_elem_matrix/video_box.php&lt;br /&gt;
&lt;br /&gt;
Gekürztes Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$pathToVideos = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;img/video/&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$templateName = $page-&amp;gt;getForPage()-&amp;gt;template-&amp;gt;name;&lt;br /&gt;
if($templateName == &amp;quot;isotope-child&amp;quot;) $isotopeFilterClass = $page-&amp;gt;getForpage()-&amp;gt;name;// class if template is isotope-child&lt;br /&gt;
else $isotopeFilterClass = &amp;quot;home&amp;quot;;// for all other templates we want to show content imediately (home class inits first isotope element)&lt;br /&gt;
$myImage = &amp;quot;&amp;quot;;&lt;br /&gt;
$myPoster = &amp;quot;&amp;quot;;&lt;br /&gt;
$myUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
$has_link = 0;&lt;br /&gt;
$sizeClass = &amp;quot;&amp;quot;;&lt;br /&gt;
// Element size&lt;br /&gt;
switch ($page-&amp;gt;iso_elem_size) {&lt;br /&gt;
  case &amp;#039;1&amp;#039;: // small 1-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-s&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 400; //image width&lt;br /&gt;
    $imgH = 400;&lt;br /&gt;
    $icoW = 200; //icon width&lt;br /&gt;
    break;&lt;br /&gt;
  case &amp;#039;2&amp;#039;: // medium 2-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-m&amp;quot;;&lt;br /&gt;
    //...&lt;br /&gt;
  default: // big 2-2&lt;br /&gt;
    $sizeClass = &amp;quot;size-l&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 800;&lt;br /&gt;
    $imgH = 800;&lt;br /&gt;
    $icoW = 200;&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
// Image&lt;br /&gt;
if($page-&amp;gt;iso_elem_image){&lt;br /&gt;
  $imgOptions = array(&lt;br /&gt;
    &amp;#039;quality&amp;#039; =&amp;gt; 80,&lt;br /&gt;
    &amp;#039;upscaling&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $myImage = $page-&amp;gt;iso_elem_image-&amp;gt;size($imgW,$imgH,$imgOptions);&lt;br /&gt;
  $myPoster = &amp;#039; poster=&amp;quot;&amp;#039;.$myImage-&amp;gt;url.&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
// Video&lt;br /&gt;
&lt;br /&gt;
$videoMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
if ($page-&amp;gt;iso_elem_videos-&amp;gt;count()) {&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_videos as $file){&lt;br /&gt;
    $videoMarkup .= &amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/&amp;#039;.$file-&amp;gt;ext.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Video Container Markup&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;element-with-video-bg jquery-background-video-wrapper stretch&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;video data-bgvideo=&amp;quot;true&amp;quot; class=&amp;quot;my-background-video jquery-background-video&amp;quot; loop autoplay muted&amp;#039;.$myPoster.&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;#039;.$videoMarkup.&amp;#039;&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ======== &amp;lt;?=$isotopeFilterClass?&amp;gt; Element: Video Box item ======== --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;element video-box &amp;lt;?=$sizeClass?&amp;gt; &amp;lt;?=$isotopeFilterClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;aspect-wrapper transition &amp;lt;?=$aspectClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;element-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;portfolio-item stretch&amp;quot; style=&amp;quot;overflow:hidden&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$videoMarkup?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- ======== / Element ======== --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_contents();&lt;br /&gt;
ob_end_clean();&lt;br /&gt;
&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Felder ====&lt;br /&gt;
iso_elem_videos -&amp;gt; Type Select File (Ein oder mehrere Videos)&lt;br /&gt;
iso_elem_image -&amp;gt; Type Image (Fallback)&lt;br /&gt;
iso_elem_size -&amp;gt; Type Integer (Select Field)&lt;br /&gt;
iso_elem_matrix -&amp;gt; RepeaterMatrix&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25331</id>
		<title>Processwire - Working with Video</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25331"/>
		<updated>2021-05-05T07:28:03Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* HTML5 Video mit Fallback */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beispiel - HTML5 Video über Dateiname ==&lt;br /&gt;
Große Videos lassen sich besser mit FTP hochladen. Z.B. in ein definiertes Verzeichnis und man gibt einfach den Dateinamen an:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Video specs&lt;br /&gt;
$videoButtonUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bVideo.svg&amp;#039;;&lt;br /&gt;
$videoPauseUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/bPause.svg&amp;#039;;&lt;br /&gt;
$videoFolder = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/videos/&amp;#039;;&lt;br /&gt;
$videoPoster = &amp;#039;&amp;#039;;&lt;br /&gt;
if($page-&amp;gt;video_poster){&lt;br /&gt;
    $videoPoster = $page-&amp;gt;video_poster-&amp;gt;width(800)-&amp;gt;url;&lt;br /&gt;
}&lt;br /&gt;
$vid = &amp;#039;v-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
$bid = &amp;#039;vb-&amp;#039;.$page-&amp;gt;id;&lt;br /&gt;
preg_match(&amp;#039;^(?:https?:\/\/)^&amp;#039;,$page-&amp;gt;video_name,$match);&lt;br /&gt;
if($match){    // link&lt;br /&gt;
    $videoUrl = $page-&amp;gt;video_name;&lt;br /&gt;
    // z.B. http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&lt;br /&gt;
}else{&lt;br /&gt;
    $videoUrl = $videoFolder.$page-&amp;gt;video_name;&lt;br /&gt;
}&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
&amp;lt;video id=&amp;quot;&amp;#039;.$vid.&amp;#039;&amp;quot; data-toggle=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot; class=&amp;quot;na-16-9&amp;quot;&lt;br /&gt;
src=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; &lt;br /&gt;
preload=&amp;quot;true&amp;quot; &lt;br /&gt;
poster=&amp;quot;&amp;#039;.$videoPoster.&amp;#039;&amp;quot; &lt;br /&gt;
playsinline&amp;gt;&lt;br /&gt;
Entschuldigung, dein Browser kann keine Inline Videos abspielen. Schau das Video hier an:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;&amp;#039;.$videoUrl.&amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;ZUM VIDEO&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;video-button&amp;quot; id=&amp;quot;&amp;#039;.$bid.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-play&amp;quot; src=&amp;quot;&amp;#039;.$videoButtonUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;img class=&amp;quot;b-pause&amp;quot; src=&amp;quot;&amp;#039;.$videoPauseUrl.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot; alt=&amp;quot;&amp;quot; srcset=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
== Beispiel - HTML5 Video mit Fallback ==&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Umfangreiche Konfiguration in Isotope Matrix ===&lt;br /&gt;
Basiert auf Isotope Elements in 3B. Die Isotope Matrix wird hier nicht im Detail erklärt.&lt;br /&gt;
&lt;br /&gt;
* Processwire Modul: &amp;#039;&amp;#039;&amp;#039;FieldtypeSelectFile&amp;#039;&amp;#039;&amp;#039; installieren (funktioniert auch auf 3.x angegeben ist nur bis 2.7 in 09/2017). InputfieldSelectFile wird automatisch mitinstalliert.&lt;br /&gt;
* Feld iso_elem_videos mit Typ File anlegen (Das Beispiel nutzt das RepeaterMatrix Pro Modul. Aber es geht natürlich auch in anderen Feldern. Siehe unten Felderübersicht)&lt;br /&gt;
* Bei Details: Valid File Extensions: mp4 ogv mpeg mov webm&lt;br /&gt;
* In der Repeater Matrix &amp;#039;iso_elem_matrix&amp;#039; neuen Inhaltstyp anlegen (Name: video_box, Label: Video Box)&lt;br /&gt;
* Als Felder  iso_elem_size, iso_elem_image, iso_elem_videos auswählen.&lt;br /&gt;
* Templates erweitern bzw. anlegen (siehe unten)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
==== layout_blocks.inc ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
/* Shows layout blocks&lt;br /&gt;
 * uses repeater Matrix field&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function renderLayoutBlocks($page){&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_matrix as $item) {&lt;br /&gt;
    switch ($item-&amp;gt;type) { // type refers to name field&lt;br /&gt;
      case &amp;#039;portfolio_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render(); // looks for templates/fields/iso_elem_matrix/portfolio_box.php&lt;br /&gt;
        break;&lt;br /&gt;
      //...&lt;br /&gt;
      case &amp;#039;video_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render();&lt;br /&gt;
        break;&lt;br /&gt;
      //..&lt;br /&gt;
      default:&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;Keine Renderdefinition gefunden für den Typ: &amp;#039;.$item-&amp;gt;type.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== video_box.php ====&lt;br /&gt;
Wird durch das render Statement in layout_block.inc automatisch ausgeführt.&lt;br /&gt;
&lt;br /&gt;
site/templates/fields/iso_elem_matrix/video_box.php&lt;br /&gt;
&lt;br /&gt;
Gekürztes Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$pathToVideos = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;img/video/&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$templateName = $page-&amp;gt;getForPage()-&amp;gt;template-&amp;gt;name;&lt;br /&gt;
if($templateName == &amp;quot;isotope-child&amp;quot;) $isotopeFilterClass = $page-&amp;gt;getForpage()-&amp;gt;name;// class if template is isotope-child&lt;br /&gt;
else $isotopeFilterClass = &amp;quot;home&amp;quot;;// for all other templates we want to show content imediately (home class inits first isotope element)&lt;br /&gt;
$myImage = &amp;quot;&amp;quot;;&lt;br /&gt;
$myPoster = &amp;quot;&amp;quot;;&lt;br /&gt;
$myUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
$has_link = 0;&lt;br /&gt;
$sizeClass = &amp;quot;&amp;quot;;&lt;br /&gt;
// Element size&lt;br /&gt;
switch ($page-&amp;gt;iso_elem_size) {&lt;br /&gt;
  case &amp;#039;1&amp;#039;: // small 1-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-s&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 400; //image width&lt;br /&gt;
    $imgH = 400;&lt;br /&gt;
    $icoW = 200; //icon width&lt;br /&gt;
    break;&lt;br /&gt;
  case &amp;#039;2&amp;#039;: // medium 2-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-m&amp;quot;;&lt;br /&gt;
    //...&lt;br /&gt;
  default: // big 2-2&lt;br /&gt;
    $sizeClass = &amp;quot;size-l&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 800;&lt;br /&gt;
    $imgH = 800;&lt;br /&gt;
    $icoW = 200;&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
// Image&lt;br /&gt;
if($page-&amp;gt;iso_elem_image){&lt;br /&gt;
  $imgOptions = array(&lt;br /&gt;
    &amp;#039;quality&amp;#039; =&amp;gt; 80,&lt;br /&gt;
    &amp;#039;upscaling&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $myImage = $page-&amp;gt;iso_elem_image-&amp;gt;size($imgW,$imgH,$imgOptions);&lt;br /&gt;
  $myPoster = &amp;#039; poster=&amp;quot;&amp;#039;.$myImage-&amp;gt;url.&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
// Video&lt;br /&gt;
&lt;br /&gt;
$videoMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
if ($page-&amp;gt;iso_elem_videos-&amp;gt;count()) {&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_videos as $file){&lt;br /&gt;
    $videoMarkup .= &amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/&amp;#039;.$file-&amp;gt;ext.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Video Container Markup&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;element-with-video-bg jquery-background-video-wrapper stretch&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;video data-bgvideo=&amp;quot;true&amp;quot; class=&amp;quot;my-background-video jquery-background-video&amp;quot; loop autoplay muted&amp;#039;.$myPoster.&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;#039;.$videoMarkup.&amp;#039;&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ======== &amp;lt;?=$isotopeFilterClass?&amp;gt; Element: Video Box item ======== --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;element video-box &amp;lt;?=$sizeClass?&amp;gt; &amp;lt;?=$isotopeFilterClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;aspect-wrapper transition &amp;lt;?=$aspectClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;element-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;portfolio-item stretch&amp;quot; style=&amp;quot;overflow:hidden&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$videoMarkup?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- ======== / Element ======== --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_contents();&lt;br /&gt;
ob_end_clean();&lt;br /&gt;
&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Felder ====&lt;br /&gt;
iso_elem_videos -&amp;gt; Type Select File (Ein oder mehrere Videos)&lt;br /&gt;
iso_elem_image -&amp;gt; Type Image (Fallback)&lt;br /&gt;
iso_elem_size -&amp;gt; Type Integer (Select Field)&lt;br /&gt;
iso_elem_matrix -&amp;gt; RepeaterMatrix&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25330</id>
		<title>Processwire - Working with Video</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Working_with_Video&amp;diff=25330"/>
		<updated>2021-05-05T07:26:28Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* = layout_blocks.inc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== HTML5 Video mit Fallback ==&lt;br /&gt;
&lt;br /&gt;
=== Beispiel: Umfangreiche Konfiguration in Isotope Matrix ===&lt;br /&gt;
Basiert auf Isotope Elements in 3B. Die Isotope Matrix wird hier nicht im Detail erklärt.&lt;br /&gt;
&lt;br /&gt;
* Processwire Modul: &amp;#039;&amp;#039;&amp;#039;FieldtypeSelectFile&amp;#039;&amp;#039;&amp;#039; installieren (funktioniert auch auf 3.x angegeben ist nur bis 2.7 in 09/2017). InputfieldSelectFile wird automatisch mitinstalliert.&lt;br /&gt;
* Feld iso_elem_videos mit Typ File anlegen (Das Beispiel nutzt das RepeaterMatrix Pro Modul. Aber es geht natürlich auch in anderen Feldern. Siehe unten Felderübersicht)&lt;br /&gt;
* Bei Details: Valid File Extensions: mp4 ogv mpeg mov webm&lt;br /&gt;
* In der Repeater Matrix &amp;#039;iso_elem_matrix&amp;#039; neuen Inhaltstyp anlegen (Name: video_box, Label: Video Box)&lt;br /&gt;
* Als Felder  iso_elem_size, iso_elem_image, iso_elem_videos auswählen.&lt;br /&gt;
* Templates erweitern bzw. anlegen (siehe unten)&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
==== layout_blocks.inc ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
/* Shows layout blocks&lt;br /&gt;
 * uses repeater Matrix field&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
function renderLayoutBlocks($page){&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_matrix as $item) {&lt;br /&gt;
    switch ($item-&amp;gt;type) { // type refers to name field&lt;br /&gt;
      case &amp;#039;portfolio_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render(); // looks for templates/fields/iso_elem_matrix/portfolio_box.php&lt;br /&gt;
        break;&lt;br /&gt;
      //...&lt;br /&gt;
      case &amp;#039;video_box&amp;#039;:&lt;br /&gt;
        $out .= $item-&amp;gt;render();&lt;br /&gt;
        break;&lt;br /&gt;
      //..&lt;br /&gt;
      default:&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;div class=&amp;quot;message&amp;quot;&amp;gt;Keine Renderdefinition gefunden für den Typ: &amp;#039;.$item-&amp;gt;type.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== video_box.php ====&lt;br /&gt;
Wird durch das render Statement in layout_block.inc automatisch ausgeführt.&lt;br /&gt;
&lt;br /&gt;
site/templates/fields/iso_elem_matrix/video_box.php&lt;br /&gt;
&lt;br /&gt;
Gekürztes Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$pathToVideos = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;img/video/&amp;#039;;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$templateName = $page-&amp;gt;getForPage()-&amp;gt;template-&amp;gt;name;&lt;br /&gt;
if($templateName == &amp;quot;isotope-child&amp;quot;) $isotopeFilterClass = $page-&amp;gt;getForpage()-&amp;gt;name;// class if template is isotope-child&lt;br /&gt;
else $isotopeFilterClass = &amp;quot;home&amp;quot;;// for all other templates we want to show content imediately (home class inits first isotope element)&lt;br /&gt;
$myImage = &amp;quot;&amp;quot;;&lt;br /&gt;
$myPoster = &amp;quot;&amp;quot;;&lt;br /&gt;
$myUrl = &amp;quot;&amp;quot;;&lt;br /&gt;
$has_link = 0;&lt;br /&gt;
$sizeClass = &amp;quot;&amp;quot;;&lt;br /&gt;
// Element size&lt;br /&gt;
switch ($page-&amp;gt;iso_elem_size) {&lt;br /&gt;
  case &amp;#039;1&amp;#039;: // small 1-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-s&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 400; //image width&lt;br /&gt;
    $imgH = 400;&lt;br /&gt;
    $icoW = 200; //icon width&lt;br /&gt;
    break;&lt;br /&gt;
  case &amp;#039;2&amp;#039;: // medium 2-1&lt;br /&gt;
    $sizeClass = &amp;quot;size-m&amp;quot;;&lt;br /&gt;
    //...&lt;br /&gt;
  default: // big 2-2&lt;br /&gt;
    $sizeClass = &amp;quot;size-l&amp;quot;;&lt;br /&gt;
    $aspectClass = &amp;quot;a-1-1&amp;quot;;&lt;br /&gt;
    $imgW = 800;&lt;br /&gt;
    $imgH = 800;&lt;br /&gt;
    $icoW = 200;&lt;br /&gt;
    break;&lt;br /&gt;
}&lt;br /&gt;
// Image&lt;br /&gt;
if($page-&amp;gt;iso_elem_image){&lt;br /&gt;
  $imgOptions = array(&lt;br /&gt;
    &amp;#039;quality&amp;#039; =&amp;gt; 80,&lt;br /&gt;
    &amp;#039;upscaling&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $myImage = $page-&amp;gt;iso_elem_image-&amp;gt;size($imgW,$imgH,$imgOptions);&lt;br /&gt;
  $myPoster = &amp;#039; poster=&amp;quot;&amp;#039;.$myImage-&amp;gt;url.&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
// Video&lt;br /&gt;
&lt;br /&gt;
$videoMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
if ($page-&amp;gt;iso_elem_videos-&amp;gt;count()) {&lt;br /&gt;
  foreach($page-&amp;gt;iso_elem_videos as $file){&lt;br /&gt;
    $videoMarkup .= &amp;#039;&amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/&amp;#039;.$file-&amp;gt;ext.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Video Container Markup&lt;br /&gt;
$videoMarkup = &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;element-with-video-bg jquery-background-video-wrapper stretch&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;video data-bgvideo=&amp;quot;true&amp;quot; class=&amp;quot;my-background-video jquery-background-video&amp;quot; loop autoplay muted&amp;#039;.$myPoster.&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;#039;.$videoMarkup.&amp;#039;&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ======== &amp;lt;?=$isotopeFilterClass?&amp;gt; Element: Video Box item ======== --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;element video-box &amp;lt;?=$sizeClass?&amp;gt; &amp;lt;?=$isotopeFilterClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;aspect-wrapper transition &amp;lt;?=$aspectClass?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;element-wrapper&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;portfolio-item stretch&amp;quot; style=&amp;quot;overflow:hidden&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$videoMarkup?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;!-- ======== / Element ======== --&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_contents();&lt;br /&gt;
ob_end_clean();&lt;br /&gt;
&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Felder ====&lt;br /&gt;
iso_elem_videos -&amp;gt; Type Select File (Ein oder mehrere Videos)&lt;br /&gt;
iso_elem_image -&amp;gt; Type Image (Fallback)&lt;br /&gt;
iso_elem_size -&amp;gt; Type Integer (Select Field)&lt;br /&gt;
iso_elem_matrix -&amp;gt; RepeaterMatrix&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Htaccess&amp;diff=25329</id>
		<title>Htaccess</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Htaccess&amp;diff=25329"/>
		<updated>2021-04-30T04:27:50Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* Weiterleitungen (Redirects) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Anwendung von .htaccess - Dateien ==&lt;br /&gt;
=== Weiterführende Links: ===&lt;br /&gt;
https://jweiland.net/know-how/internet/htaccess-konfigurieren.html#c2756&lt;br /&gt;
&lt;br /&gt;
http://httpd.apache.org/docs/1.3/howto/htaccess.html&lt;br /&gt;
&lt;br /&gt;
von: http://www.uni-duesseldorf.de/Service/Webmaster/htaccess.php3 Juli 2006&lt;br /&gt;
&lt;br /&gt;
Referenz: Apache Manual: http://www.uni-duesseldorf.de/apache-manual/&lt;br /&gt;
&lt;br /&gt;
[[Apache Mod Rewrite Syntax]]&lt;br /&gt;
&lt;br /&gt;
=== Wozu braucht man das ?===&lt;br /&gt;
An wen ein HTTP-Server Dokumente herausgibt, welche spezielle Verarbeitung er u.U. bei einer spezifischen Anforderung (einem request) durchführt - all das wird zunächst durch eine von der Server-Software abhängigen Konfiguration bestimmt, die ein Administrator - ein Webmaster - eingerichtet hat.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oft ist es aber wünschenswert, daß einzelne Verantwortliche für eine Dokumentenhierarchie auf dem Web-Server selbst ohne Intervention des Webmasters Setzungen vornehmen können, daß z.B. auf einzelne Dokumente oder alle in einem bestimmten Verzeichnis nur ein Zugriff aus bestimmten Domains oder mit verifiziertem Usernamen möglich ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Beim Apache-HTTP-Server wie seinem Vorgänger, dem NCSA-httpd, gibt es diese Möglichkeiten durch die Einrichtung von .htaccess-Dateien in dem jeweiligen Verzeichnis. In der folgenden Darstellung wird als Referenz jeweils ein Verweis auf den entsprechenden Abschnitt in der lokale Kopie der Apache-Dokumentation für die Version 1.2 gegeben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Achtung:&amp;#039;&amp;#039;&amp;#039; In der Server-Konfiguration kann ein anderer Name als .htaccess vereinbart sein (AccesFileName-Direkt ive).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Zweiter Hinweis:&amp;#039;&amp;#039;&amp;#039; Die Datei muß für den HTTP-Server lesbar sein, z.B. dadurch erreicht, daß sie öffentlich lesbar ist:&lt;br /&gt;
&lt;br /&gt;
 chmod 644 .htaccess &lt;br /&gt;
&lt;br /&gt;
=== Zugriffsbeschränkung auf eine Domain === &lt;br /&gt;
==== für alle Dateien in einem Verzeichnis ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 order deny,allow&lt;br /&gt;
 deny  from all&lt;br /&gt;
 allow from .uni-duesseldorf.de 134.99 &lt;br /&gt;
&lt;br /&gt;
Alle Dateien in dem Verzeichnis werden nur an Clients ausgeliefert, die eine IP-Adresse beginnend mit 134.99 oder einen Hostnamen endend mit uni-duesseldorf.de besitzen; anderenfalls erfolgt eine Fehlermeldung des Servers (403 Forbidden).&lt;br /&gt;
&lt;br /&gt;
Natürlich genügt in vielen Fällen eine der Alternativen. Beachten Sie dabei die Unterschiede:&lt;br /&gt;
&lt;br /&gt;
* Die Angabe des Domain-Namens allein schließt - bewußt oder nicht - den Zugriff von PC&amp;#039;s aus, die nicht im Domain Name System (DNS) registriert sind.&lt;br /&gt;
* Die Angabe des IP-Subnetzes allein kann andere ausschließen, die organisatorisch zur gleichen Domain gehören, technisch aber in einem anderen Subnetz hängen. &lt;br /&gt;
&lt;br /&gt;
Wie lässt sich diese Zugriffsbeschränkung testen? Normalerweise benötigt man dazu einen Internet-Zugang über einen anderen Provider (T-Online, AOL, Compuserve etc.). Oder man benutzt einen Browser auf dem Server selbst z.B. in folgender Weise:&lt;br /&gt;
&lt;br /&gt;
 lynx http://localhost/Service/Webmaster/htaccess.phtml &lt;br /&gt;
&lt;br /&gt;
Der Zugriff erfolgt dann über das Loopback-Interface mit der IP-Adresse 127.0.0.1.&lt;br /&gt;
&lt;br /&gt;
Referenz: order, deny, allow. &lt;br /&gt;
&lt;br /&gt;
==== für einzelne Dateien ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Files huh*.html&amp;gt;&lt;br /&gt;
 order deny,allow&lt;br /&gt;
 deny  from all&lt;br /&gt;
 allow from .uni-duesseldorf.de 134.99&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Zugriffsbeschränkung wie oben gilt jetzt nur für die Dateien, deren Namen auf das hinter Files angegebene Muster passen. Es kann ein einzelner Name angegeben werden oder ein Muster mit den Wildcard-Zeichen ? für ein beliebiges einzelnes Zeichen oder * für eine beliebige Folge von Zeichen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Schließlich sind auch feinere Muster über reguläre Ausdrücke möglich. Die Syntax der Files-Direktive dafür ist:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Files ~ &amp;quot;regexp&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Referenz: &amp;lt;Files&amp;gt;, order, deny, allow.&lt;br /&gt;
&lt;br /&gt;
=== Zugriffsbeschränkung über Passwort ===&lt;br /&gt;
==== für ein Verzeichnis ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 AuthType Basic&lt;br /&gt;
 AuthName MeyersLeute&lt;br /&gt;
 AuthUserFile /home/meyer/passwd&lt;br /&gt;
 require valid-user&lt;br /&gt;
&lt;br /&gt;
Dokumente in einem Verzeichnis mit dieser .htaccess-Datei (oder einem Unterverzeichnis) können erst nach Eingabe eines gültigen Benutzernamen und Passwortes gelesen werden. Der Wert hinter AuthName wird vom Browser in der Dialog-Box für die Passwortabfrage angezeigt und dient gleichzeitig dazu, andere Dokumente mit dem gleichen Schutz zu erkennen und einmal eingelesene Werte für Username und Password ohne erneute Abfrage unmittelbar zu verwenden.&lt;br /&gt;
&lt;br /&gt;
Hinter AuthUserFile steht der Pfad der Passwortdatei, die die Benutzernamen und (verschlüsselten) Passwörter enthält. Sie sieht etwa so aus:&lt;br /&gt;
&lt;br /&gt;
 /home/meyer/passwd&lt;br /&gt;
&lt;br /&gt;
 meyer:xm.kPd4VJc3Fo&lt;br /&gt;
 mueller:eJFQCL8GftDXI&lt;br /&gt;
&lt;br /&gt;
Auch die Passwortdatei muß für den HTTP-Server lesbar sein. Gerade deshalb sollte sie niemals in demselben Bereich liegen wie die vom Server bedienten Dokumente, da sonst zumindest die gültigen Benutzernamen lesbar wären. (Aus diesem Grund müssen Sie aber u.U. daran denken, auch das entsprechende Verzeichnis - wie /home/meyer im Beispiel - für den HTTP-Server zumindest suchbar zu setzen, also etwa:&lt;br /&gt;
&lt;br /&gt;
    chmod 711 /home/meyer &lt;br /&gt;
&lt;br /&gt;
Angelegt und gepflegt werden kann die Passwortdatei mit dem Programm htpasswd:&lt;br /&gt;
&lt;br /&gt;
    htpasswd -c /home/meyer/passwd meyer&lt;br /&gt;
    htpasswd /home/meyer/passwd mueller &lt;br /&gt;
&lt;br /&gt;
Referenz: AuthType, AuthName, AuthUserFile, require.&lt;br /&gt;
&lt;br /&gt;
==== für einzelne Dateien ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 AuthType Basic&lt;br /&gt;
 AuthName MeyersLeute&lt;br /&gt;
 AuthUserFile /home/meyer/passwd&lt;br /&gt;
 &amp;lt;Files Huh*.html&amp;gt;&lt;br /&gt;
 require user meyer mueller&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Kombination von 2. und 3. - Passwortschutz für einzelne Dateien in dem aktuellen Verzeichnis. Beim require wird hier noch eine andere Alternative gezeigt: die Aufzählung einzelner Benutzernamen aus der Passwortdatei. Wenn neue Benutzer in der Passwortdatei ergänzt werden, haben diese noch keinen Zugriff auf die so geschützten Seiten.&lt;br /&gt;
&lt;br /&gt;
Wenn die gleiche Liste von Benutzern an mehreren Stellen verwendet werden soll, ist die Definition der Liste über eine Gruppendatei empfehlenswert. Für diese dritte Alternative bzgl. der require-Direktive sind fogende Änderungen notwendig:&lt;br /&gt;
&lt;br /&gt;
1. In der .htaccess-Datei wird eine Gruppendatei angegeben:&lt;br /&gt;
 AuthGrouprFile /home/meyer/groups&lt;br /&gt;
Für den Ort der Ablage dieser Datei gelten dieselben Erwägungen wie für die Passwortdatei oben.&lt;br /&gt;
2. In der require-Direktive wird jetzt auf eine Gruppendefinition in der Gruppendatei Bezug genommen:&lt;br /&gt;
 require group meyers&lt;br /&gt;
3. Die Gruppendatei ist eine einfache Textdatei mit je einer Gruppendefinition pro Zeile in folgender Form: &lt;br /&gt;
&lt;br /&gt;
 /home/meyer/groups&lt;br /&gt;
 meyers: meyer mueller&lt;br /&gt;
&lt;br /&gt;
Referenz: AuthType, AuthName, AuthUserFile, AuthGroupFile, &amp;lt;Files&amp;gt;, require. &lt;br /&gt;
&lt;br /&gt;
===Spezielle Optionen===&lt;br /&gt;
==== automatischer Index (Directory Listing)====&lt;br /&gt;
ausführliche Infos hier: [[htaccess - Directory Listing]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;.htaccess&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Options +Indexes&lt;br /&gt;
&lt;br /&gt;
Mittels der Options-Direktive können - so von der globalen Server-Konfiguration her erlaubt - Voreinstellungen für Verarbeitungsoptionen für das aktuelle Verzeichnis und Unterverzeichnisse überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Variante weist den Server an, bei der Referenz auf das aktuelle Verzeichnis oder ein Unterverzeichnis ein Directory-Listing als Index-Datei automatisch zu generieren. Er macht dies allerdings nur, wenn nicht schon eine Index-Datei (mit vordefiniertem Namen wie index.html) vorhanden ist. Ggf. kann man die hier bekannten Namen mit der Direktive&lt;br /&gt;
&lt;br /&gt;
    DirectoryIndex Welcome.html &lt;br /&gt;
&lt;br /&gt;
einschränken.&lt;br /&gt;
&lt;br /&gt;
Referenz: Options, DirectoryIndex.&lt;br /&gt;
&lt;br /&gt;
==== Automatischer Index mit User Auth ====&lt;br /&gt;
(Quelle Weiland s.o.)&lt;br /&gt;
Directory Listing&lt;br /&gt;
&lt;br /&gt;
Soll über einer geschützen Unterseite (z.B. fileadmin/downloads) des Internetauftritts ein Directory Listing realisiert werden, dann sollte die .htaccess wie folgt eingestellt werden:&lt;br /&gt;
&lt;br /&gt;
 AuthType Basic&lt;br /&gt;
 AuthName &amp;quot;system - &amp;quot;&lt;br /&gt;
 Options +Indexes&lt;br /&gt;
 IndexOptions +FancyIndexing&lt;br /&gt;
 AuthUserFile /*ihr_serverpfad/projektpfad/filadmin/downloads/.htpasswd&lt;br /&gt;
 AuthGroupFile /dev/null&lt;br /&gt;
 require valid-user&lt;br /&gt;
&lt;br /&gt;
* ihr_serverpfad  finden Sie in Ihrem Kundenmenu unter Technische Infos oder durch Eingabe des Befehls $PWD in der Shell.&lt;br /&gt;
&lt;br /&gt;
Den User mit verschlüseltem Passwort in dem Fall in der .htpasswd vorhanden sein.&lt;br /&gt;
&lt;br /&gt;
Die Unterseite mit dem Directory Listing muss von der TYPO3 index.php ausgeschlossen werden und erreichen Sie über die .htaccess in dem Projektverzeichnis mit folgenden Angaben nach der RewriteEngine On:&lt;br /&gt;
&lt;br /&gt;
 RewriteRule ^fileadmin/downloads/$ - [L]&lt;br /&gt;
 RewriteRule ^fileadmin/downloads/.*$ - [L]&lt;br /&gt;
&lt;br /&gt;
==== Startdatei festlegen ====&lt;br /&gt;
Mit dem vorigen Beispiel kann man auch festlegen welche Dateien beim Aufruf eines Verzeichnisses (oder der Webadresse) an den Browser geliefert werden sollen. Manchmal hat man den Fall das die Startdatei eines CMS index.php heißt und bei Wartungsarbeiten die Datei index.html aufgerufen werden soll.&lt;br /&gt;
&lt;br /&gt;
 DirectoryIndex index.html index.php start.html&lt;br /&gt;
&lt;br /&gt;
weist den Apache an falls vorhanden die Datei index.html aufzurufen, wenn nicht die index.php und so weiter.&lt;br /&gt;
&lt;br /&gt;
Bei Wartungsarbeiten kann man nun einfach eine index.html aufspielen die bei Aufruf der Domain angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
==== PHP - Werte setzen ====&lt;br /&gt;
Wenn der Server das erlaubt kann man es folgendermaßen machen:&lt;br /&gt;
===== PHP Memory Limit =====&lt;br /&gt;
 php_value memory_limit 256M&lt;br /&gt;
===== PHP Execution Time =====&lt;br /&gt;
 php_value max_execution_time 240&lt;br /&gt;
&lt;br /&gt;
==== Error Reporting ====&lt;br /&gt;
===== Produktiv Betrieb =====&lt;br /&gt;
(Fehler unterdrückt aber protokolliert)&lt;br /&gt;
&lt;br /&gt;
 php_value error_reporting 2047&lt;br /&gt;
 php_value display_errors 0&lt;br /&gt;
 php_value log_errors 1&lt;br /&gt;
 php_value error_log /eigener/pfad/fehler.log&lt;br /&gt;
&lt;br /&gt;
===== Entwicklung =====&lt;br /&gt;
hier sollte display_errors auf 1 stehen&lt;br /&gt;
&lt;br /&gt;
siehe auch [[PHP - Error Reporting / Fehlerbehandlung]]&lt;br /&gt;
&lt;br /&gt;
siehe auch [[TYPO3 - Error Reporting / Fehlerbehandlung]]&lt;br /&gt;
&lt;br /&gt;
==== Skripte sperren ====&lt;br /&gt;
z.B. bei Überlastung durch ein Skript (hier im Beispiel meineDomain.de/ajax/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{REQUEST_URI}   (.*)ajax(.*)   [NC]&lt;br /&gt;
RewriteRule ^(.*)  - [F]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Caching ==&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
ExpiresActive On&lt;br /&gt;
ExpiresByType text/html &amp;quot;access plus 500 seconds&amp;quot;&lt;br /&gt;
ExpiresByType image/gif &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType image/ico &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType image/jpeg &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType image/jpg &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType image/png &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType text/css &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType text/javascript &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType application/x-javascript &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
ExpiresByType application/javascript &amp;quot;access plus 14 days&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Zugriff auf Ordner ==&lt;br /&gt;
=== Sperren ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# This file restricts access to the fileadmin/user_upload/_import_export_ directory. It is&lt;br /&gt;
# meant to protect temporary files which could contain sensible&lt;br /&gt;
# information. Please do not touch.&lt;br /&gt;
&lt;br /&gt;
# Apache &amp;lt; 2.3&lt;br /&gt;
&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
	Order allow,deny&lt;br /&gt;
	Deny from all&lt;br /&gt;
	Satisfy All&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Apache ≥ 2.3&lt;br /&gt;
&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
	Require all denied&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiterleitung mit .htaccess ==&lt;br /&gt;
=== Beispiele mit Fokus auf TYPO3 ===&lt;br /&gt;
Quelle  Weiland (s.o.)&lt;br /&gt;
====Weiterleitungen (Redirects)====&lt;br /&gt;
===== Common Cases ===&lt;br /&gt;
Einzelne Unterseiten weiterleiten&lt;br /&gt;
&lt;br /&gt;
Aufrufe einer Unterseite (z.B. a.html) auf eine andere Unterseite (z.B. b.html) innerhalb der selben Domain weiterleiten.&lt;br /&gt;
Redirect 301 /a.html /b.html&lt;br /&gt;
&lt;br /&gt;
Ganzen Ordner / Verzeichnis weiterleiten&lt;br /&gt;
&lt;br /&gt;
Aufrufe eines Ordners (z.B. /a) auf einen anderen Ordner innerhalb der selben Domain (z.B. /b) weiterleiten. Die Weiterleitung wirkt sich auch auf alle Dateien innerhalb des Ordners /a aus, so wird z.B. der Aufruf von /a/test.html auf /b/test.html weitergeleitet.&lt;br /&gt;
 Redirect 301 /a /b&lt;br /&gt;
&lt;br /&gt;
Domain Weiterleitung: Ganze Domain umleiten&lt;br /&gt;
&lt;br /&gt;
Aufrufe einer Unterseite (URL) von Domain A auf die selbe Unterseite (URL) unter Domain B weiterleiten.&lt;br /&gt;
z.B. domain-a.de/test.html auf domain-b.de/test.html weiterleiten wobei dies nicht nur für test.html, sondern auch für alle weiteren Unterseiten gilt.&lt;br /&gt;
 Redirect 301 / http://www.domain-b.de/&lt;br /&gt;
&lt;br /&gt;
Alternative Lösung mittels RewriteCond / RewriteRule:&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{HTTP_HOST} domain-a.de$ [NC]&lt;br /&gt;
 RewriteRule ^(.*) http://www.domain-b.de/$1 [R=301,L]&lt;br /&gt;
&lt;br /&gt;
URLs ohne www. auf URLs mit www. weiterleiten&lt;br /&gt;
&lt;br /&gt;
Standard Domain definieren und Aufrufe einer URL ohne die Subdomain www. auf die entsprechende URL mit www. weiterleiten um z.B. doppelte Inhalte für Suchmaschinen zu vermeiden.&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^domain.de$ [NC]&lt;br /&gt;
 RewriteRule (.*) http://www.domain.de/$1 [R=301,L]&lt;br /&gt;
&lt;br /&gt;
Alle Unterseiten auf Startseite weiterleiten&lt;br /&gt;
&lt;br /&gt;
Alle Aufrufe auf Unterseiten einer Domain mit Ausnahme der index.html, der Style.css sowie aller Dateien im Ordner /img/ auf die Startseite weiterleiten.&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteBase /&lt;br /&gt;
 RewriteCond %{REQUEST_URI} !^/(index\.html|style\.css)?$ [NC]&lt;br /&gt;
 RewriteCond %{REQUEST_URI} !^/img(/|$) [NC]&lt;br /&gt;
 RewriteRule ^.*$ /index.html [L,R=301]&lt;br /&gt;
URL mit Parameter weiterleiten&lt;br /&gt;
&lt;br /&gt;
Aufrufe von URLs welche einen bestimmten Parameter (z.B. test) enthalten, unabhängig von dessen Wert, auf ein Verzeichnis (z.B. /verzeichnis/) oder eine Unterseite weiterleiten.&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{QUERY_STRING} ^test=(.*)$&lt;br /&gt;
 RewriteRule ^(.*)$ /verzeichnis/? [R=301,L]&lt;br /&gt;
&lt;br /&gt;
URLs mit einem bestimmten Parameterwert weiterleiten (In diesem Fall Wert &amp;quot;test&amp;quot; für den Parameter &amp;quot;s&amp;quot; auf das Verzeichnis &amp;quot;test&amp;quot; weiterleiten).&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{QUERY_STRING} ^s=test$&lt;br /&gt;
 RewriteRule ^(.*)$ /test/? [R=301,L]&lt;br /&gt;
Parameter aus URL entfernen&lt;br /&gt;
&lt;br /&gt;
Aufrufe von URLs welche einen bestimmten Parameter (z.B. www.domain.de/verzeichnis/?test=...) enthalten, unabhängig von dessen Wert, auf die selbe URL ohne Parameter am Ende (z.B. www.domain.de/verzeichnis/) weiterleiten bzw. den den Parameter aus der URL entfernen. Falls die Regel nur für einen bestimmten Parameter Wert gelten soll, kann der Code analog zum vorherigen Beispiel modifiziert werden.&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{QUERY_STRING} test=(.*)$&lt;br /&gt;
 RewriteRule ^(.*)$ /$1? [R=301,L] &lt;br /&gt;
&lt;br /&gt;
===== Allgemeines =====&lt;br /&gt;
&lt;br /&gt;
Die Weiterleitung von Domains und Anfragen zu einzelnen Webseiten ist eine der Hauptanwendungen der .htaccess Datei. Das notwendige Apache Modul mod_rewrite ist in unseren Hosting Tarifen vorhanden. &lt;br /&gt;
&lt;br /&gt;
Die Weiterleitung muss jedoch in der .htaccess Datei zunächst mit folgendem Eintrag aktiviert werden (in den weiteren Beispielen haben wir diese Zeile weggelassen):&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
301 oder 302 Weiterleitung?&lt;br /&gt;
&lt;br /&gt;
Der Weiterleitung (Redirect) sollte man noch einen Statuscode mitgeben: 301 oder 302. Worin liegt der Unterschied? &lt;br /&gt;
&lt;br /&gt;
 301: die Weiterleitung ist dauerhaft, z.B. weil die Navigationsstruktur einer Webseite umgestellt wurde&lt;br /&gt;
&lt;br /&gt;
 302: die Weiterleitung erfolgt nur vorübergehend, anschließend gilt wieder die bisherige Adresse&lt;br /&gt;
&lt;br /&gt;
Am Ende der RewriteRule Zeile wird der Code für die Weiterleitung (Redirect) in eckigen Klammern angegeben. Mit dem zusätzlichen Parameter L (Letzter, Last) kann man festlegen, dass die weiteren Anweisungen in der .htaccess Datei ignoriert werden sollen. Hierzu ein Beispiel:&lt;br /&gt;
&lt;br /&gt;
 RewriteRule ^neues\.html$ /aktuelles.html [R=301,L]&lt;br /&gt;
Damit wird die Seite domain.tld/neues.html dauerhaft auf domain.tlld/aktuelles.htmlweitergeleitet.&lt;br /&gt;
&lt;br /&gt;
Die Schreibweise der Rewrite Regeln basiert dabei auf &amp;quot;Regulären Ausdrücken&amp;quot; (Regular Expressions, regex). &lt;br /&gt;
&lt;br /&gt;
Mit den Zeichen ^ und $ wird Anfang und Ende der umzuleitenden Seite gekennzeichnet. Der Punkt . steht in regulären Ausdrücken für ein beliebiges Zeichen, wenn wir wirklich einen Punkt meinen, dann wird dies mit einem Backslash \ gekennzeichnet (\ bedeutet also: exakt das nächste Zeichen).&lt;br /&gt;
&lt;br /&gt;
====Besonderheit: Anker auf einer Seite====&lt;br /&gt;
&lt;br /&gt;
Auf einer Webseite können &amp;quot;Anker&amp;quot; als Sprungmarke gesetzt sein. Beim Aufruf wird im Browser nicht auf den Anfang der Seite sondern direkt zum Ankerpunkt gesprungen. Der Anker wird durch ein Hash-Zeichen # in der URL gefolgt vom Namen der Sprungmarke gekennzeichnet. Beispiel für eine Adresse mit Anker:&lt;br /&gt;
&lt;br /&gt;
 domain.tld/aktuelles.html#artikel25&lt;br /&gt;
Soll per .htaccess Weiterleitung direkt auf eine Sprungmarke verwiesen werden, muss der zusätzliche Parameter NE (No Encoding) in eckigen Klammern angegeben werden:&lt;br /&gt;
&lt;br /&gt;
 RewriteRule ^neues\.html$ /aktuelles.html#artikel25 [R=301,L,NE]&lt;br /&gt;
Domain auf verschlüsselte Verbindung umleiten&lt;br /&gt;
&lt;br /&gt;
Sollen alle Seiten einer Domain ausschließlich über eine SSL-Verbindung aufgerufen werden, so kann dies über einen Eintrag in der .htaccess Datei im Startverzeichnis der Domain eingerichtet werden:&lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{SERVER_PORT} !^443$&lt;br /&gt;
 RewriteRule (.*) https://%{HTTP_HOST}/$1 [L]&lt;br /&gt;
In der ersten Zeile wird die Funktion zum Umschreiben von URLs im Apache Webserver aktiviert. In der zweiten Zeile wird die Bedingung definiert &amp;quot;Wenn der Aufruf nicht auf Port 443 erfolgt&amp;quot; (Port 443 wird für SSL-Verschlüsselung verwendet, Port 80 für unverschlüsselte Aufrufe). Zeile 3 ist die Regel für das Umschreiben der URL. Wenn die Bedingung aus Zeile 2 zutrifft, werden die Aufrufe einer beliebigen Seite auf die gleiche Domain (${HTTP_HOST}) jedoch über das https:// Protokoll umgeleitet. Mit /$1 wird die ursprüngliche URL (z.B. impressum.html) an den Domainnamen angefügt. Mit dem Parameter [L] wird angegeben, dass das Umschreiben der URLs hier enden soll, weitere Zeilen in der .htaccess Datei werden also ignoriert.&lt;br /&gt;
&lt;br /&gt;
====Domain name-of-domain.net nach name-der-domain.de umleiten====&lt;br /&gt;
&lt;br /&gt;
Oftmals werden für ein Projekt mehrere Domains registriert, um verschiedene Schreibweisen abzudecken. Nach außen wird eine Hauptdomain kommunziert (Beispiel: name-der-domain.de als Hautpdomain, dazu name-of-domain.net als Zusatzdomains). &lt;br /&gt;
&lt;br /&gt;
Mit folgendem Eintrag in der .htaccess Datei werden alle Aufrufe für name-of-domain.net nach name-der-domain.de weitergeleitet:&lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net$ [NC]&lt;br /&gt;
 RewriteRule ^(.*)$ http://www.name-der-domain.de/$1 [R=301,L]&lt;br /&gt;
Die Weiterleitung nach name-der-domain.de erfolgt dabei mit dem Statuscode 301 (permanent), so dass auch in Suchmaschinen auf Dauer nur diese erscheint. Dadurch werden Probleme mit &amp;quot;doppeltem Inhalt&amp;quot; (Duplicate Content) vermieden. Alle bei der ursprünglichen Domain übermittelten Parameter werden an die Zieldomain weitergegeben.&lt;br /&gt;
&lt;br /&gt;
====Einer Domain immer www. voranstellen====&lt;br /&gt;
&lt;br /&gt;
Mit folgendem Eintrag in der .htaccess Datei werden alle Aufrufe für eine Domain ohne www auf die Variante mit www weitergeleitet:&lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^name-der-domain\.de$ [NC]&lt;br /&gt;
 RewriteRule ^(.*)$ http://www.name-der-domain.de/$1 [R=301,L]&lt;br /&gt;
Die Weiterleitung nach www.name-der-domain.de erfolgt dabei mit dem Statuscode 301 (permanent), so dass auch in Suchmaschinen auf Dauer nur diese erscheint.&lt;br /&gt;
&lt;br /&gt;
====Domain auf eine Seite leiten====&lt;br /&gt;
&lt;br /&gt;
Bestimmte Domains oder Subdomains sollen entweder mit oder ohne www auf eine bestimmte Unterseite weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
Dazu fügen Sie folgende Zeilen in Ihre .htaccess ein:&lt;br /&gt;
&lt;br /&gt;
 #Ohne realurl: &lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de &lt;br /&gt;
 RewriteRule ^$ /index.php?id=85 &lt;br /&gt;
&lt;br /&gt;
 #oder realurl/simulatestatic mit html Suffix: &lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de &lt;br /&gt;
 RewriteRule ^$ /unterseite.html &lt;br /&gt;
&lt;br /&gt;
 #oder realurl ohne html Suffix: &lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^(www\.)?name-der-domain\.de &lt;br /&gt;
 RewriteRule ^$ /unterseite/ &lt;br /&gt;
&lt;br /&gt;
====Weiterleitung auf eine andere Domain zu einer Unterseite====&lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^(www\.)?name-of-domain\.net [NC]&lt;br /&gt;
 RewriteRule ^(.*)$ http://www.name-der-domain.de/unterseite.hmtl [R=301,L] &lt;br /&gt;
 Redirect mit ? in der URL&lt;br /&gt;
&lt;br /&gt;
http://www.domainname.de/index.php?id=7&lt;br /&gt;
soll nach&lt;br /&gt;
&lt;br /&gt;
http://www.domainname.de/impressum.html&lt;br /&gt;
umgeleitet werden. Das Problem ist das ? in der alten URL und muss per QUERY_STRING in der Condition abgefragt werden. &lt;br /&gt;
Lösung:&lt;br /&gt;
&lt;br /&gt;
 RewriteCond %{QUERY_STRING} ^id=7$&lt;br /&gt;
 RewriteRule ^.*$ http://www.domainname.de/impressum.html? [L,R=301]&lt;br /&gt;
Wichtig ist auch der Browser-Cache. Der sollte unbedingt geleert werden, denn wenn ein Aufruf noch im Cache drin ist kann dadurch u.U. immer auf die falsche Seite leiten.&lt;br /&gt;
&lt;br /&gt;
So verhindert man, dass alte durch einen Umzug oder Neuprogrammierung nicht mehr vorhandene URLs in den Suchmaschinen zu einem schlechteren Ranking &lt;br /&gt;
=== Weitere Beispiele (älter) ===&lt;br /&gt;
&lt;br /&gt;
Hinweis: eine Alternative hierfür ist eine PHP Weiterleitung ([[PHP - Tipps und Tricks]])&lt;br /&gt;
Quelle Dr.Web 28.12.2006&lt;br /&gt;
&lt;br /&gt;
Sie können sowohl Zugriffe auf bestimmte Dateien als auch auf Verzeichnisse bequem weiterleiten. Das klappt innerhalb der eigenen Domain, aber auch mit externen Verweisen.&lt;br /&gt;
&lt;br /&gt;
Die Datei .htaccess kann mit jedem Text-Editor bearbeitet werden. Eine Umleitung könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
 Redirect /beispielverzeichnis http://www.drweb.de&lt;br /&gt;
&lt;br /&gt;
Ruft jemand die URL http://www.drweb.de/beispielverzeichnis auf landet er ohne weiteren Zwischenstopp direkt auf der Startseite.&lt;br /&gt;
&lt;br /&gt;
Mit Einzeldateien klappt es auch:&lt;br /&gt;
&lt;br /&gt;
 Redirect /beispielseite.shtml http://www.drweb.de&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 Redirect /beispielseite.shtml neueseite.shtml&lt;br /&gt;
&lt;br /&gt;
Wer mag, kann die gesamte Domain auf eine andere umleiten&lt;br /&gt;
&lt;br /&gt;
 Redirect / http://www.drweb.de/&lt;br /&gt;
&lt;br /&gt;
Nützlich während Bauarbeiten, bei Reparaturen oder wenn Dateien durch andere ersetzt wurden. Da die Umleitung serverseitig geschieht, spielt der Browser des Besuchers keine Rolle.&lt;br /&gt;
&lt;br /&gt;
Weitere nützliche Beispiele:&lt;br /&gt;
&lt;br /&gt;
Den Domainnamen ohne www auf den mit www umleiten. Es wird der Code 301 mitgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
RewriteCond %{HTTP_HOST} !^www\. [NC]&lt;br /&gt;
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Weiterleitung auf sichere Verbindung (https) ===&lt;br /&gt;
== Umleitung auf https ==&lt;br /&gt;
Sichere Seiten sind seid 2019 Standard und quasi Pflicht. Mit diesem Code kann man von http auf https weiterleiten und gibt einen 301 (Moved Permanently) Header mit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
  # Enable URL rewriting&lt;br /&gt;
  RewriteEngine On&lt;br /&gt;
  # Redirect to https&lt;br /&gt;
  RewriteCond %{SERVER_PORT} !^443$&lt;br /&gt;
  RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Moved Permanently 301 Redirect ===&lt;br /&gt;
Quelle:http://www.fladi.de/2008/04/28/howto-webseiten-redirect-mit-301/ (25.7.2008)&lt;br /&gt;
&lt;br /&gt;
Was ist ein 301 redirect?&lt;br /&gt;
&lt;br /&gt;
301 redirect ist die wohl beste Möglichkeit das aktuelle Suchmaschinenranking beim Umzug einer Seite oder des gesamten Webauftritts zu behalten. Der Code “301″ steht für “moved permanently” (dauerhaft verschoben). Ein solches Redirect wird in der .htaccess Datei eintragen. Es trägt die Form (alles in einer Zeile):&lt;br /&gt;
&lt;br /&gt;
 redirect 301 pfad/alte/seite/datei.html http://www.domain.de/pfad/neue/seite/datei.html &lt;br /&gt;
&lt;br /&gt;
Beachte, kein “http://www” in das erste Statement zu schreiben. Es muss der komplette Pfad vom Root deines Webservers angegeben werden. Schauen wir uns die Zeile nun nochmal genauer an:&lt;br /&gt;
&lt;br /&gt;
    * “redirect 301″ - die eigentliche Anweisung für den Webserver&lt;br /&gt;
    * “/pfad/alte/seite/datei.html” - die Seite die umgeleitet werden soll&lt;br /&gt;
    * “http://www.domain.de/pfad/neue/seite.datei.html” - die komplette neue URL&lt;br /&gt;
&lt;br /&gt;
Wie reagiert nun ein Suchmaschinen-Spider auf eine solche Umleitung? Die .htaccess wird ja nicht vom Spider ausgelesen, sondern vom Webserver “ausgeführt”. Der Spider jedoch erkennt den Statuscode, den der Webserver liefert. Beim nächsten Update seiner Datenbank sollte die Suchmaschine nun die alte URL aus dem Index werfen und die neue aufnehmen. Häufig kommt es aber auch vor, dass alte und neue URL gemischt auftauchen. Auch leichte Änderungen im Pagerank können auftreten. Es dauert so ca. 6-8 Wochen bis sich die Änderungen an der Seite auch in den Suchergebnissen niederschlagen.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten von 301 redirect:&lt;br /&gt;
&lt;br /&gt;
   1. Um ALLE Dateien Deiner Domain mithilfe einer .htaccess umzuleiten kannst Du (auf einem Unix/Linux-Webserver) i.d.R. folgendes verwenden:&lt;br /&gt;
 redirect 301 ^(.*)$ http://www.domain.de&lt;br /&gt;
 redirectMatch permanent ^(.*)$ http://www.domain.de&lt;br /&gt;
&lt;br /&gt;
Um Deine alte Startseite (index.html) umzuleiten:&lt;br /&gt;
 redirect 301 /index.html http://www.domain.de/index.html&lt;br /&gt;
 redirect permanent /index.html http://www.domain.de/index.html&lt;br /&gt;
&lt;br /&gt;
2. Wenn Du http://domain.de auf http://www.domain.de umleiten möchtest und mod_rewrite auf dem Webserver verfügbar ist, erreichst Du dies durch folgende .htaccess:&lt;br /&gt;
&lt;br /&gt;
 Options +FollowSymLinks&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^domain\.de&lt;br /&gt;
 RewriteRule ^(.*)$ http://www.domain.de/$1 [R=permanent,L]&lt;br /&gt;
&lt;br /&gt;
 oder&lt;br /&gt;
&lt;br /&gt;
 Options +FollowSymLinks&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteCond %{HTTP_HOST} ^domain\.de$ [NC]&lt;br /&gt;
 RewriteRule ^(.*)$ http://www.domain.de/$1 [R=301,L]&lt;br /&gt;
&lt;br /&gt;
3. Alle .html Dateien auf .php Dateien umzuleiten ist durch mod_rewrite auch kein großes Problem:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine on&lt;br /&gt;
 RewriteBase /&lt;br /&gt;
 RewriteRule (.*).html$ /$1.php&lt;br /&gt;
&lt;br /&gt;
4. Um ein Verzeichnis und alles darunter umzuleiten:&lt;br /&gt;
&lt;br /&gt;
 redirectMatch 301 ^/verzeichnis-alt/(.*) http://www.domain.de/verzeichnis-neu/&lt;br /&gt;
&lt;br /&gt;
=== Warum nicht per META-Tag redirect machen? ===&lt;br /&gt;
&lt;br /&gt;
Die Umleitung per META-Tag erfolgt direkt in der aufgerufenen Seite. Dort wird im HEAD-Teil&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;meta http-equiv=”refresh” content=”0; url=http://www.domain.de/”&amp;gt;&lt;br /&gt;
eingetragen. Hierbei bewirkt das “content=10″, dass der Browser nach 10 Sekunden die darauffolgende URL aufruft. Wenn man “content=0″ einträgt wird die Umleitung sofort ausgeführt. Ein paar alte Browser unterstützen diese Art der Umleitung nicht. Deshalb ist es besser noch zusätzlich den Link (neue Domain) mit anzugeben.&lt;br /&gt;
&lt;br /&gt;
Technisch gesehen liefert die angefragte Seite, wie auch die Seite auf die umgeleitet wird, einen Statuscode “200 OK” zurück. Es sind also zwei unabhängige Seiten. Dementsprechend versucht die Suchmaschinen auch beide Seiten zu indizieren. Hier genau liegt aber das Problem. Denn der Spider des Suchmaschinenbetreibers erkennt die Umleitung und wertet Deine Seite deshalb u.U. ab, da es sich um eine beliebte SPAM-Methode handelt. So könnte man 1000 Domains mit solchen Seiten und jeder Menge Keywords einrichten. Echte Besucher (kein Spider) werden umgeleitet auf die eigentliche Seite. Indiziert wird aber nicht nur die eigentliche Seite sondern auch die 1000 Domains mit Keywords, die meist gar nichts mit dem eingentlichen Inhalt zu tun haben.&lt;br /&gt;
&lt;br /&gt;
Beim 301 redirect wird hingegen nur die echte Zielseite in den Index aufgenommen und durch den Statuscode kann der Suchmaschinenbetreiber zusätzlich noch die veralteten Seite aus dem Index werfen. Dies ist also der beste Weg um alte Seiten auf neue umzuleiten und gleichzeitig wird auch der Page Rank mit übertragen.&lt;br /&gt;
&lt;br /&gt;
===Weiterleitung über IP===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Options +FollowSymlinks&lt;br /&gt;
RewriteEngine on&lt;br /&gt;
&lt;br /&gt;
#IP Bedingung&lt;br /&gt;
RewriteCond %{REMOTE_HOST} ^85\.13\.128\.137&lt;br /&gt;
&lt;br /&gt;
#Zielseite erlauben&lt;br /&gt;
RewriteCond %{REQUEST_URI} !/ip-remote\.php$&lt;br /&gt;
&lt;br /&gt;
#Umleiten&lt;br /&gt;
#RewriteRule ^/* http://demo.webmynet.de/ip-remote.php [R,NE,NC]&lt;br /&gt;
RewriteRule /(.*)$ /ip-remote.php [R=302,L]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erlaubte Anweisungen in .htaccess-Dateien ==&lt;br /&gt;
&lt;br /&gt;
http://de.selfhtml.org/servercgi/server/htaccess.htm&lt;br /&gt;
&lt;br /&gt;
Auszug (Datum des Zugriffs: 10.9.2007): &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Die Anweisung AllowOverride kann nicht innerhalb einer .htaccess notiert werden, sondern wird ausschließlich vom Server-Administrator in der zentralen Konfigurationsdatei vorgegeben. Um den AllowOverride-Wert in Erfahrung zu bringen, benötigen Sie Einsicht in die Serverkonfiguration. Kontaktieren Sie dazu gegebenenfalls Ihren Webhosting-Provider. Dieser kann den Wert auch ändern, falls Sie bestimmte bisher nicht erlaubte Anweisungen verwenden möchten. Im einzelnen gibt es dafür folgende mögliche Werte:&lt;br /&gt;
&lt;br /&gt;
    * Mit AllowOverride None wird der Webserver angewiesen, .htaccess-Dateien zu ignorieren. Das ist im Übrigen die Voreinstellung.&lt;br /&gt;
    * Mit AllowOverride All wird festgelegt, dass in einer .htaccess-Datei (so gut wie) sämtliche zentrale Vorgaben überschrieben und damit abgeändert werden dürfen. Das kann bedeuten, dass Vorhaben, die eigentlich verboten sind (beispielsweise die Ausführung von CGI-Scripts), mit Hilfe einer .htaccess-Datei erlaubt werden. Als Server-Administrator werden Sie diese Anweisung also nur sehr vorsichtig einsetzen.&lt;br /&gt;
    * Mit AllowOverride Options wird festgelegt, dass in einer .htaccess-Datei nach unten Anweisungen zur Steuerung spezieller Verzeichniseigenschaften zulässig sind.&lt;br /&gt;
    * Mit AllowOverride Limit wird festgelegt, dass in einer .htaccess-Datei nach unten Zugriffe von bestimmten Hosts erlaubt oder untersagt werden können.&lt;br /&gt;
    * Mit AllowOverride Indexes wird festgelegt, dass in einer .htaccess-Datei nach unten Anweisungen zur Steuerung von Verzeichnisindizes zulässig sind.&lt;br /&gt;
    * Mit AllowOverride FileInfo wird festgelegt, dass in einer .htaccess-Datei Anweisungen zur Akzeptanz bestimmter Dokumenttypen zulässig sind - beispielsweie, um nach unten Individuelle Fehlermeldungen ausgeben zu können.&lt;br /&gt;
    * Mit AllowOverride AuthConfig wird festgelegt, dass in einer .htaccess-Datei Autorisierungsanweisungen stehen dürfen - das betrifft beispielsweise Regelungen zum nach unten Passwortschutz.&lt;br /&gt;
&lt;br /&gt;
Diese Werte können auch miteinander kombiniert werden. All ist der mächtigste Parameter, mit dem alles das zugelassen wird, was die anderen Parameter steuern.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nach dem Ändern muß natürlich der Server neu gestartet werden (bei Debian: apache restart)&lt;br /&gt;
&lt;br /&gt;
==IP Adressen sperren==&lt;br /&gt;
&lt;br /&gt;
Manchmal ist es notwendig, bestimmte IP Adressen vom Aufruf der Webseite auszusperren, z.B. bei einem Angriffsversuch auf die Webseite. Über folgenden Eintrag in der .htaccess Datei (z.B. vor dem Eintrag &amp;#039;RewriteEngine On&amp;#039;) im Startverzeichnis der Seite lassen sich unerwünschte Besucher abweisen:&lt;br /&gt;
&lt;br /&gt;
 order allow,deny &lt;br /&gt;
 deny from 192.168.2.17 &lt;br /&gt;
 deny from 10.10.20.63 &lt;br /&gt;
 allow from all&lt;br /&gt;
Bei mehreren IP Adressen wird jede in eine eigene Zeile eingetragen. Die Einstellung gilt auch für alle Unterverzeichnisse. Wenn jemand mit einer gesperrten Adresse versucht, die Seite aufzurufen, erhält er einen 403 Fehlercode.&lt;br /&gt;
&lt;br /&gt;
==HTML5 Videos / bestimmte Dateitypen zulassen ==&lt;br /&gt;
&lt;br /&gt;
Falls es in einzelnen Browsern zu Problemen beim Abspielen von per HTML5 eingebundenen Videos kommt, helfen eventuell folgende Zeilen in der .htaccess Datei im Projektverzeichnis:&lt;br /&gt;
&lt;br /&gt;
 AddType video/ogg .ogm &lt;br /&gt;
 AddType video/ogg .ogv &lt;br /&gt;
 AddType video/ogg .ogg &lt;br /&gt;
 AddType video/webm .webm &lt;br /&gt;
 AddType audio/webm .weba &lt;br /&gt;
 AddType video/mp4 .mp4 &lt;br /&gt;
 AddType video/x-m4v .m4v&lt;br /&gt;
&lt;br /&gt;
== htaccess für Typo3 ==&lt;br /&gt;
&lt;br /&gt;
http://www.typo3lexikon.de/server/htaccess.html (11/2014)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.htaccess für TYPO3&lt;br /&gt;
Ich möchte auf dieser Seite nicht erklären wie .htaccess-Dateien erstellt werden. Nein. Davon gibt es schon zu genüge Dokumentationen im Web:&lt;br /&gt;
&lt;br /&gt;
Allgemeines zu htaccess&lt;br /&gt;
&lt;br /&gt;
URLs manipulieren&lt;br /&gt;
&lt;br /&gt;
Reguläre Ausdrücke&lt;br /&gt;
&lt;br /&gt;
htaccess Beispiele&lt;br /&gt;
&lt;br /&gt;
Auf dieser Seite geht es mehr um das Zusammenspiel von TYPO3 und htaccess-Dateien gerade in Bezug unter der Verwendung von der Extension RealUrl. In den nächsten Zeilen werde ich Euch meine htaccess-Datei in Detail näher erklären:&lt;br /&gt;
&lt;br /&gt;
RewriteEngine&lt;br /&gt;
Mit RewriteEngine kannst Du das Modifizieren von URLs de- bzw. aktivieren. Erst wenn diese Option aktiviert ist, kannst du z.B. alle Anfragen, die an Deinen Server gesendet werden auf eine völlig andere Webseite umleiten.&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
Bestimmte Verzeichnisse nicht umschreiben&lt;br /&gt;
Wenn Ihr RealUrl installiert habt, dann erhaltet Ihr je nach Konfiguration URLs wie&lt;br /&gt;
&lt;br /&gt;
/meine-seite/kontakt/impressum.html&lt;br /&gt;
Dabei sind die vermeintlichen Ordner gar keine echten Ordner auf dem Server, sondern Informationen, die an die index.php weitergeleitet werden, um dann die gewünschte Seite aufrufen zu können. Was aber, wenn wir wirklich mal einen Ordner auf dem Server öffnen wollen? Dann darf dieser Name des Ordner NICHT an die index.php weitergeleitet werden. Um das zu erreichen verwende ich das Script aus der RealUrl-Dokumentation:&lt;br /&gt;
RewriteRule ^typo3$ - [L]&lt;br /&gt;
RewriteRule ^typo3/.*$ - [L]&lt;br /&gt;
RewriteRule ^uploads/.*$ - [L]&lt;br /&gt;
RewriteRule ^fileadmin/.*$ - [L]&lt;br /&gt;
RewriteRule ^typo3conf/.*$ - [L]&lt;br /&gt;
Hinweis&lt;br /&gt;
[L] bedeutet, dass nach dieser Umschreibung der URL keine weiteren Umschreibungen mehr ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Der Bindestrich (-) bedeutet, dass keine Umschreibung der URL stattfinden soll.&lt;br /&gt;
&lt;br /&gt;
Doppelter Content&lt;br /&gt;
Wer von Euch seine Seite schon mal mit www.seitwert.de bewertet hat, wird bestimmt schon mal über den Eintrag bzgl. doppelten Content/Inhalt gestoßen sein. So kommt es je nach Konfiguration vor, dass eine Seite wie sfroemken.de das Gleiche anzeigt wie www.sfroemken.de. Dieses &amp;quot;Problem&amp;quot; kann sich auch negativ auf die Position in den Suchergebnissen auswirken. Aber auch das lässt sich mit Hilfe der htaccess-Datei bereinigen:&lt;br /&gt;
&lt;br /&gt;
RewriteCond  %{HTTP_HOST} ^sfroemken\.de$ [NC]&lt;br /&gt;
RewriteRule ^(.*)$ www.sfroemken.de/$1 [R=301,L]&lt;br /&gt;
Erklärung&lt;br /&gt;
%{HTTP_HOST} kann in diesem Fall sfroemken.de oder aber auch www.sfroemken.de sein. Mit RewriteCond könnt Ihr nun überprüfen, ob der HTTP_HOST mit dem Wert sfroemken.de übereinstimmt. Dank [NC] soll die Groß- und Kleinschreibung bei diesem Vergleich nicht berücksichtigt werden.&lt;br /&gt;
&lt;br /&gt;
Wenn RewriteCond nun ein true zurück gibt, dann wird die Modifikation in RewriteRule ausgeführt. Alles was durch die Klammern markiert wurde, kann im zweiten Parameter mit $1 wiederverwendet werden. [R=301]: Das R steht für redirect und die 301 ist ein bestimmter Servercode, mit dem bestimmt wird, dass es sich bei dieser Weiterleitung um eine parmanente Weiterleitung handelt.&lt;br /&gt;
&lt;br /&gt;
So wird aus&lt;br /&gt;
&lt;br /&gt;
sfroemken.de/kontakt/index.php&lt;br /&gt;
ein&lt;br /&gt;
&lt;br /&gt;
www.sfroemken.de/kontakt/index.php&lt;br /&gt;
Subdomains&lt;br /&gt;
Bei Subdomains müssen wir das genau andersrum machen. Dort gibt es kein www. Da www.seitwert.de aber trotzdem überprüft, ob die Domain auch mit einem www davor erreichbar ist, müssen wir das folgendermaßen abfangen:&lt;br /&gt;
&lt;br /&gt;
RewriteCond  %{HTTP_HOST} ^www\.typo3\.sfroemken\.de$ [NC]&lt;br /&gt;
RewriteRule ^(.*)$ typo3.sfroemken.de/$1 [R=301,L]&lt;br /&gt;
Ordner&lt;br /&gt;
Leider haben sich viele Surfer daran gewöhnt Ordner auf einem Server ohne abschließendem Slash (/) anzugeben. Damit dieser Slash automatisch hinten dran gemacht wird, können wir folgendes Script verwenden:&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule (.*[^/])$ %{HTTP_HOST}/$1/ [L,R]&lt;br /&gt;
Erklärung&lt;br /&gt;
Die ersten beiden RewriteCond fragen ab, ob es sich bei der aufzurufenden URL nicht um eine Datei handelt und nicht um einen symbolischen Link. Wenn beides zutrifft, kann getrost ein zusätzlicher Slash hinten angefügt werden.&lt;br /&gt;
&lt;br /&gt;
Achtung&lt;br /&gt;
Wenn Ihr RealUrl so konfiguriert habt, dass Ihr URLs wie&lt;br /&gt;
&lt;br /&gt;
/kontakt/impressum.html&lt;br /&gt;
erhaltet, dann muss das Script noch etwas angepasst werden, dann ansonsten erhaltet Ihr eine URL wie diese hier:&lt;br /&gt;
&lt;br /&gt;
/kontakt/impressum.html/&lt;br /&gt;
Hier das angepasste Script:&lt;br /&gt;
&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} (^.htm$|^.html$)&lt;br /&gt;
RewriteRule (.*[^/])$ %{HTTP_HOST}/$1/ [L,R]&lt;br /&gt;
Heißt: Wenn die URL mit .htm oder .html endet, dann soll der zusätzliche Slash NICHT hinten dran gemacht werden.&lt;br /&gt;
&lt;br /&gt;
Index-Dateien in Ordnern&lt;br /&gt;
Je nach Projekt und Ordner kann es vorkommen, dass Du trotz RealUrl die Index-Dateien in bestimmten Ordnern ausführen möchtest:&lt;br /&gt;
&lt;br /&gt;
/fileadmin/projekt/download/index.php&lt;br /&gt;
Allerdings wird derzeit noch diese URL an die TYPO3-eigene index.php im Rootverzeichnis weitergeleitet. Um auch das zu unterbinden sind folgende 6 Zeilen vorgesehen:&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME}/index.html -f&lt;br /&gt;
RewriteRule / %{REQUEST_URI}/index.html [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME}/index.htm -f&lt;br /&gt;
RewriteRule / %{REQUEST_URI}/index.htm [L]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME}/index.php -f&lt;br /&gt;
RewriteRule / %{REQUEST_URI}/index.php [L]&lt;br /&gt;
URL-Modifikation für RealUrl&lt;br /&gt;
Dieses Script ist das wichtigste Script überhaupt für RealUrl. Hier wird nun endlich gesagt, dass alle Teile aus der URL an die TYPO3-eigene index.php weitergeleitet werden sollen zur Weiterverarbeitung durch RealUrl.&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
RewriteRule .* index.php&lt;br /&gt;
Hinweis&lt;br /&gt;
Je nach Art Eurer TYPO3-Installation könnte es sein, dass Eure index.php ein symbolischer Link ist. In diesem Fall müsst Ihr die letzt Zeile folgendermaßen ändern:&lt;br /&gt;
&lt;br /&gt;
RewriteRule .* /index.php&lt;br /&gt;
Scripmerger&lt;br /&gt;
Dieses Script benötigt Ihr nur, wenn Ihr die Extension scriptmerger verwenden wollt:&lt;br /&gt;
# Expires Header + Removal of ETag&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(ico|png|gif|js|css|jpg|jpeg|swf)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
        ExpiresActive on&lt;br /&gt;
        ExpiresDefault &amp;quot;access plus 7 days&amp;quot;&lt;br /&gt;
        ExpiresDefault &amp;quot;access plus 2 months&amp;quot;&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag&lt;br /&gt;
  FileETag MTime Size&lt;br /&gt;
  &amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
      FileETag none&lt;br /&gt;
      Header unset Last-Modified&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Compressed Content&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.gz\.(js|css)&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
        Header set Content-Encoding gzip&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Shell Restriction auf all-inkl Server ===&lt;br /&gt;
Ab TYPO3 6 moniert das Install Tool das exec nicht augeführt werden darf. Es funktioniert wenn man die cgi Version von PHP nimmt. Das kann man per htaccess oder im KAS Backend einstellen.&lt;br /&gt;
&lt;br /&gt;
Beispiele.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AddHandler php55-cgi .php (sofern vom Server unterstützt)&lt;br /&gt;
AddHandler php54-cgi .php (sofern vom Server unterstützt)&lt;br /&gt;
AddHandler php53-cgi .php&lt;br /&gt;
AddHandler php52-cgi .php&lt;br /&gt;
AddHandler php5-cgi .php (Version entsprechend der PHP Apache-Modul Version)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP Version auf Weiland Servern ===&lt;br /&gt;
 Über die PHP-Versionsauswahl im Kundenmenü können Sie die PHP-Version für eine Domain ändern. Folgende Anleitung erklärt, wie Sie die PHP Version für einzelne Verzeichnisse (und deren Unterverzeichnisse) ändern können.&lt;br /&gt;
&lt;br /&gt;
Das Verzeichnis kann dabei nur eine höhere PHP-Version erhalten, als die PHP-Version, die für die Domain im Kundenmenü eingestellt ist.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet: Ist für die Domain PHP 5.6 im Kundenmenü eingestellt, können Sie für einzelne Verzeichnisse PHP 7.0 und höher einstellen, nicht jedoch niedrigere Versionen wie PHP 5.5. *&lt;br /&gt;
&lt;br /&gt;
Außerdem darf für die Domain kein Fast-CGI aktiviert sein.&lt;br /&gt;
&lt;br /&gt;
Um die PHP-Version für ein Verzeichnis zu ändern, legen Sie eine .htaccess-Datei mit folgender Anweisung in dem Verzeichnis ab. Die Anweisung ist abhängig von der PHP-Version, die Sie aktivieren möchten: &lt;br /&gt;
 AddType application/x-httpd-php72 .php&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=25328</id>
		<title>SVG</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=25328"/>
		<updated>2021-04-28T20:09:00Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: Die Seite wurde neu angelegt: „== Reuse SVG Code == &amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;  &amp;lt;!-- use like this--&amp;gt; &amp;lt;svg style=&amp;quot;width:220px;&amp;quot; viewBox=&amp;quot;0 0 593 90&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fi…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reuse SVG Code ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- use like this--&amp;gt;&lt;br /&gt;
&amp;lt;svg style=&amp;quot;width:220px;&amp;quot; viewBox=&amp;quot;0 0 593 90&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; stroke-miterlimit=&amp;quot;2&amp;quot;&amp;gt;    &lt;br /&gt;
  &amp;lt;use xlink:href=&amp;quot;#svg-wortmarke&amp;quot;&amp;gt;&amp;lt;/use&amp;gt;&lt;br /&gt;
&amp;lt;/svg&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- reusable svg --&amp;gt;&lt;br /&gt;
&amp;lt;svg viewBox=&amp;quot;0 0 593 90&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; fill-rule=&amp;quot;evenodd&amp;quot; clip-rule=&amp;quot;evenodd&amp;quot; stroke-linejoin=&amp;quot;round&amp;quot; stroke-miterlimit=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;g id=&amp;quot;svg-wortmarke&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;path d=&amp;quot;M53.61.853h12.325v37.588h18.058V.853h12.33V88.47h-12.33V50.89H65.935v37.58H53.61V.853zM276.29.853h38.196v12.325h-25.633v23.68h20.379v12.324h-20.38v26.959h27.217V88.47H276.29V.853zM552.43.853h38.204v12.325h-25.629v23.68h20.37v12.324h-20.37v26.959h27.213V88.47H552.43V.853zM42.71 21.352H30.39c.25-6.838-3.413-9.034-8.784-9.034-5.613 0-9.28 1.342-9.28 7.692v49.3c0 6.342 3.667 7.683 9.28 7.683 5.37 0 9.033-2.195 8.783-9.029H42.71c0 14.404-8.292 21.354-21.354 21.354C8.914 89.318.002 83.34.002 69.31v-49.3C.002 5.98 8.914-.007 21.356-.007c13.062 0 21.354 6.954 21.354 21.359M121.36.853h18.796l15.37 87.617H142.96l-3.42-20.138h-17.572c-1.096 6.225-2.316 14.038-3.416 20.138h-12.567L121.36.853zm15.988 55.042c-2.563-15.504-4.146-24.17-6.588-40.03-2.2 13.422-4.4 26.36-6.592 40.03h13.18zM163.6 88.467V.85h23.063c13.058 0 21.354 6.596 21.354 20.138v14.637c0 8.663-3.784 14.65-9.638 17.82 4.884 11.11 10.371 24.038 15.254 35.022h-12.937l-14.033-32.709h-10.738v32.709H163.6zm23.063-45.034c5.37 0 9.154-1.95 9.029-7.808V20.988c.125-5.734-3.78-7.809-9.271-7.809h-10.496v30.254h10.738zM262.72 21.352h-12.325c.25-6.838-3.413-9.034-8.783-9.034-5.613 0-9.275 1.342-9.275 7.692v49.3c0 6.342 3.662 7.683 9.275 7.683 5.37 0 9.033-1.95 8.783-7.929V49.177h-10.004V36.852h22.329v32.212c0 13.667-8.296 20.254-21.35 20.254-12.446 0-21.358-5.979-21.358-20.008v-49.3c0-14.03 8.912-20.017 21.358-20.017 13.054 0 21.35 6.954 21.35 21.359M325.25 88.467V.85h23.058c13.063 0 21.359 6.596 21.359 20.138v14.637c0 8.663-3.784 14.65-9.642 17.82 4.883 11.11 10.37 24.038 15.254 35.022h-12.937l-14.034-32.709h-10.733v32.709H325.25zm23.058-45.034c5.367 0 9.155-1.95 9.03-7.808V20.988c.125-5.734-3.775-7.809-9.271-7.809h-10.492v30.254h10.733zM427.51 21.352h-12.325c.254-6.838-3.413-9.034-8.78-9.034-5.616 0-9.278 1.342-9.278 7.692v49.3c0 6.342 3.662 7.683 9.279 7.683 5.366 0 9.033-2.195 8.779-9.029h12.325c0 14.404-8.296 21.354-21.35 21.354-12.446 0-21.358-5.979-21.358-20.008v-49.3c0-14.03 8.912-20.017 21.358-20.017 13.054 0 21.35 6.954 21.35 21.359M450.72.85v68.582c0 6.338 3.658 7.563 9.275 7.563 5.246 0 9.03-1.825 8.783-7.93V.85h12.325v68.217c0 13.787-8.295 20.254-21.354 20.254-12.45 0-21.358-5.858-21.358-19.888V.85h12.329zM495.78.853h22.82c12.81 0 19.888 7.204 19.888 19.892v8.542c0 5.129-.12 11.47-7.808 13.179 7.446 1.346 9.517 7.57 9.517 14.275v11.841c0 12.692-7.196 19.888-19.888 19.888H495.78V.853zm30.383 19.284c-.116-4.513-2.195-6.959-7.562-6.959h-10.492v23.68h10.492c5.367 0 7.446-2.442 7.562-6.959v-9.762zm1.588 35.87c-.121-4.508-2.071-6.825-7.442-6.825h-12.2v26.959h12.2c5.371 0 7.321-2.438 7.442-6.954v-13.18z&amp;quot; fill=&amp;quot;#fff&amp;quot; fill-rule=&amp;quot;nonzero&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;/g&amp;gt;   &lt;br /&gt;
        &amp;lt;/svg&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25327</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25327"/>
		<updated>2021-04-23T07:49:19Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* MatchMedia aufsetzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
MatchMedia verwaltet bei Resize Events auch die Timelines, killt diese wenn nötig oder erzeugt neue. Das erleichtert unglaublich viel Arbeit.&lt;br /&gt;
&lt;br /&gt;
Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Timeline Animation erstellen&lt;br /&gt;
* ScrollTrigger Konfiguration in Timeline aufsetzen&lt;br /&gt;
* MatchMedia erstellen und Timeline Animation einsetzen.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei MediaQueries umschließt MatchMedia die Animation. Genauer gesagt man übergibt in der MatchMedia Funktion alles was in diesem Query ausgeführt werden soll. MatchMedia überwacht aber auch Veränderungen und setzt alle Animationen zurück, wenn der Query nicht mehr passt. Timelines etc. werden also wieder gekillt und der Urzustand wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
=== MatchMedia aufsetzen ===&lt;br /&gt;
Im Konfigurationsobjekt von MatchMedia übergeben wir als Schlüssel der das MediaQuery enthält. Als Wert übergeben wie eine Funktion. In dieser Funktion werden alle Timelines / Animationen gesetzt die für das Query gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ScrollTrigger.matchMedia({&lt;br /&gt;
  &amp;quot;(minWidth: 800px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for 800px and up go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;(maxWidth: 799px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for smaller screens than 799px go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;all&amp;quot;: function(){&lt;br /&gt;
    // animations valid for all viewport sizes go here&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Probleme mit Inline Styles und mediaQuery beheben - ScrollTrigger.saveStyles() ===&lt;br /&gt;
Manchmal kommt es vor, dass eine &amp;#039;&amp;#039;&amp;#039;Animation einen Inline Style setzt, der ein mediaQuery in CSS &amp;quot;überschreibt&amp;quot;&amp;#039;&amp;#039;&amp;#039;. Wenn man dieses Verhalten nicht möchte und lieber den &amp;#039;&amp;#039;&amp;#039;Zustand beim Laden der Seite herstellen&amp;#039;&amp;#039;&amp;#039; möchte kann man die Funktion saveStyles nutzen. Mit saveStyles kann man vor der Animation den Zustand von DOM-Objekten speichern. GSAP setzt diese dann wieder zurück wenn der MatchMedia Zweig nicht mehr zutrifft.&lt;br /&gt;
 ScrollTrigger.saveStyles(&amp;#039;.myElement, .myOtherElement);&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25326</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25326"/>
		<updated>2021-04-23T07:41:30Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* MatchMedia aufsetzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
MatchMedia verwaltet bei Resize Events auch die Timelines, killt diese wenn nötig oder erzeugt neue. Das erleichtert unglaublich viel Arbeit.&lt;br /&gt;
&lt;br /&gt;
Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Timeline Animation erstellen&lt;br /&gt;
* ScrollTrigger Konfiguration in Timeline aufsetzen&lt;br /&gt;
* MatchMedia erstellen und Timeline Animation einsetzen.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei MediaQueries umschließt MatchMedia die Animation. Genauer gesagt man übergibt in der MatchMedia Funktion alles was in diesem Query ausgeführt werden soll. MatchMedia überwacht aber auch Veränderungen und setzt alle Animationen zurück, wenn der Query nicht mehr passt. Timelines etc. werden also wieder gekillt und der Urzustand wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
=== MatchMedia aufsetzen ===&lt;br /&gt;
Im Konfigurationsobjekt von MatchMedia übergeben wir als Schlüssel der das MediaQuery enthält. Als Wert übergeben wie eine Funktion. In dieser Funktion werden alle Timelines / Animationen gesetzt die für das Query gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ScrollTrigger.matchMedia({&lt;br /&gt;
  &amp;quot;(minWidth: 800px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for 800px and up go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;(maxWidth: 799px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for smaller screens than 799px go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;all&amp;quot;: function(){&lt;br /&gt;
    // animations valid for all viewport sizes go here&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25325</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25325"/>
		<updated>2021-04-23T07:38:42Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* MatchMedia aufsetzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
MatchMedia verwaltet bei Resize Events auch die Timelines, killt diese wenn nötig oder erzeugt neue. Das erleichtert unglaublich viel Arbeit.&lt;br /&gt;
&lt;br /&gt;
Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Timeline Animation erstellen&lt;br /&gt;
* ScrollTrigger Konfiguration in Timeline aufsetzen&lt;br /&gt;
* MatchMedia erstellen und Timeline Animation einsetzen.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei MediaQueries umschließt MatchMedia die Animation. Genauer gesagt man übergibt in der MatchMedia Funktion alles was in diesem Query ausgeführt werden soll. MatchMedia überwacht aber auch Veränderungen und setzt alle Animationen zurück, wenn der Query nicht mehr passt. Timelines etc. werden also wieder gekillt und der Urzustand wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
=== MatchMedia aufsetzen ===&lt;br /&gt;
Im Konfigurationsobjekt von MatchMedia übergeben wir als Schlüssel der das MediaQuery enthält. Als Wert übergeben wie eine Funktion. In dieser Funktion werden alle Timelines / Animationen gesetzt die für das Query gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ScrollTrigger.matchMedia({&lt;br /&gt;
  &amp;quot;(minWidth: 800px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for 800px and up go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;(maxWidth: 799px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for smaller screens than 799px go here&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25324</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25324"/>
		<updated>2021-04-23T07:38:13Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: /* MatchMedia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;br /&gt;
MatchMedia verwaltet bei Resize Events auch die Timelines, killt diese wenn nötig oder erzeugt neue. Das erleichtert unglaublich viel Arbeit.&lt;br /&gt;
&lt;br /&gt;
Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Timeline Animation erstellen&lt;br /&gt;
* ScrollTrigger Konfiguration in Timeline aufsetzen&lt;br /&gt;
* MatchMedia erstellen und Timeline Animation einsetzen.&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie bei MediaQueries umschließt MatchMedia die Animation. Genauer gesagt man übergibt in der MatchMedia Funktion alles was in diesem Query ausgeführt werden soll. MatchMedia überwacht aber auch Veränderungen und setzt alle Animationen zurück, wenn der Query nicht mehr passt. Timelines etc. werden also wieder gekillt und der Urzustand wieder hergestellt.&lt;br /&gt;
&lt;br /&gt;
=== MatchMedia aufsetzen ===&lt;br /&gt;
Im Konfigurationsobjekt von MatchMedia übergeben wir als Schlüssel der das MediaQuery enthält. Als Wert übergeben wie eine Funktion. In dieser Funktion werden alle Timelines / Animationen gesetzt die für das Query gelten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
ScrollTrigger.matchMedia({&lt;br /&gt;
  &amp;quot;(minWidth: 800px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for 800px and up go here&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;(maxWidth: 799px)&amp;quot;: function(){&lt;br /&gt;
    // all animations for smaller screens than 799px go here&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/sytaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25323</id>
		<title>GSAP - ScrollTrigger</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ScrollTrigger&amp;diff=25323"/>
		<updated>2021-04-23T07:09:44Z</updated>

		<summary type="html">&lt;p&gt;109.192.169.230: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Update: Die beste Möglichkeit Scrolling mit Animationen zu verbinden ist mit dem neuen (2020) ScrollTrigger Plugin.&lt;br /&gt;
 https://www.youtube.com/watch?v=X7IBa7vZjmo Intro mit Beispielen&lt;br /&gt;
 https://greensock.com/scrolltrigger Main Page&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger Documentation&lt;br /&gt;
 https://greensock.com/st-mistakes/ Häufige Fehler (auch mit each Schleifen)&lt;br /&gt;
 &lt;br /&gt;
 Obsolet: https://codepen.io/osublake/pen/a633d0c9e6e2b951496d7f1eb4fd8fb6 (ohne ScrollMagic)&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Eine gute Methode vorzugehen:&lt;br /&gt;
* Timeline-Animation ohne ScrollTrigger bauen&lt;br /&gt;
* ScrollTrigger Konfiguration in die Timeline einbauen.&lt;br /&gt;
&lt;br /&gt;
== MatchMedia ==&lt;br /&gt;
Mit MatchMedia kann man unterschiedliche ScrollTrigger für unterschiedliche Bildschirme nutzen.&lt;br /&gt;
 https://greensock.com/docs/v3/Plugins/ScrollTrigger/static.matchMedia()&lt;/div&gt;</summary>
		<author><name>109.192.169.230</name></author>
	</entry>
</feed>