<?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=134.3.86.14</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=134.3.86.14"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/134.3.86.14"/>
	<updated>2026-05-06T13:57:42Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27106</id>
		<title>Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27106"/>
		<updated>2024-05-08T11:57:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Suche dienen.&lt;br /&gt;
&lt;br /&gt;
== Was ist was ==&lt;br /&gt;
=== Admin Center ===&lt;br /&gt;
Zentrale Verwaltung, Billing, Benutzerverwaltung&lt;br /&gt;
&lt;br /&gt;
=== Purview ===&lt;br /&gt;
Compliance Center&lt;br /&gt;
&lt;br /&gt;
=== Azure / Entra ===&lt;br /&gt;
Azure AD heißt jetzt Entra. &lt;br /&gt;
&lt;br /&gt;
=== Exchange ===&lt;br /&gt;
Postfächer etc.&lt;br /&gt;
&lt;br /&gt;
=== Defender ===&lt;br /&gt;
Bedrohungen analysieren und reagieren&lt;br /&gt;
&lt;br /&gt;
== Anmeldung ==&lt;br /&gt;
 https://learn.microsoft.com/de-de/entra/identity/authentication/concept-authentication-methods - Einstieg&lt;br /&gt;
 https://mysignins.microsoft.com/security-info // Self-Service Einstellungen&lt;br /&gt;
&lt;br /&gt;
=== Mehrstufige Authentifizierung (MFA) ===&lt;br /&gt;
 https://www.youtube.com/watch?v=qNndxl7gqVM&lt;br /&gt;
 https://aka.ms/MFASetup - Benutzerregistrierung&lt;br /&gt;
 https://go.microsoft.com/fwlink/?LinkId=627442 Handbuch&lt;br /&gt;
==== Telefon und E-Mail als Administrator festlegen ====&lt;br /&gt;
 Entra Portal &amp;gt; Benutzer &amp;gt; Benutzername &amp;gt; Authentifizierungsmethoden&lt;br /&gt;
&lt;br /&gt;
=== Bedingter Zugriff ===&lt;br /&gt;
=== Kombinierte Anmeldung ===&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
MFA wird erzwungen, obwohl sie deaktiviert ist.&lt;br /&gt;
Mögliche Gründe:&lt;br /&gt;
* Single Sign On&lt;br /&gt;
* Richtlinien für bedingten Zugriff - in Azure können extra Richtlinien unter bestimmten Bedingungen definiert sein (z.b. Anmeldung außerhalb des Unternehmensnetzwerks).&lt;br /&gt;
* Residuale Situationen (alte Richtlinien)&lt;br /&gt;
* Sicherheits (Compliance) Anforderungen Azure / Entra&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27105</id>
		<title>Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27105"/>
		<updated>2024-05-08T10:29:12Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Suche dienen.&lt;br /&gt;
&lt;br /&gt;
== Was ist was ==&lt;br /&gt;
=== Admin Center ===&lt;br /&gt;
Zentrale Verwaltung, Billing, Benutzerverwaltung&lt;br /&gt;
&lt;br /&gt;
=== Purview ===&lt;br /&gt;
Compliance Center&lt;br /&gt;
&lt;br /&gt;
=== Azure / Entra ===&lt;br /&gt;
Azure AD heißt jetzt Entra. &lt;br /&gt;
&lt;br /&gt;
=== Exchange ===&lt;br /&gt;
Postfächer etc.&lt;br /&gt;
&lt;br /&gt;
== Anmeldung ==&lt;br /&gt;
&lt;br /&gt;
=== Mehrstufige Authentifizierung (MFA) ===&lt;br /&gt;
 https://aka.ms/MFASetup - Benutzerregistrierung&lt;br /&gt;
 https://go.microsoft.com/fwlink/?LinkId=627442 Handbuch&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
MFA wird erzwungen, obwohl sie deaktiviert ist.&lt;br /&gt;
Mögliche Gründe:&lt;br /&gt;
* Single Sign On&lt;br /&gt;
* Richtlinien für bedingten Zugriff - in Azure können extra Richtlinien unter bestimmten Bedingungen definiert sein (z.b. Anmeldung außerhalb des Unternehmensnetzwerks).&lt;br /&gt;
* Residuale Situationen (alte Richtlinien)&lt;br /&gt;
* Sicherheits (Compliance) Anforderungen Azure / Entra&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27104</id>
		<title>Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27104"/>
		<updated>2024-05-08T10:21:11Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: Die Seite wurde neu angelegt: „== Quickstart == In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Such…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Suche dienen.&lt;br /&gt;
&lt;br /&gt;
== Anmeldung ==&lt;br /&gt;
=== Mehrstufige Authentifizierung (MFA) ===&lt;br /&gt;
 https://aka.ms/MFASetup - Benutzerregistrierung&lt;br /&gt;
 https://go.microsoft.com/fwlink/?LinkId=627442 Handbuch&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
MFA wird erzwungen, obwohl sie deaktiviert ist.&lt;br /&gt;
Mögliche Gründe:&lt;br /&gt;
* Single Sign On&lt;br /&gt;
* Richtlinien für bedingten Zugriff - in Azure können extra Richtlinien unter bestimmten Bedingungen definiert sein (z.b. Anmeldung außerhalb des Unternehmensnetzwerks).&lt;br /&gt;
* Residuale Situationen (alte Richtlinien)&lt;br /&gt;
* Sicherheits (Compliance) Anforderungen Azure / Entra&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=27103</id>
		<title>Animation im Web</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Animation_im_Web&amp;diff=27103"/>
		<updated>2024-04-25T09:04:01Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In früheren Zeiten war die Standardantwort für &amp;quot;bewegte&amp;quot; Webseiten ganz einfach Flash. Heutzutage gibt es viele Lösungen um Animationen auf eine Webseite zu bringen. Dieser Artikel soll eine kleine Übersicht bringen.&lt;br /&gt;
&lt;br /&gt;
Stichworte: Anime.js, GSAP, CSS Transform, CSS Keyframes, Snap, Waypoints, Lottie, ScrollMagic&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 Siehe auch in den Sections&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
 [[Scroll-Snap]]&lt;br /&gt;
 [[Anime.js]]&lt;br /&gt;
 http://imakewebthings.com/waypoints/guides/getting-started/&lt;br /&gt;
 [[Lottie]]&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
=== GSAP &amp;amp; ScrollMagic ===&lt;br /&gt;
ScrollMagic ist obsolet es gibt bei GSAP ein eigenes Plugin - ScrollTrigger&lt;br /&gt;
 [[GSAP]]&lt;br /&gt;
Gehört zu den Standardlösungen. GSAP - Greensock Animation Plattform bietet JavaScript Tools für Timeline-basierte Animationen. Ergänzend kann ScrollMagic die Steuerung der Timelines basierend auf der Skrollposition der Webseite steuern.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Alle DOM Elemente können animiert werden. Nicht nur in der Bewegung sondern auch in der Farbe, Sichtbarkeit...&lt;br /&gt;
* Gute Performance&lt;br /&gt;
* Mit ScrollMagic einfaches Steuern beim Scrolling inklusive einfaches Pinning (fixieren während der Animation)&lt;br /&gt;
Nachteil: &lt;br /&gt;
* Skriptlastig, wobei es nicht so komplex ist wie bei anderen Lösungen.&lt;br /&gt;
&lt;br /&gt;
=== Vector + AfterFX + Bodymovin + Lottie ===&lt;br /&gt;
 https://www.youtube.com/watch?v=i6qfQ8QDOfs&amp;amp;feature=emb_rel_end&lt;br /&gt;
Ein weiterer vielversprechender Workflow. &lt;br /&gt;
* Vektordateien erstellen &lt;br /&gt;
* In AfterFX importieren. Hier gibt es mehrere Möglichkeiten. Illustrator Dateine kann man direkt importieren, für Sketch gibt es ein Importtool, das auch die Layer mitnimmt. More to check out...&lt;br /&gt;
* Animation in AfterFX erstellen&lt;br /&gt;
* Mit dem AfterFX Bodymovin Plugin exportierst du die Animation als JSON File.&lt;br /&gt;
* Lottie kann die erstellt Datei rendern. Die Lottie Library gibt es für den Browser, aber auch für iOS und Android - dort werden die Dateien Nativ gerendert.&lt;br /&gt;
* Lottie Animationen können auch mit GSAP gesteuert werden.&lt;br /&gt;
 https://greensock.com/forums/topic/18343-timelinemax-scrollmagic-lottie-web-bodymoving-is-it-possible-is-it-necessary/&lt;br /&gt;
 https://www.youtube.com/watch?time_continue=308&amp;amp;v=HeY9qGUT3zQ&amp;amp;feature=emb_logo&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Einfache Erstellung mit AfterFX&lt;br /&gt;
* Natives Rendern in Apps möglich -&amp;gt; gute Performance&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Keine DOM Elemente&lt;br /&gt;
* Player nicht so frei positionierbar.&lt;br /&gt;
&lt;br /&gt;
=== Only CSS ===&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
CSS3 stellt einfache Möglichkeiten zur Verfügung Elemente (auch SVG Pfade) zu animieren.&lt;br /&gt;
Vorteil:&lt;br /&gt;
* Ohne JavaScript&lt;br /&gt;
* Für einfache Animationen einfach zu realisieren&lt;br /&gt;
* Performant wenn Properties verwendet werden, die der Browser nativ rechnen kann (z.B. alle transform Eigenschaften)&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Komplexe Animationen umständlich&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Animation]] &lt;br /&gt;
&lt;br /&gt;
== Animation mit CSS only ==&lt;br /&gt;
 [[CSS Transitions]]&lt;br /&gt;
 [[CSS Animation]]&lt;br /&gt;
&lt;br /&gt;
== Animation mit JavaScript,CSS SVG und Canvas ==&lt;br /&gt;
=== Cooler Triangles Tiles Effekt ===&lt;br /&gt;
http://codepen.io/mistic100/pen/JobPLK (2016-12)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;tiles&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Enhancement of my original &amp;lt;a href=&amp;quot;http://codepen.io/mistic100/pen/GFHkm&amp;quot;&amp;gt;Colorful Tiles&amp;lt;/a&amp;gt; with truly random animation.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;At the end of each cycle (49 steps) a new Perlin noise map is generated.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
body { background:#111; }&lt;br /&gt;
#tiles { margin:0 auto; }&lt;br /&gt;
p { max-width:680px; margin:10px auto; color:white; font:16px &amp;quot;Calibri&amp;quot;, sans-serif; }&lt;br /&gt;
a { color:#3E7289; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function(){&lt;br /&gt;
    if (!SVG.supported) {&lt;br /&gt;
        alert(&amp;#039;SVG not supported !&amp;#039;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // parameters&lt;br /&gt;
    var size = { x: 680, y: 400, tile: 40 },&lt;br /&gt;
        speed = 50,&lt;br /&gt;
        tile_nb = { x: Math.ceil(size.x/size.tile)+1, y: Math.ceil(size.y/size.tile)+1 },&lt;br /&gt;
        colors = [&amp;quot;#ED1156&amp;quot;, &amp;quot;#ED194E&amp;quot;, &amp;quot;#ED2247&amp;quot;, &amp;quot;#ED2B3F&amp;quot;, &amp;quot;#EE3438&amp;quot;, &amp;quot;#EE3D31&amp;quot;, &amp;quot;#EE4529&amp;quot;, &amp;quot;#EF4E22&amp;quot;, &amp;quot;#EF571A&amp;quot;, &amp;quot;#EF6013&amp;quot;, &amp;quot;#F0690C&amp;quot;, &amp;quot;#E8720E&amp;quot;, &amp;quot;#E17B10&amp;quot;, &amp;quot;#D98512&amp;quot;, &amp;quot;#D28E14&amp;quot;, &amp;quot;#CB9816&amp;quot;, &amp;quot;#C3A118&amp;quot;, &amp;quot;#BCAA1A&amp;quot;, &amp;quot;#B4B41C&amp;quot;, &amp;quot;#ADBD1E&amp;quot;, &amp;quot;#A6C721&amp;quot;, &amp;quot;#96C62F&amp;quot;, &amp;quot;#87C53E&amp;quot;, &amp;quot;#78C44D&amp;quot;, &amp;quot;#69C35C&amp;quot;, &amp;quot;#5AC26B&amp;quot;, &amp;quot;#4AC17A&amp;quot;, &amp;quot;#3BC089&amp;quot;, &amp;quot;#2CBF98&amp;quot;, &amp;quot;#1DBEA7&amp;quot;, &amp;quot;#0EBDB6&amp;quot;, &amp;quot;#0EBAB0&amp;quot;, &amp;quot;#0EB8AA&amp;quot;, &amp;quot;#0EB5A4&amp;quot;, &amp;quot;#0EB39E&amp;quot;, &amp;quot;#0EB098&amp;quot;, &amp;quot;#0EAE92&amp;quot;, &amp;quot;#0EAB8C&amp;quot;, &amp;quot;#0EA986&amp;quot;, &amp;quot;#0EA680&amp;quot;, &amp;quot;#0EA47B&amp;quot;, &amp;quot;#269376&amp;quot;, &amp;quot;#3F8372&amp;quot;, &amp;quot;#58736E&amp;quot;, &amp;quot;#71626A&amp;quot;, &amp;quot;#895266&amp;quot;, &amp;quot;#A24262&amp;quot;, &amp;quot;#BB315E&amp;quot;, &amp;quot;#D4215A&amp;quot;],&lt;br /&gt;
        objects = [],&lt;br /&gt;
        values = [],&lt;br /&gt;
        nb_colors = colors.length;&lt;br /&gt;
    &lt;br /&gt;
    // function to generate simplex noise map&lt;br /&gt;
    function generateValues(add) {&lt;br /&gt;
        var values = [], foo,&lt;br /&gt;
            simplex = new SimplexNoise();&lt;br /&gt;
        &lt;br /&gt;
        for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
            for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
                foo = Math.round((simplex.noise(c/10, l/10)+1) / 2 * nb_colors) + add;&lt;br /&gt;
                values.push(foo, foo+1, foo+2, foo+3);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return values;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // init canvas&lt;br /&gt;
    var container = document.getElementById(&amp;#039;tiles&amp;#039;);&lt;br /&gt;
    container.style.width = size.x+&amp;#039;px&amp;#039;;&lt;br /&gt;
    container.style.height = size.y+&amp;#039;px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var paper = SVG(container).size(size.x, size.y),&lt;br /&gt;
        pos, cmd,&lt;br /&gt;
        counter = 0;&lt;br /&gt;
&lt;br /&gt;
    // draw tiles&lt;br /&gt;
    for (var l=0; l&amp;lt;tile_nb.y; l++) {&lt;br /&gt;
        for (var c=0; c&amp;lt;tile_nb.x; c++) {&lt;br /&gt;
            pos = { x: c*size.tile, y: l*size.tile };&lt;br /&gt;
            &lt;br /&gt;
            // tile 1&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile) +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 2&lt;br /&gt;
            cmd = (pos.x+size.tile) +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 3&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ pos.y +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
            // tile 4&lt;br /&gt;
            cmd = pos.x +&amp;#039;,&amp;#039;+ (pos.y+size.tile) +&amp;#039; &amp;#039;+ (pos.x+size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2) +&amp;#039; &amp;#039;+ (pos.x-size.tile/2) +&amp;#039;,&amp;#039;+ (pos.y+size.tile/2);&lt;br /&gt;
            objects.push(paper.polygon(cmd, true));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // cycle colors&lt;br /&gt;
    values[0] = generateValues(0);&lt;br /&gt;
    values[1] = generateValues(nb_colors);&lt;br /&gt;
    &lt;br /&gt;
    setInterval(function() {&lt;br /&gt;
        var idx;&lt;br /&gt;
        for (var i=0, l=objects.length; i&amp;lt;l; i++) {&lt;br /&gt;
            idx = Math.round((values[1][i]-values[0][i]) * counter/(nb_colors-1) + values[0][i]);&lt;br /&gt;
            if (idx &amp;gt;= nb_colors) idx = idx%nb_colors;&lt;br /&gt;
            objects[i].fill(colors[idx]);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        counter++;&lt;br /&gt;
        if (counter == nb_colors) {&lt;br /&gt;
            counter = 1;&lt;br /&gt;
            values[0] = values[1].map(function(v) { return v-nb_colors; });&lt;br /&gt;
            values[1] = generateValues(nb_colors);&lt;br /&gt;
        }&lt;br /&gt;
    }, speed);&lt;br /&gt;
&lt;br /&gt;
    // bug in svg.js&lt;br /&gt;
    var temp = document.getElementById(&amp;#039;SvgjsSvg1002&amp;#039;);&lt;br /&gt;
    temp.parentNode.removeChild(temp);&lt;br /&gt;
}());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27102</id>
		<title>SVG</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27102"/>
		<updated>2024-04-24T17:15:11Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* SVG im img Tag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scale SVG ==&lt;br /&gt;
 https://css-tricks.com/scale-svg/&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/CSS/Scaling_of_SVG_backgrounds&lt;br /&gt;
&lt;br /&gt;
Wir sind Pixelbilder gewöhnt und erwarten beim Skalieren etwas ähnliches wenn wir mit SVG Grafiken arbeitn. SVGs verhalten sich aber nicht wie Pixelbilder und bieten auch andere Möglichkeiten. Wir müssen der SVG Grafik daher mehr Informationen mitgeben.&lt;br /&gt;
&lt;br /&gt;
Eine SVG Grafik ist keine einzelne Datei sondern sie besteht aus mehreren Teilen (Pfade etc.). Jeder dieser Teile kann sich beim Skalieren anders verhalten. Ein Pfad kann z.B. seine Form vergrößern, aber die Linienstärke bleibt unverändert.&lt;br /&gt;
&lt;br /&gt;
Daher müssen wir bei SVG dem Browser genauer mitteilen was wir tun möchten.&lt;br /&gt;
&lt;br /&gt;
=== Lösung Img Tag ? ===&lt;br /&gt;
Solange wir ein img Tag nutzen verhält sich ein SVG Bild genau wie ein Pixelbild. Hier übernimmt der Browser das Handling. Allerdings möchten wir manchmal auf die Einzelteile des SVGs zugreifen (z.B. um einzelne Farben zu verändern, interaktive Charts zu erstellen etc.). &lt;br /&gt;
&lt;br /&gt;
=== SVG Scaling - Übersicht ===&lt;br /&gt;
==== width und height funktionieren nicht ====&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;200&amp;quot; height=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
Gibt nur den Rahmen der Umgebenden Box vor, wenn die SVG Elemente größer sind wird abgeschnitten. Auch umgebende Elemente führen im Zweifel nur zu Scrollbalken. Skalieren funktioniert überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
==== Die Lösung: viewBox - x, y, width, height====&lt;br /&gt;
Das SVG Attribut &amp;#039;&amp;#039;&amp;#039;viewBox definiert den Viewport&amp;#039;&amp;#039;&amp;#039; also den Bezugsrahmen in dem die Elemente platziert sind. Da SVG auch andere Einheiten wie Pixel nutzen kann (z.B. mm etc.) hilft das dem Browser das um am Ende die Ausgabegröße passend zu machen.&lt;br /&gt;
&lt;br /&gt;
 * width und height geben die Größe des Viewports vor. &lt;br /&gt;
Wenn du die &amp;#039;&amp;#039;&amp;#039;Werte so groß wählst wie die Grafik&amp;#039;&amp;#039;&amp;#039; hat der Viewport Platz für alle Elemente. &amp;#039;&amp;#039;&amp;#039;Wenn deine Elemente z.B. mit 10mm x 5mm angelegt sind kannst du 0 0 10 5 angeben&amp;#039;&amp;#039;&amp;#039;. So passt die Grafik genau in den SVG-Viewport. &lt;br /&gt;
&lt;br /&gt;
Widht und Height skalieren nicht die Inhalte. Deshalb musst du sie groß genug wählen dass alles passt. Sonst wird abgeschnitten. Die Werte nutzen wie gesagt die gleiche Einheit in der das SVG Dokument angelegt ist.&lt;br /&gt;
&lt;br /&gt;
x und y definieren den Ursprung des Koordinatensystems im SVG. Wenn das auf 0,0 steht ist der Ursprung oben links. Das wäre der einfachste Fall. Wenn du width und height groß genug gewählt hast siehst du nun das ganze Bild.&lt;br /&gt;
&lt;br /&gt;
Wenn du x erhöhst wird das Koordinatensystem in der Grafik nach rechts geschoben. Das bedeutet Teile der Grafik liegen jetzt evtl. im negativen x-Bereich. Da der Browser das SVG trotzdem am Ursprung beginnend zeichnet wird der linke Teil der Grafik abgeschnitten, rechts bleibt etwas Leerraum.&lt;br /&gt;
&lt;br /&gt;
==== Keine viewBox vorhanden? ====&lt;br /&gt;
Manchmal liefern Grafikprogramme keine viewBox mit aber dafür height und width:&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;1000px&amp;quot; height=&amp;quot;200px&amp;quot;&lt;br /&gt;
Dann kannst du diese Werte in eine viewBox schreiben und dafür width und height leer lassen.&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;0 0 1000 200&amp;quot; width=&amp;quot;&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
Jetzt kann der Browser das Bild richtig anzeigen. Lasse width und height im Zweifel leer. Es kann sein, dass das Bild durch andere Attribute sonst etwas verschoben ist. Einfach mal testen ob sich was verändert.&lt;br /&gt;
&lt;br /&gt;
Sobald das viewBox Attribut passend im SVG ist, hat der Browser die Informationen um es wie ein normales Bild zu behandeln und skaliert das Bild korrekt.&lt;br /&gt;
&lt;br /&gt;
Du kannst auch Leerraum um die Grafik schaffen, wenn du width und height erhöhst und x und y passend verschiebst&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;-10 0 1020 200&amp;quot; &lt;br /&gt;
Hier wird das Koordinatensystem um 10 Einheiten nach links geschoben und um width um 10 erhöht. Dadurch entsteht links und rechts Platz.&lt;br /&gt;
&lt;br /&gt;
==== SVG skalieren wie Bilder ====&lt;br /&gt;
Bei Pixelbildern kann man das width oder height Attribut setzen. die andere Größe wird dann automatisch vom Browser ermittelt. Bei einem SVG geht das - aber nicht so einfach.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SVG im img Tag =====&lt;br /&gt;
Das funktioniert mit width und height in aktuellen Browsern (Stand 2024) eigentlich überall. &lt;br /&gt;
&lt;br /&gt;
Beispiel (SVG img und SVG Inline in aktuellen Browsern)&lt;br /&gt;
 CSS&lt;br /&gt;
 width:100%;&lt;br /&gt;
 height: auto;&lt;br /&gt;
 Attribute:&lt;br /&gt;
 width=&amp;quot;200&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Flex Box =====&lt;br /&gt;
In fast aktuellen Browsern funktioniert die Positionierung in einer flex Box. Eventuell musst du in sofern du paddings verwendest box-sizing auf border-box setzen.&lt;br /&gt;
 &lt;br /&gt;
===== SVG Background Image =====&lt;br /&gt;
Hier kann man den Aspect Ratio Hack nehmen (auch padding-bottom Hack genannt). Dabei wird eine Box erzeugt die immer das richtige Seitenverhältnis hat. Siehe auch aspect-grid in diesem wikie oder der CSS-Tricks Link oben.&lt;br /&gt;
&lt;br /&gt;
===== Inline Code skalieren =====&lt;br /&gt;
Können mittlerweile auch die meisten Browser. Setze die viewBox und einen der Attribute width oder height.&lt;br /&gt;
&lt;br /&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>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27101</id>
		<title>SVG</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27101"/>
		<updated>2024-04-24T17:14:42Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* SVG Scaling - Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scale SVG ==&lt;br /&gt;
 https://css-tricks.com/scale-svg/&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/CSS/Scaling_of_SVG_backgrounds&lt;br /&gt;
&lt;br /&gt;
Wir sind Pixelbilder gewöhnt und erwarten beim Skalieren etwas ähnliches wenn wir mit SVG Grafiken arbeitn. SVGs verhalten sich aber nicht wie Pixelbilder und bieten auch andere Möglichkeiten. Wir müssen der SVG Grafik daher mehr Informationen mitgeben.&lt;br /&gt;
&lt;br /&gt;
Eine SVG Grafik ist keine einzelne Datei sondern sie besteht aus mehreren Teilen (Pfade etc.). Jeder dieser Teile kann sich beim Skalieren anders verhalten. Ein Pfad kann z.B. seine Form vergrößern, aber die Linienstärke bleibt unverändert.&lt;br /&gt;
&lt;br /&gt;
Daher müssen wir bei SVG dem Browser genauer mitteilen was wir tun möchten.&lt;br /&gt;
&lt;br /&gt;
=== Lösung Img Tag ? ===&lt;br /&gt;
Solange wir ein img Tag nutzen verhält sich ein SVG Bild genau wie ein Pixelbild. Hier übernimmt der Browser das Handling. Allerdings möchten wir manchmal auf die Einzelteile des SVGs zugreifen (z.B. um einzelne Farben zu verändern, interaktive Charts zu erstellen etc.). &lt;br /&gt;
&lt;br /&gt;
=== SVG Scaling - Übersicht ===&lt;br /&gt;
==== width und height funktionieren nicht ====&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;200&amp;quot; height=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
Gibt nur den Rahmen der Umgebenden Box vor, wenn die SVG Elemente größer sind wird abgeschnitten. Auch umgebende Elemente führen im Zweifel nur zu Scrollbalken. Skalieren funktioniert überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
==== Die Lösung: viewBox - x, y, width, height====&lt;br /&gt;
Das SVG Attribut &amp;#039;&amp;#039;&amp;#039;viewBox definiert den Viewport&amp;#039;&amp;#039;&amp;#039; also den Bezugsrahmen in dem die Elemente platziert sind. Da SVG auch andere Einheiten wie Pixel nutzen kann (z.B. mm etc.) hilft das dem Browser das um am Ende die Ausgabegröße passend zu machen.&lt;br /&gt;
&lt;br /&gt;
 * width und height geben die Größe des Viewports vor. &lt;br /&gt;
Wenn du die &amp;#039;&amp;#039;&amp;#039;Werte so groß wählst wie die Grafik&amp;#039;&amp;#039;&amp;#039; hat der Viewport Platz für alle Elemente. &amp;#039;&amp;#039;&amp;#039;Wenn deine Elemente z.B. mit 10mm x 5mm angelegt sind kannst du 0 0 10 5 angeben&amp;#039;&amp;#039;&amp;#039;. So passt die Grafik genau in den SVG-Viewport. &lt;br /&gt;
&lt;br /&gt;
Widht und Height skalieren nicht die Inhalte. Deshalb musst du sie groß genug wählen dass alles passt. Sonst wird abgeschnitten. Die Werte nutzen wie gesagt die gleiche Einheit in der das SVG Dokument angelegt ist.&lt;br /&gt;
&lt;br /&gt;
x und y definieren den Ursprung des Koordinatensystems im SVG. Wenn das auf 0,0 steht ist der Ursprung oben links. Das wäre der einfachste Fall. Wenn du width und height groß genug gewählt hast siehst du nun das ganze Bild.&lt;br /&gt;
&lt;br /&gt;
Wenn du x erhöhst wird das Koordinatensystem in der Grafik nach rechts geschoben. Das bedeutet Teile der Grafik liegen jetzt evtl. im negativen x-Bereich. Da der Browser das SVG trotzdem am Ursprung beginnend zeichnet wird der linke Teil der Grafik abgeschnitten, rechts bleibt etwas Leerraum.&lt;br /&gt;
&lt;br /&gt;
==== Keine viewBox vorhanden? ====&lt;br /&gt;
Manchmal liefern Grafikprogramme keine viewBox mit aber dafür height und width:&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;1000px&amp;quot; height=&amp;quot;200px&amp;quot;&lt;br /&gt;
Dann kannst du diese Werte in eine viewBox schreiben und dafür width und height leer lassen.&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;0 0 1000 200&amp;quot; width=&amp;quot;&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
Jetzt kann der Browser das Bild richtig anzeigen. Lasse width und height im Zweifel leer. Es kann sein, dass das Bild durch andere Attribute sonst etwas verschoben ist. Einfach mal testen ob sich was verändert.&lt;br /&gt;
&lt;br /&gt;
Sobald das viewBox Attribut passend im SVG ist, hat der Browser die Informationen um es wie ein normales Bild zu behandeln und skaliert das Bild korrekt.&lt;br /&gt;
&lt;br /&gt;
Du kannst auch Leerraum um die Grafik schaffen, wenn du width und height erhöhst und x und y passend verschiebst&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;-10 0 1020 200&amp;quot; &lt;br /&gt;
Hier wird das Koordinatensystem um 10 Einheiten nach links geschoben und um width um 10 erhöht. Dadurch entsteht links und rechts Platz.&lt;br /&gt;
&lt;br /&gt;
==== SVG skalieren wie Bilder ====&lt;br /&gt;
Bei Pixelbildern kann man das width oder height Attribut setzen. die andere Größe wird dann automatisch vom Browser ermittelt. Bei einem SVG geht das - aber nicht so einfach.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SVG im img Tag =====&lt;br /&gt;
Das funktioniert mit width und height in aktuellen Browsern (Stand 2024) eigentlich überall. &lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 CSS&lt;br /&gt;
 width:100%;&lt;br /&gt;
 height: auto;&lt;br /&gt;
 Attribute:&lt;br /&gt;
 width=&amp;quot;200&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Flex Box =====&lt;br /&gt;
In fast aktuellen Browsern funktioniert die Positionierung in einer flex Box. Eventuell musst du in sofern du paddings verwendest box-sizing auf border-box setzen.&lt;br /&gt;
 &lt;br /&gt;
===== SVG Background Image =====&lt;br /&gt;
Hier kann man den Aspect Ratio Hack nehmen (auch padding-bottom Hack genannt). Dabei wird eine Box erzeugt die immer das richtige Seitenverhältnis hat. Siehe auch aspect-grid in diesem wikie oder der CSS-Tricks Link oben.&lt;br /&gt;
&lt;br /&gt;
===== Inline Code skalieren =====&lt;br /&gt;
Können mittlerweile auch die meisten Browser. Setze die viewBox und einen der Attribute width oder height.&lt;br /&gt;
&lt;br /&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>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27100</id>
		<title>SVG</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27100"/>
		<updated>2024-04-24T16:27:23Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* SVG Scaling - Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scale SVG ==&lt;br /&gt;
 https://css-tricks.com/scale-svg/&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/CSS/Scaling_of_SVG_backgrounds&lt;br /&gt;
&lt;br /&gt;
Wir sind Pixelbilder gewöhnt und erwarten beim Skalieren etwas ähnliches wenn wir mit SVG Grafiken arbeitn. SVGs verhalten sich aber nicht wie Pixelbilder und bieten auch andere Möglichkeiten. Wir müssen der SVG Grafik daher mehr Informationen mitgeben.&lt;br /&gt;
&lt;br /&gt;
Eine SVG Grafik ist keine einzelne Datei sondern sie besteht aus mehreren Teilen (Pfade etc.). Jeder dieser Teile kann sich beim Skalieren anders verhalten. Ein Pfad kann z.B. seine Form vergrößern, aber die Linienstärke bleibt unverändert.&lt;br /&gt;
&lt;br /&gt;
Daher müssen wir bei SVG dem Browser genauer mitteilen was wir tun möchten.&lt;br /&gt;
&lt;br /&gt;
=== Lösung Img Tag ? ===&lt;br /&gt;
Solange wir ein img Tag nutzen verhält sich ein SVG Bild genau wie ein Pixelbild. Hier übernimmt der Browser das Handling. Allerdings möchten wir manchmal auf die Einzelteile des SVGs zugreifen (z.B. um einzelne Farben zu verändern, interaktive Charts zu erstellen etc.). &lt;br /&gt;
&lt;br /&gt;
=== SVG Scaling - Übersicht ===&lt;br /&gt;
==== width und height funktionieren nicht ====&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;200&amp;quot; height=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
Gibt nur den Rahmen der Umgebenden Box vor, wenn die SVG Elemente größer sind wird abgeschnitten. Auch umgebende Elemente führen im Zweifel nur zu Scrollbalken. Skalieren funktioniert überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
==== Die Lösung: viewBox - x, y, width, height====&lt;br /&gt;
Das SVG Attribut &amp;#039;&amp;#039;&amp;#039;viewBox definiert den Viewport&amp;#039;&amp;#039;&amp;#039; also den Bezugsrahmen in dem die Elemente platziert sind. Da SVG auch andere Einheiten wie Pixel nutzen kann (z.B. mm etc.) hilft das dem Browser das um am Ende die Ausgabegröße passend zu machen.&lt;br /&gt;
&lt;br /&gt;
 * width und height geben die Größe des Viewports vor. &lt;br /&gt;
Wenn du die &amp;#039;&amp;#039;&amp;#039;Werte so groß wählst wie die Grafik&amp;#039;&amp;#039;&amp;#039; hat der Viewport Platz für alle Elemente. &amp;#039;&amp;#039;&amp;#039;Wenn deine Elemente z.B. mit 10mm x 5mm angelegt sind kannst du 0 0 10 5 angeben&amp;#039;&amp;#039;&amp;#039;. So passt die Grafik genau in den SVG-Viewport. &lt;br /&gt;
&lt;br /&gt;
Widht und Height skalieren nicht die Inhalte. Deshalb musst du sie groß genug wählen dass alles passt. Sonst wird abgeschnitten. Die Werte nutzen wie gesagt die gleiche Einheit in der das SVG Dokument angelegt ist.&lt;br /&gt;
&lt;br /&gt;
x und y definieren den Ursprung des Koordinatensystems im SVG. Wenn das auf 0,0 steht ist der Ursprung oben links. Das wäre der einfachste Fall. Wenn du width und height groß genug gewählt hast siehst du nun das ganze Bild.&lt;br /&gt;
&lt;br /&gt;
Wenn du x erhöhst wird das Koordinatensystem in der Grafik nach rechts geschoben. Das bedeutet Teile der Grafik liegen jetzt evtl. im negativen x-Bereich. Da der Browser das SVG trotzdem am Ursprung beginnend zeichnet wird der linke Teil der Grafik abgeschnitten, rechts bleibt etwas Leerraum.&lt;br /&gt;
&lt;br /&gt;
==== Keine viewBox vorhanden? ====&lt;br /&gt;
Manchmal liefern Grafikprogramme keine viewBox mit aber dafür height und width:&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;1000px&amp;quot; height=&amp;quot;200px&amp;quot;&lt;br /&gt;
Dann kannst du diese Werte in eine viewBox schreiben und dafür width und height leer lassen.&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;0 0 1000 200&amp;quot; width=&amp;quot;&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
Jetzt kann der Browser das Bild richtig anzeigen. Lasse width und height im Zweifel leer. Es kann sein, dass das Bild durch andere Attribute sonst etwas verschoben ist. Einfach mal testen ob sich was verändert.&lt;br /&gt;
&lt;br /&gt;
Sobald das viewBox Attribut passend im SVG ist, hat der Browser die Informationen um es wie ein normales Bild zu behandeln und skaliert das Bild korrekt.&lt;br /&gt;
&lt;br /&gt;
Du kannst auch Leerraum um die Grafik schaffen, wenn du width und height erhöhst und x und y passend verschiebst&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;-10 0 1020 200&amp;quot; &lt;br /&gt;
Hier wird das Koordinatensystem um 10 Einheiten nach links geschoben und um width um 10 erhöht. Dadurch entsteht links und rechts Platz.&lt;br /&gt;
&lt;br /&gt;
==== SVG skalieren wie Bilder ====&lt;br /&gt;
Bei Pixelbildern kann man das width oder height Attribut setzen. die andere Größe wird dann automatisch vom Browser ermittelt. Bei einem SVG geht das - aber nicht so einfach.&lt;br /&gt;
&lt;br /&gt;
===== SVG im img Tag =====&lt;br /&gt;
Das funktioniert in aktuellen Browsern (Stand 2024) eigentlich überall.&lt;br /&gt;
&lt;br /&gt;
===== Flex Box =====&lt;br /&gt;
In fast aktuellen Browsern funktioniert die Positionierung in einer flex Box. Eventuell musst du in sofern du paddings verwendest box-sizing auf border-box setzen.&lt;br /&gt;
 &lt;br /&gt;
===== SVG Background Image =====&lt;br /&gt;
Hier kann man den Aspect Ratio Hack nehmen (auch padding-bottom Hack genannt). Dabei wird eine Box erzeugt die immer das richtige Seitenverhältnis hat. Siehe auch aspect-grid in diesem wikie oder der CSS-Tricks Link oben.&lt;br /&gt;
&lt;br /&gt;
===== Inline Code skalieren =====&lt;br /&gt;
Können mittlerweile auch die meisten Browser. Setze die viewBox und einen der Attribute width oder height.&lt;br /&gt;
&lt;br /&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>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27099</id>
		<title>SVG</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=SVG&amp;diff=27099"/>
		<updated>2024-04-24T08:27:18Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Scale SVG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scale SVG ==&lt;br /&gt;
 https://css-tricks.com/scale-svg/&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/CSS/Scaling_of_SVG_backgrounds&lt;br /&gt;
&lt;br /&gt;
Wir sind Pixelbilder gewöhnt und erwarten beim Skalieren etwas ähnliches wenn wir mit SVG Grafiken arbeitn. SVGs verhalten sich aber nicht wie Pixelbilder und bieten auch andere Möglichkeiten. Wir müssen der SVG Grafik daher mehr Informationen mitgeben.&lt;br /&gt;
&lt;br /&gt;
Eine SVG Grafik ist keine einzelne Datei sondern sie besteht aus mehreren Teilen (Pfade etc.). Jeder dieser Teile kann sich beim Skalieren anders verhalten. Ein Pfad kann z.B. seine Form vergrößern, aber die Linienstärke bleibt unverändert.&lt;br /&gt;
&lt;br /&gt;
Daher müssen wir bei SVG dem Browser genauer mitteilen was wir tun möchten.&lt;br /&gt;
&lt;br /&gt;
=== Lösung Img Tag ? ===&lt;br /&gt;
Solange wir ein img Tag nutzen verhält sich ein SVG Bild genau wie ein Pixelbild. Hier übernimmt der Browser das Handling. Allerdings möchten wir manchmal auf die Einzelteile des SVGs zugreifen (z.B. um einzelne Farben zu verändern, interaktive Charts zu erstellen etc.). &lt;br /&gt;
&lt;br /&gt;
=== SVG Scaling - Übersicht ===&lt;br /&gt;
==== width und height funktionieren nicht ====&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;200&amp;quot; height=&amp;quot;100&amp;quot;&amp;gt;&lt;br /&gt;
Gibt nur den Rahmen der Umgebenden Box vor, wenn die SVG Elemente größer sind wird abgeschnitten. Auch umgebende Elemente führen im Zweifel nur zu Scrollbalken. Skalieren funktioniert überhaupt nicht.&lt;br /&gt;
&lt;br /&gt;
==== Die Lösung: viewBox - x, y, width, height====&lt;br /&gt;
Das SVG Attribut viewBox definiert den Viewport also den Bezugsrahmen in dem die Elemente platziert sind. Da SVG auch andere Einheiten wie Pixel nutzen kann (z.B. mm etc.) hilft das dem Browser das um am Ende die Ausgabegröße passend zu machen.&lt;br /&gt;
&lt;br /&gt;
 * width und height geben die Größe des Viewports vor. &lt;br /&gt;
Wenn du die Werte so groß wählst wie die Grafik hat der Viewport Platz für alle Elemente. &amp;#039;&amp;#039;&amp;#039;Wenn deine Elemente z.B. mit 10mm x 5mm angelegt sind kannst du 0 0 10 5 angeben&amp;#039;&amp;#039;&amp;#039;. So passt die Grafik genau in den SVG-Viewport. &lt;br /&gt;
&lt;br /&gt;
Widht und Height skalieren nicht die Inhalte. Deshalb musst du sie groß genug wählen dass alles passt. Sonst wird abgeschnitten. Die Werte nutzen wie gesagt die gleiche Einheit in der das SVG Dokument angelegt ist.&lt;br /&gt;
&lt;br /&gt;
x und y definieren den Ursprung des Koordinatensystems im SVG. Wenn das auf 0,0 steht ist der Ursprung oben links. Das wäre der einfachste Fall. Wenn du width und height groß genug gewählt hast siehst du nun das ganze Bild.&lt;br /&gt;
&lt;br /&gt;
Wenn du x erhöhst wird das Koordinatensystem in der Grafik nach rechts geschoben. Das bedeutet Teile der Grafik liegen jetzt evtl. im negativen x-Bereich. Da der Browser das SVG trotzdem am Ursprung beginnend zeichnet wird der linke Teil der Grafik abgeschnitten, rechts bleibt etwas Leerraum.&lt;br /&gt;
&lt;br /&gt;
Manchmal liefern Grafikprogramme keine viewBox mit aber dafür height und width:&lt;br /&gt;
 &amp;lt;svg width=&amp;quot;1000px&amp;quot; height=&amp;quot;200px&amp;quot;&lt;br /&gt;
Dann kannst du diese Werte in eine viewBox schreiben und dafür width und height leer lassen.&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;0 0 1000 200&amp;quot; width=&amp;quot;&amp;quot; height=&amp;quot;&amp;quot;&lt;br /&gt;
Jetzt kann der Browser das Bild richtig anzeigen. Lasse width und height im Zweifel leer. Es kann sein, dass das Bild durch andere Attribute sonst etwas verschoben ist. Einfach mal testen ob sich was verändert.&lt;br /&gt;
&lt;br /&gt;
Sobald das viewBox Attribut passend im SVG ist, hat der Browser die Informationen um es wie ein normales Bild zu behandeln und skaliert das Bild korrekt.&lt;br /&gt;
&lt;br /&gt;
Du kannst auch Leerraum um die Grafik schaffen, wenn du width und height erhöhst und x und y passend verschiebst&lt;br /&gt;
 &amp;lt;svg viewBox=&amp;quot;-10 0 1020 200&amp;quot; &lt;br /&gt;
Hier wird das Koordinatensystem um 10 Einheiten nach links geschoben und um width um 10 erhöht. Dadurch entsteht links und rechts Platz.&lt;br /&gt;
&lt;br /&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>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=27098</id>
		<title>3D-Druck</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=27098"/>
		<updated>2024-04-23T08:57:05Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Ender 5 Pro - PETG Settings mit Bowden Tube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[3D-Drucker kalibrieren und einstellen]]&lt;br /&gt;
 [[3D-Drucker - Düse wechseln / reinigen]]&lt;br /&gt;
 [[Cura]]&lt;br /&gt;
&lt;br /&gt;
== Filamente ==&lt;br /&gt;
=== PLA ===&lt;br /&gt;
 Temperatur: 180-220°C &lt;br /&gt;
 Bett Temperatur: 30-50°C &lt;br /&gt;
 Kühlung: 100%&lt;br /&gt;
 Print speed: 40-60mm/s&lt;br /&gt;
 PLA trocken halten&lt;br /&gt;
&lt;br /&gt;
=== PETG ===&lt;br /&gt;
 https://3dprinterly.com/filament-printing-guide/petg/ guter Guide, Einstellungen, Gesundheit, Eigenschaften...&lt;br /&gt;
&lt;br /&gt;
 Print speed 30 - 60mm/s&lt;br /&gt;
 Retraction 35-40mm/s Bowden and Direct Drive extruders&lt;br /&gt;
 Retraction distance &lt;br /&gt;
   5-7mm for Bowden extruders &lt;br /&gt;
   2-4mm for direct-drive extruders&lt;br /&gt;
 Fan-Speed niedrig für gute Layerhaftung, höher für Sauberkeit.&lt;br /&gt;
&lt;br /&gt;
Retraction settings for PETG are very different from those for other filaments. This is because PETG prints at a relatively high temperature so, the material flow is very hard to stop and control.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Best Cura PETG Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    Nozzle Temperature: 235-250°C&lt;br /&gt;
    Bed Temperature: 70-100°C&lt;br /&gt;
    Print Speed: 40-60mm/s&lt;br /&gt;
    Initial Layer Print Speed: 20mm/s&lt;br /&gt;
    Retraction Distance: 6mm (Bowden setups), 2-3mm (direct drive setups)&lt;br /&gt;
    Retraction Speed: 40-45mm/s&lt;br /&gt;
    Combing: “Not in Skin” or “Within Infill”&lt;br /&gt;
    Cooling Fan Speed: 0-50% for strength, 50-100% for quality&lt;br /&gt;
    Initial Layer Cooling Speed: 0%&lt;br /&gt;
    Build Plate Adhesion: Raft or Brim&lt;br /&gt;
&lt;br /&gt;
==== Ender 5 Pro - PETG Settings mit Bowden Tube ====&lt;br /&gt;
 https://www.youtube.com/watch?v=aOA2hGMVp9w&lt;br /&gt;
Mal testen - sieht sinnvoll aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtige mit *&lt;br /&gt;
1.2mm Walls&lt;br /&gt;
Otimize wall printing order - on&lt;br /&gt;
Alternate extra walls - on&lt;br /&gt;
Z-Seam&lt;br /&gt;
Alignment Sharpest corner / smart hiding&lt;br /&gt;
Top Bottom 1.2&lt;br /&gt;
Ironing wenn man möchte&lt;br /&gt;
Infill 20%&lt;br /&gt;
Triangles&lt;br /&gt;
Connect Infill Lines on&lt;br /&gt;
Overlap 50% - kommt mir viel vor&lt;br /&gt;
Extra Wall Count 1 oder mehr&lt;br /&gt;
* Print Temperature 240&lt;br /&gt;
* Plate 80&lt;br /&gt;
Flow je nach Ergebnis anpassen oder kalibrieren&lt;br /&gt;
Print Speed max 70 50 ist safe&lt;br /&gt;
Travel Speed 200&lt;br /&gt;
Initial speed 20mm/s&lt;br /&gt;
z hop 5mms&lt;br /&gt;
accelerating contol on&lt;br /&gt;
&lt;br /&gt;
* Enable Retraction&lt;br /&gt;
* Retraction Distance 7mm&lt;br /&gt;
* Retraction Speed 25mm/s&lt;br /&gt;
* Combing Mode Within Infill&lt;br /&gt;
* Avoid  Printed Parts on&lt;br /&gt;
Avoid Supports when travelling on&lt;br /&gt;
z-hop when retracted off&lt;br /&gt;
* Cooling off (um Nozzle zu schüthen&lt;br /&gt;
&lt;br /&gt;
Support Structure dezent weil schwer zu entfernen&lt;br /&gt;
Tree&lt;br /&gt;
Touching Buildplate&lt;br /&gt;
Support Overhang Angle 50 ca&lt;br /&gt;
Pattern Lines&lt;br /&gt;
Line Count 1&lt;br /&gt;
Connect no&lt;br /&gt;
Density 1&lt;br /&gt;
Brim Width 4mm&lt;br /&gt;
&lt;br /&gt;
Build Plate Adhesion&lt;br /&gt;
Je nach Modell&lt;br /&gt;
&lt;br /&gt;
Experimental&lt;br /&gt;
* Infill Travel Optiization on&lt;br /&gt;
Enable Draft Shield off&lt;br /&gt;
* Coasting on&lt;br /&gt;
* Coasting Volume 0.064mm2&lt;br /&gt;
Fuzzy Skin off&lt;br /&gt;
Adaptive Layers off&lt;br /&gt;
* Enable Bridge Settings on&lt;br /&gt;
Wipe Nozzle Between Layers off&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Is PETG Filament Toxic &amp;amp; Safe to 3D Print Indoor? ====&lt;br /&gt;
&lt;br /&gt;
No, PETG filament is non-toxic, and it can be printed safely indoors. Also, it doesn’t even emit any smell when it is printing. Just make sure your 3D printing area is well ventilated to avoid a buildup of nanoparticles in the air. These particles can cause eye and throat irritations.&lt;br /&gt;
&lt;br /&gt;
==== Is PETG Heat and UV Resistant? What Temperature Can PETG Withstand? ====&lt;br /&gt;
&lt;br /&gt;
PETG has decent heat resistance properties, especially when compared to most other filaments. It can resist temperatures up to its glass transition temperature, which is around 80-85⁰C. It handily beats out filaments like PLA in this respect, but it displays less heat resistance than ABS.&lt;br /&gt;
&lt;br /&gt;
However, it is &amp;#039;&amp;#039;&amp;#039;more UV resistant than both of them&amp;#039;&amp;#039;&amp;#039;, making it the perfect choice for outdoor applications.&lt;br /&gt;
&lt;br /&gt;
=== TPU ===&lt;br /&gt;
 [[3D-Druck TPU drucken]]&lt;br /&gt;
&lt;br /&gt;
=== Infill Tipps ===&lt;br /&gt;
 [[3D-Druck - Infill]]&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=27097</id>
		<title>3D-Druck</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=27097"/>
		<updated>2024-04-20T18:47:17Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* PETG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[3D-Drucker kalibrieren und einstellen]]&lt;br /&gt;
 [[3D-Drucker - Düse wechseln / reinigen]]&lt;br /&gt;
 [[Cura]]&lt;br /&gt;
&lt;br /&gt;
== Filamente ==&lt;br /&gt;
=== PLA ===&lt;br /&gt;
 Temperatur: 180-220°C &lt;br /&gt;
 Bett Temperatur: 30-50°C &lt;br /&gt;
 Kühlung: 100%&lt;br /&gt;
 Print speed: 40-60mm/s&lt;br /&gt;
 PLA trocken halten&lt;br /&gt;
&lt;br /&gt;
=== PETG ===&lt;br /&gt;
 https://3dprinterly.com/filament-printing-guide/petg/ guter Guide, Einstellungen, Gesundheit, Eigenschaften...&lt;br /&gt;
&lt;br /&gt;
 Print speed 30 - 60mm/s&lt;br /&gt;
 Retraction 35-40mm/s Bowden and Direct Drive extruders&lt;br /&gt;
 Retraction distance &lt;br /&gt;
   5-7mm for Bowden extruders &lt;br /&gt;
   2-4mm for direct-drive extruders&lt;br /&gt;
 Fan-Speed niedrig für gute Layerhaftung, höher für Sauberkeit.&lt;br /&gt;
&lt;br /&gt;
Retraction settings for PETG are very different from those for other filaments. This is because PETG prints at a relatively high temperature so, the material flow is very hard to stop and control.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Best Cura PETG Settings&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    Nozzle Temperature: 235-250°C&lt;br /&gt;
    Bed Temperature: 70-100°C&lt;br /&gt;
    Print Speed: 40-60mm/s&lt;br /&gt;
    Initial Layer Print Speed: 20mm/s&lt;br /&gt;
    Retraction Distance: 6mm (Bowden setups), 2-3mm (direct drive setups)&lt;br /&gt;
    Retraction Speed: 40-45mm/s&lt;br /&gt;
    Combing: “Not in Skin” or “Within Infill”&lt;br /&gt;
    Cooling Fan Speed: 0-50% for strength, 50-100% for quality&lt;br /&gt;
    Initial Layer Cooling Speed: 0%&lt;br /&gt;
    Build Plate Adhesion: Raft or Brim&lt;br /&gt;
&lt;br /&gt;
==== Ender 5 Pro - PETG Settings mit Bowden Tube ====&lt;br /&gt;
 https://www.youtube.com/watch?v=aOA2hGMVp9w&lt;br /&gt;
Mal testen - sieht sinnvoll aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtige mit *&lt;br /&gt;
1.2mm Walls&lt;br /&gt;
Otimize wall printing order - on&lt;br /&gt;
Alternate extra walls - on&lt;br /&gt;
Z-Seam&lt;br /&gt;
Alignment Sharpest corner / smart hiding&lt;br /&gt;
Top Bottom 1.2&lt;br /&gt;
Ironing wenn man möchte&lt;br /&gt;
Infill 20%&lt;br /&gt;
Triangles&lt;br /&gt;
Connect Infill Lines on&lt;br /&gt;
Overlap 50%&lt;br /&gt;
Extra Wall Count 1 oder mehr&lt;br /&gt;
* Print Temperature 240&lt;br /&gt;
* Plate 80&lt;br /&gt;
Flow je nach Ergebnis anpassen oder kalibrieren&lt;br /&gt;
Print Speed max 70 50 ist safe&lt;br /&gt;
Travel Speed 200&lt;br /&gt;
Initial speed 20mm/s&lt;br /&gt;
z hop 5mms&lt;br /&gt;
accelerating contol on&lt;br /&gt;
&lt;br /&gt;
* Enable Retraction&lt;br /&gt;
* Retraction Distance 7mm&lt;br /&gt;
* Retraction Speed 25mm/s&lt;br /&gt;
* Combing Mode Within Infill&lt;br /&gt;
* Avoid  Printed Parts on&lt;br /&gt;
Avoid Supports when travelling on&lt;br /&gt;
z-hop when retracted off&lt;br /&gt;
* Cooling off (um Nozzle zu schüthen&lt;br /&gt;
&lt;br /&gt;
Support Structure dezent weil schwer zu entfernen&lt;br /&gt;
Tree&lt;br /&gt;
Touching Buildplate&lt;br /&gt;
Support Overhang Angle 50 ca&lt;br /&gt;
Pattern Lines&lt;br /&gt;
Line Count 1&lt;br /&gt;
Connect no&lt;br /&gt;
Density 1&lt;br /&gt;
Brim Width 4mm&lt;br /&gt;
&lt;br /&gt;
Build Plate Adhesion&lt;br /&gt;
Je nach Modell&lt;br /&gt;
&lt;br /&gt;
Experimental&lt;br /&gt;
* Infill Travel Optiization on&lt;br /&gt;
Enable Draft Shield off&lt;br /&gt;
* Coasting on&lt;br /&gt;
* Coasting Volume 0.064mm2&lt;br /&gt;
Fuzzy Skin off&lt;br /&gt;
Adaptive Layers off&lt;br /&gt;
* Enable Bridge Settings on&lt;br /&gt;
Wipe Nozzle Between Layers off&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Is PETG Filament Toxic &amp;amp; Safe to 3D Print Indoor? ====&lt;br /&gt;
&lt;br /&gt;
No, PETG filament is non-toxic, and it can be printed safely indoors. Also, it doesn’t even emit any smell when it is printing. Just make sure your 3D printing area is well ventilated to avoid a buildup of nanoparticles in the air. These particles can cause eye and throat irritations.&lt;br /&gt;
&lt;br /&gt;
==== Is PETG Heat and UV Resistant? What Temperature Can PETG Withstand? ====&lt;br /&gt;
&lt;br /&gt;
PETG has decent heat resistance properties, especially when compared to most other filaments. It can resist temperatures up to its glass transition temperature, which is around 80-85⁰C. It handily beats out filaments like PLA in this respect, but it displays less heat resistance than ABS.&lt;br /&gt;
&lt;br /&gt;
However, it is &amp;#039;&amp;#039;&amp;#039;more UV resistant than both of them&amp;#039;&amp;#039;&amp;#039;, making it the perfect choice for outdoor applications.&lt;br /&gt;
&lt;br /&gt;
=== TPU ===&lt;br /&gt;
 [[3D-Druck TPU drucken]]&lt;br /&gt;
&lt;br /&gt;
=== Infill Tipps ===&lt;br /&gt;
 [[3D-Druck - Infill]]&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27096</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27096"/>
		<updated>2024-04-20T13:08:52Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/styles/animations.css&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/templates/styles/animations.css&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Liefert uns ein paar Styles, damit wir besser animieren können. Gut z.B. wenn der umgebende Container relativ Positioniert ist.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;stylesheet&amp;quot;&amp;gt;&lt;br /&gt;
.ani-wrapper{&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
.ani-box{&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/templates/scripts/animations.js&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass die Assets die Animiert werden nur dann eingebunden werden, wenn wir sie auch nutzen. So können wir Sections ohne oder mit Animationen nutzen. Die Animation lässt sich beliebig auf Sections verteilen.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel die Schritte wenn du eine neue Animation hinzufügen möchtest.&lt;br /&gt;
==== Neue Animation hinzufügen ====&lt;br /&gt;
1. Im Backend das Select Feld section_animation erweitern. Z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=ani-cloud|Wolke&lt;br /&gt;
2=ani-threeTrees|3 Bäume&lt;br /&gt;
3=ani-twoTrees|2 Bäume&lt;br /&gt;
4=ani-tree1|Fichte&lt;br /&gt;
5=ani-tree2|Buche&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Animationsnamen entsprechen den values (ani-cloud1, ani-threeTrees, ...)&lt;br /&gt;
&lt;br /&gt;
2. Die benötigten Bilder kommen in den &amp;#039;&amp;#039;&amp;#039;Asset Ordner&amp;#039;&amp;#039;&amp;#039; (z.B. templates/assets/animations/cloud.png)&lt;br /&gt;
&lt;br /&gt;
3. Die &amp;#039;&amp;#039;&amp;#039;Template Datei für das Animationsmarkup&amp;#039;&amp;#039;&amp;#039; anlegen (z.B. templates/fields/animations/ani-cloud.php) Der Dateiname entspricht dem Value im Select Feld. Testen ob der Markup-Code geladen wird.&lt;br /&gt;
&lt;br /&gt;
4. In &amp;#039;&amp;#039;&amp;#039;animations.js&amp;#039;&amp;#039;&amp;#039; den Code hinzufügen. Die Teile der Animation kann an über den Animationsnamen Selektieren, der automatisch als Klasse im Markup verwendet wird. Z.B.:&lt;br /&gt;
 var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
5. Im Backend die Animation auswählen&lt;br /&gt;
&lt;br /&gt;
FERTIG&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27095</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27095"/>
		<updated>2024-04-20T13:03:58Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Neue Animation hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass die Assets die Animiert werden nur dann eingebunden werden, wenn wir sie auch nutzen. So können wir Sections ohne oder mit Animationen nutzen. Die Animation lässt sich beliebig auf Sections verteilen.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel die Schritte wenn du eine neue Animation hinzufügen möchtest.&lt;br /&gt;
==== Neue Animation hinzufügen ====&lt;br /&gt;
1. Im Backend das Select Feld section_animation erweitern. Z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=ani-cloud|Wolke&lt;br /&gt;
2=ani-threeTrees|3 Bäume&lt;br /&gt;
3=ani-twoTrees|2 Bäume&lt;br /&gt;
4=ani-tree1|Fichte&lt;br /&gt;
5=ani-tree2|Buche&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Animationsnamen entsprechen den values (ani-cloud1, ani-threeTrees, ...)&lt;br /&gt;
&lt;br /&gt;
2. Die benötigten Bilder kommen in den &amp;#039;&amp;#039;&amp;#039;Asset Ordner&amp;#039;&amp;#039;&amp;#039; (z.B. templates/assets/animations/cloud.png)&lt;br /&gt;
&lt;br /&gt;
3. Die &amp;#039;&amp;#039;&amp;#039;Template Datei für das Animationsmarkup&amp;#039;&amp;#039;&amp;#039; anlegen (z.B. templates/fields/animations/ani-cloud.php) Der Dateiname entspricht dem Value im Select Feld. Testen ob der Markup-Code geladen wird.&lt;br /&gt;
&lt;br /&gt;
4. In &amp;#039;&amp;#039;&amp;#039;animations.js&amp;#039;&amp;#039;&amp;#039; den Code hinzufügen. Die Teile der Animation kann an über den Animationsnamen Selektieren, der automatisch als Klasse im Markup verwendet wird. Z.B.:&lt;br /&gt;
 var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
5. Im Backend die Animation auswählen&lt;br /&gt;
&lt;br /&gt;
FERTIG&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27094</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27094"/>
		<updated>2024-04-20T13:03:17Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Neue Animation hinzufügen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass die Assets die Animiert werden nur dann eingebunden werden, wenn wir sie auch nutzen. So können wir Sections ohne oder mit Animationen nutzen. Die Animation lässt sich beliebig auf Sections verteilen.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel die Schritte wenn du eine neue Animation hinzufügen möchtest.&lt;br /&gt;
==== Neue Animation hinzufügen ====&lt;br /&gt;
1. Im Backend das Select Feld section_animation erweitern. Z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=ani-cloud|Wolke&lt;br /&gt;
2=ani-threeTrees|3 Bäume&lt;br /&gt;
3=ani-twoTrees|2 Bäume&lt;br /&gt;
4=ani-tree1|Fichte&lt;br /&gt;
5=ani-tree2|Buche&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Animationsnamen entsprechen den values (ani-cloud1, ani-threeTrees, ...)&lt;br /&gt;
&lt;br /&gt;
2. Die benötigten Bilder kommen in den &amp;#039;&amp;#039;&amp;#039;Asset Ordner&amp;#039;&amp;#039;&amp;#039; (z.B. templates/assets/animations/cloud.png)&lt;br /&gt;
&lt;br /&gt;
3. Die &amp;#039;&amp;#039;&amp;#039;Template Datei für das Animationsmarkup&amp;#039;&amp;#039;&amp;#039; anlegen (z.B. templates/fields/animations/ani-cloud.php) Der Dateiname entspricht dem Value im Select Feld.&lt;br /&gt;
&lt;br /&gt;
4. In &amp;#039;&amp;#039;&amp;#039;animations.js&amp;#039;&amp;#039;&amp;#039; den Code hinzufügen. Die Teile der Animation kann an über den Animationsnamen Selektieren, der automatisch als Klasse im Markup verwendet wird. Z.B.:&lt;br /&gt;
 var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
5. Im Backend die Animation auswählen&lt;br /&gt;
&lt;br /&gt;
FERTIG&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27093</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27093"/>
		<updated>2024-04-20T13:00:38Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass die Assets die Animiert werden nur dann eingebunden werden, wenn wir sie auch nutzen. So können wir Sections ohne oder mit Animationen nutzen. Die Animation lässt sich beliebig auf Sections verteilen.&lt;br /&gt;
&lt;br /&gt;
Im nächsten Kapitel die Schritte wenn du eine neue Animation hinzufügen möchtest.&lt;br /&gt;
==== Neue Animation hinzufügen ====&lt;br /&gt;
1. Im Backend das Select Feld section_animation erweitern. Z.B.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=ani-cloud|Wolke&lt;br /&gt;
2=ani-threeTrees|3 Bäume&lt;br /&gt;
3=ani-twoTrees|2 Bäume&lt;br /&gt;
4=ani-tree1|Fichte&lt;br /&gt;
5=ani-tree2|Buche&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Animationsnamen entsprechen den values (ani-cloud1, ani-threeTrees, ...)&lt;br /&gt;
2. Die benötigten Bilder kommen in den Asset Ordner (z.B. templates/assets/animations/cloud.png)&lt;br /&gt;
3. Die Template Datei für das Animationsmarkup anlegen (z.B. templates/fields/animations/ani-cloud.php) Der Dateiname entspricht dem Value im Select Feld.&lt;br /&gt;
4. In animations.js den Code hinzufügen&lt;br /&gt;
5. Im Backend die Animation auswählen&lt;br /&gt;
&lt;br /&gt;
FERTIG&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27092</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27092"/>
		<updated>2024-04-20T12:51:48Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer Vorteil ist, dass die Assets die Animiert werden nur dann eingebunden werden, wenn wir sie auch nutzen. So können wir Sections ohne oder mit Animationen nutzen. Die Animation lässt sich beliebig auf Sections verteilen.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27091</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27091"/>
		<updated>2024-04-20T12:50:09Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Übersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 site/templates/assets/animation/bildname.png ...&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27090</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27090"/>
		<updated>2024-04-20T12:48:58Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;br /&gt;
&lt;br /&gt;
Dieser Aufbau ist am Anfang etwas komplexer, dafür können wir unsere Animationen gut erweitern und sind super flexibel und organisiert im ProcessWire. Für den Redakteur ist die Bedienung sehr einfach.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27089</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27089"/>
		<updated>2024-04-20T12:47:57Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 Box.php (Optional)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Das kann man auch selbst machen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;myTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parent = getRepeaterParent($page); // Helper function to get parent page if we are in a repeaterMatrix (see below)&lt;br /&gt;
if($parent-&amp;gt;opt_2){&lt;br /&gt;
    $out = renderAnimationCode($page,$out);        &lt;br /&gt;
}&lt;br /&gt;
return $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dies ist unser Haupttemplate. Hier starte ich den Vorgang. &lt;br /&gt;
Wichtig ist hier nur, dass wir lediglich die Helferfunktion renderAnimationCode aufrufen müssen. Der Rest geht durch unsere Vorarbeiten automatisch. &lt;br /&gt;
&lt;br /&gt;
Optional: Ich starte das nur, falls der User für die Seite Animationen (hier im Feld opt_2 aktiviert hat. Da ich oft eine RepeaterMatrix benutze müssen wir noch die Elternseite finden. Das machen wir mit einer kleinen Hilfefunktion. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;site/fields/animations/myAnimationTemplate.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Note: $value contains all values we need as an array&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$i1 = $value[&amp;#039;assetPath&amp;#039;].&amp;#039;/Cloud1-S.png&amp;#039;;&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;ani-item cloud1&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;img src=&amp;quot;&amp;lt;?=$i1?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dieses Template gibt uns das zusätzliche Markup für die Animation. Da wir in der Animation.php die ProcessWire Funktion $page-&amp;gt;renderValue() verwendet haben konnten wir im ersten Parameter unsere $options an das Template weitergeben. Im Template steht und das automatisch in der Variable $value zur Verfügung.&lt;br /&gt;
&lt;br /&gt;
site/templates/scripts/animations.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Todo event listeners für Browserfenster Größenänderungen&lt;br /&gt;
&lt;br /&gt;
gsap.registerPlugin(&amp;quot;ScrollTrigger&amp;quot;);&lt;br /&gt;
gsap.defaults({&lt;br /&gt;
  ease: &amp;quot;expo.in.out&amp;quot;, &lt;br /&gt;
  duration: 1.3&lt;br /&gt;
});&lt;br /&gt;
// COMMON VARS&lt;br /&gt;
var screenWidth = window.innerWidth&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
  // ANI-CLOUD1&lt;br /&gt;
  var cloud = $(&amp;quot;.ani-cloud1 .cloud1&amp;quot;)&lt;br /&gt;
  var wCloud = cloud.outerWidth();&lt;br /&gt;
  var hCloud = cloud.outerHeight();&lt;br /&gt;
  var tlCloud1 = gsap.timeline({&lt;br /&gt;
    scrollTrigger: {&lt;br /&gt;
      trigger: cloud,&lt;br /&gt;
      pin: false, // pin the trigger element while active?&lt;br /&gt;
      start: &amp;quot;top bottom&amp;quot;, // when the top of the trigger hits the top of the viewport&lt;br /&gt;
      end: &amp;quot;top top&amp;quot;, &lt;br /&gt;
      scrub: 0, // smooth scrubbing (seconds)&lt;br /&gt;
    },&lt;br /&gt;
    repeat: 0&lt;br /&gt;
  })&lt;br /&gt;
  tlCloud1.fromTo(cloud, {x:0, y:hCloud/2},{x:screenWidth-wCloud, duration: 2})&lt;br /&gt;
&lt;br /&gt;
  // ANI TREES1&lt;br /&gt;
  // ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zu guter Letzt müssen wir in unserer JavaScript Dateien die eigentlichen Animationen hinterlegen. In unserem Fall mit GSAP.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27088</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27088"/>
		<updated>2024-04-20T12:32:43Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Beispielszenario 1 - Section Animationen mit ScrollTrigger und ProcessWire ===&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
==== Übersicht ====&lt;br /&gt;
Benötigte Dateien&lt;br /&gt;
 _init.php&lt;br /&gt;
 site/templates/includes/Animation.php&lt;br /&gt;
 site/templates/includes/animations.inc&lt;br /&gt;
 site/templates/fields/animations/myAnimationTemplate.php&lt;br /&gt;
 site/templates/scripts/animations.js&lt;br /&gt;
 Box.php &lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Wichtig ist aber die &amp;#039;&amp;#039;&amp;#039;renderAnimationTemplate&amp;#039;&amp;#039;&amp;#039; Funktion. Diese holt ein Template welches im Ordner &lt;br /&gt;
 site/templates/fields/animations/meinAnimationsName.php &lt;br /&gt;
liegt. Der Code kann optional gewrapt werden&lt;br /&gt;
&lt;br /&gt;
animations.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * animations.inc&lt;br /&gt;
 * Helperfunctions for animations with gsap and processwire&lt;br /&gt;
 * needs Animation Class from Animation.php&lt;br /&gt;
 * mainly used in layoutblocks to render animation markup if nessecary&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * renderAnimationCode&lt;br /&gt;
  * @param Page&lt;br /&gt;
  * @param String - Markup we need to expand with animation markup&lt;br /&gt;
  * @return String&lt;br /&gt;
  */&lt;br /&gt;
function renderAnimationCode($page,$out){&lt;br /&gt;
  $ani = new Animation();&lt;br /&gt;
  if($page-&amp;gt;fp_section-&amp;gt;section_animation &amp;amp;&amp;amp; $animationName = $page-&amp;gt;fp_section-&amp;gt;section_animation-&amp;gt;value){&lt;br /&gt;
          // get animation markup&lt;br /&gt;
          $animationContent = $ani-&amp;gt;renderAnimationTemplate($animationName,array(&amp;#039;box&amp;#039;=&amp;gt;true)); &lt;br /&gt;
          // as animation object extends Box we can use it to add additional wrapper&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper&amp;#039;);&lt;br /&gt;
          $ani-&amp;gt;addClasses(&amp;#039;ani-wrapper-&amp;#039;.$animationName);&lt;br /&gt;
          $out = $ani-&amp;gt;wrap($out.$animationContent); // wrap section markup + animation markup in a container&lt;br /&gt;
  }&lt;br /&gt;
  return $out;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese kann von unseren Seitentemplates (wir nutzen eigene Templates für verschiedene Inhaltstypen) um jeweils am Ende den &amp;#039;&amp;#039;&amp;#039;Code für die gewünschte Animation einzufügen&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Im Backend kann der User über ein Dropdown Feld (section_animation) eine Animation auswählen. Hat er das getan wird über $page-&amp;gt;fp_section-&amp;gt;section_animation der Wert des Feldes ausgelesen. Unsere Animationstemplates entsprechen diesem Namen. Wir erstellen ein Animations Objekt und übergeben diesen an Animation-&amp;gt;renderAnimatioinTemplate(). Daraufhin wird uns der benötigte code zurückgegeben. Da das Animation Objekt auch alle Box Funktionen beinhaltet, können wir es auch gleich nutzen um einen Wrapper drumrum zu legen.&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27087</id>
		<title>GSAP - ProcessWire - UIKit</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_ProcessWire_-_UIKit&amp;diff=27087"/>
		<updated>2024-04-20T12:15:20Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: Die Seite wurde neu angelegt: „Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.  Beispielszenario 1 - Section Animationen mi…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beispielszenarien wie man Animationen mit ProcessWire als CMS, UIKit als CSS/JS Framework und GSAP einsetzen kann.&lt;br /&gt;
&lt;br /&gt;
Beispielszenario 1 - Section Animationen mit ScrollTrigger&lt;br /&gt;
&lt;br /&gt;
Hier möchten wir Animationen abspielen, die beim Scrollen abgespielt werden, wenn der Benutzer die Section erreicht. &lt;br /&gt;
* Die Animationen sollen für den Redakteur wählbar sein.&lt;br /&gt;
* Die Animationen an sich sind vorgefertigt&lt;br /&gt;
* Wenn sie nicht benötigt werden soll der Code nicht eingebunden werden.&lt;br /&gt;
&lt;br /&gt;
_init.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ANIMATION CODE&lt;br /&gt;
if($page-&amp;gt;opt_2){&lt;br /&gt;
  include_once(&amp;#039;includes/Animation.php&amp;#039;); // include Animation Class&lt;br /&gt;
  include_once(&amp;#039;includes/animations.inc&amp;#039;); // include additional animation helper functions&lt;br /&gt;
  page()-&amp;gt;additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;styles/animations.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendor/gsap/ScrollTrigger.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In der &amp;#039;&amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039;&amp;#039; laden wir die benötigten Skripte:&lt;br /&gt;
&lt;br /&gt;
Über das Feld $page-&amp;gt;opt_2 (Checkbox) kann der User festlegen ob für die Seite die benötigten Skripte geladen werden. &lt;br /&gt;
&lt;br /&gt;
page()-&amp;gt;additionalHeaderData wird in einem späteren Template eingefügt. Man könnte auch über einen Hook arbeiten, dies ist aber eine einfache effektive Lösung.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039; liefert die Klasse Animation, die im wesentlichen Funktionen bietet um Code aus einem Template zu laden und in den aktuellen Markup einzubetten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;animations.inc&amp;#039;&amp;#039;&amp;#039; liefert Helferfunktionen für die Layoutblocks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Animation.php&amp;#039;&amp;#039;&amp;#039;&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;
 * GSAP ANIMATIONS FOR 3B&lt;br /&gt;
 * v0.1&lt;br /&gt;
 * Helper functions for the GSAP Animation. &lt;br /&gt;
 * I.e. for loading nessecary assets.&lt;br /&gt;
 * The animation itself is handled by animation.js&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
 class Animation extends Box&lt;br /&gt;
{&lt;br /&gt;
	public $classes = array();&lt;br /&gt;
	public $styles = array();&lt;br /&gt;
	public $classesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $stylesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	public $attributes = array();&lt;br /&gt;
&lt;br /&gt;
	// init section with page values aka layout_block values&lt;br /&gt;
	function __construct($classes = array(&amp;#039;ani-box&amp;#039;), $styles = array(), $attributes = array()){&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Uses a template file to create the animation markup inside a wrapper box&lt;br /&gt;
	 * @param String template filename (without suffix)&lt;br /&gt;
	 * @param Array associative Array containing rendering options&lt;br /&gt;
	 */&lt;br /&gt;
	function renderAnimationTemplate($animationName,$options=array()){&lt;br /&gt;
		$defaults = array(&lt;br /&gt;
			&amp;#039;box&amp;#039;=&amp;gt;false, // wrap the animation template content in a container?&lt;br /&gt;
			&amp;#039;classes&amp;#039;=&amp;gt;&amp;#039;ani-box&amp;#039;, // classes for the container (if used)&lt;br /&gt;
			&amp;#039;assetPath&amp;#039;=&amp;gt;urls()-&amp;gt;templates.&amp;#039;assets/animations&amp;#039;, // path to animation assets - can be used by templates&lt;br /&gt;
			&amp;#039;templatePath&amp;#039;=&amp;gt;&amp;#039;animations/&amp;#039;.$animationName // render templates starting at /site/templates/&lt;br /&gt;
		);&lt;br /&gt;
		$options = array_merge($defaults, $options);&lt;br /&gt;
		$options[&amp;#039;animationName&amp;#039;] = $animationName;&lt;br /&gt;
		bd($options);&lt;br /&gt;
		$animationBoxContent = page()-&amp;gt;renderValue($options,$options[&amp;#039;templatePath&amp;#039;]);&lt;br /&gt;
		&lt;br /&gt;
		$animationBox = new Box();&lt;br /&gt;
		if($options[&amp;#039;classes&amp;#039;]) $animationBox-&amp;gt;addClasses(preg_replace(&amp;quot;/[^a-zA-Z0-9-\s]+/&amp;quot;, &amp;quot;&amp;quot;, $options[&amp;#039;classes&amp;#039;]));&lt;br /&gt;
		$animationBox-&amp;gt;addClasses($animationName);&lt;br /&gt;
		if($options[&amp;#039;box&amp;#039;]) $animationBoxContent = $animationBox-&amp;gt;wrap($animationBoxContent,&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return $animationBoxContent;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klasse Animation bekommt von der Klasse Box alle Funktionen zum einfachen erstellen von HTML Containern mit Klassen und Attributen. Wichtig ist aber die renderAnimationTemplate Funktion. Diese holt ein Template welches im Ordner site/templates/fields/animations/meinAnimationsName.php liegt. Der Code wird am Ende &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP&amp;diff=27086</id>
		<title>GSAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP&amp;diff=27086"/>
		<updated>2024-04-20T11:35:26Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Greensock Animation Plattform ==&lt;br /&gt;
GSAP ist eine Sammlung von JavaScripten zur Animation. Es ist im Moment der quasi Standard wenn es um JavaScript Manipulation von CSS Eigenschaften geht. &lt;br /&gt;
&lt;br /&gt;
GSAP ist in der Basisversion frei. Mit einem kostenpflichtigen Account bekommt man zusätzliche Plugins.&lt;br /&gt;
&lt;br /&gt;
GSAP übernimmt einem Arbeit ab, da es recht gut mit verschiedenen Browsern und Plattformen umgehen kann und außerdem performant arbeitet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[GSAP - ProcessWire - UIKit]]&lt;br /&gt;
 [[GSAP - Timelines]]&lt;br /&gt;
 https://greensock.com&lt;br /&gt;
 https://greensock.com/install&lt;br /&gt;
 [[GSAP - Snippets]]&lt;br /&gt;
 https://tympanus.net/codrops/2019/11/14/the-new-features-of-gsap-3/&lt;br /&gt;
 https://greensock.com/scrollmagic - obsolet mit ScrollTrigger&lt;br /&gt;
 https://css-tricks.com/writing-smarter-animation-code/ // *****&lt;br /&gt;
 https://css-tricks.com/tips-for-writing-animation-code-efficiently/ // *****&lt;br /&gt;
 [[GSAP - Plugins]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
 [[GSAP - Infinite Textbanner]]&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Einbinden&lt;br /&gt;
 &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;js/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
Einfache Animationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ease In Out&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;
== Basics ==&lt;br /&gt;
=== Animation Properties ===&lt;br /&gt;
CSS transform Eingenschaften sind performant&lt;br /&gt;
&lt;br /&gt;
Liste der Properties: https://gsap.com/resources/get-started/&lt;br /&gt;
&lt;br /&gt;
== Umstieg von v2 auf v3 / Codesnippets ==&lt;br /&gt;
 https://greensock.com/3-release-notes&lt;br /&gt;
Vieles wurde vereinfacht. Die meisten alten Funktionen funktionieren weiterhin. Neue Projekte sollte man in der neuen Syntax realisieren. Es kamen viele nützliche Dinge hinzu.&lt;br /&gt;
&lt;br /&gt;
=== Vereinheitlichung der Objekte ===&lt;br /&gt;
* Keine Unterscheidung mehr zwischen TweenMax und TweenMax Lite, Timeline... Es gibt &amp;#039;&amp;#039;&amp;#039;nur noch ein gsap Objekt&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Duration ist jetzt im Eigenschaften Objekt.&lt;br /&gt;
 //OLD - duration was 2nd parameter&lt;br /&gt;
 TweenMax.to(&amp;quot;.class&amp;quot;, 1, {x:100});&lt;br /&gt;
 //NEW - duration is now a property of the vars object&lt;br /&gt;
 gsap.to(&amp;quot;.class&amp;quot;, {duration:1, x:100});&lt;br /&gt;
* Ease ist einfacher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Vererbung von Timeline Eigenschaften ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.timeline({defaults:{ease:&amp;quot;back&amp;quot;, duration:2}})&lt;br /&gt;
    .to(&amp;quot;.class-1&amp;quot;, {x:100}) //inherits the ease and duration from the parent timeline!&lt;br /&gt;
    .to(&amp;quot;.class-2&amp;quot;, {y:200}) //this one too&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Staggering als Eigenschaft ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Staggering&amp;#039;&amp;#039;&amp;#039; in den Properties. Früher mußte man stagger Funktionen nutzen (staggerTo()...)&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;
=== Keyframes ===&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;/syntaxhighligh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neue Timeline Control Features ===&lt;br /&gt;
Standardmäßig startet ein Tween nachdem der vorige beendet ist. möchte man ihn gleichzeitig starten musste man früher mit Labels arbeiten, oder die Dauer wissen und ihn vorziehen. Jetzt geht das einfacher. &amp;#039;&amp;#039;&amp;#039;Man kann eine nachfolgende Animation relativ zum Endpunkt ODER zum Startpunkt der vorigen positionieren.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;quot; references the most recently-added animation&amp;#039;s START time&lt;br /&gt;
* &amp;quot;&amp;gt;&amp;quot; references the most recently-added animation&amp;#039;s END time&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tl = gsap.timeline();&lt;br /&gt;
tl.to(...)&lt;br /&gt;
  .to(..., &amp;quot;&amp;quot;) //starts immediately after the previous tween&amp;#039;s end time (sequenced)&lt;br /&gt;
  .to(..., &amp;quot;&amp;gt;-0.5&amp;quot;) //overlaps with the previous tween by 0.5 seconds (because the number is negative)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Globale Timeline kontrollieren ===&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;
&lt;br /&gt;
=== Sinnvollere Aliase ===&lt;br /&gt;
* Sinnvollere Aliase für CSS-Eigenschaften: x -&amp;gt; translateX, y -&amp;gt; translateY, rotate -&amp;gt; rotation&lt;br /&gt;
Geschickte Shortcuts für 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;
Einheiten für x und y Transformationen möglich:&lt;br /&gt;
 gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
   x:&amp;quot;50vw&amp;quot;, //units! (default is px)&lt;br /&gt;
   y:&amp;quot;5em&amp;quot;&lt;br /&gt;
 });&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MotionPathPlugin&amp;#039;&amp;#039;&amp;#039; ersetzt BezierPlugin. Hat zusätzlich einen &amp;#039;&amp;#039;&amp;#039;Editor&amp;#039;&amp;#039;&amp;#039; (nur Club Members)&lt;br /&gt;
* Neue &amp;#039;&amp;#039;&amp;#039;random&amp;#039;&amp;#039;&amp;#039; Funktion&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;getProperty&amp;#039;&amp;#039;&amp;#039; Funktion mit Konvertierung von Einheiten&lt;br /&gt;
* Es lassen sich &amp;quot;&amp;#039;&amp;#039;&amp;#039;effects&amp;#039;&amp;#039;&amp;#039;&amp;quot; definieren, die man dann als Animation / Timeline wieder verwenden kann. Auch Parameter kann man nutzen.&lt;br /&gt;
* Man kann jetzt width und height von DOM Objekten animieren die mit &amp;quot;&amp;#039;&amp;#039;&amp;#039;auto&amp;#039;&amp;#039;&amp;#039;&amp;quot; definiert sind.&lt;br /&gt;
* Snap Plugin - bietet mehrere Möglichkeiten auf bestimmte Werte zu runden (in Array, in der Nähe...)&lt;br /&gt;
* Zahlreiche nützliche Utility Funktionen&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP&amp;diff=27085</id>
		<title>GSAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP&amp;diff=27085"/>
		<updated>2024-04-19T19:41:11Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Greensock Animation Plattform ==&lt;br /&gt;
GSAP ist eine Sammlung von JavaScripten zur Animation. Es ist im Moment der quasi Standard wenn es um JavaScript Manipulation von CSS Eigenschaften geht. &lt;br /&gt;
&lt;br /&gt;
GSAP ist in der Basisversion frei. Mit einem kostenpflichtigen Account bekommt man zusätzliche Plugins.&lt;br /&gt;
&lt;br /&gt;
GSAP übernimmt einem Arbeit ab, da es recht gut mit verschiedenen Browsern und Plattformen umgehen kann und außerdem performant arbeitet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[GSAP - Timelines]]&lt;br /&gt;
 https://greensock.com&lt;br /&gt;
 https://greensock.com/install&lt;br /&gt;
 [[GSAP - Snippets]]&lt;br /&gt;
 https://tympanus.net/codrops/2019/11/14/the-new-features-of-gsap-3/&lt;br /&gt;
 https://greensock.com/scrollmagic - obsolet mit ScrollTrigger&lt;br /&gt;
 https://css-tricks.com/writing-smarter-animation-code/ // *****&lt;br /&gt;
 https://css-tricks.com/tips-for-writing-animation-code-efficiently/ // *****&lt;br /&gt;
 [[GSAP - Plugins]]&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
 [[GSAP - Infinite Textbanner]]&lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
Einbinden&lt;br /&gt;
 &amp;lt;script src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;js/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
Einfache Animationen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ease In Out&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;
== Basics ==&lt;br /&gt;
=== Animation Properties ===&lt;br /&gt;
CSS transform Eingenschaften sind performant&lt;br /&gt;
&lt;br /&gt;
Liste der Properties: https://gsap.com/resources/get-started/&lt;br /&gt;
&lt;br /&gt;
== Umstieg von v2 auf v3 / Codesnippets ==&lt;br /&gt;
 https://greensock.com/3-release-notes&lt;br /&gt;
Vieles wurde vereinfacht. Die meisten alten Funktionen funktionieren weiterhin. Neue Projekte sollte man in der neuen Syntax realisieren. Es kamen viele nützliche Dinge hinzu.&lt;br /&gt;
&lt;br /&gt;
=== Vereinheitlichung der Objekte ===&lt;br /&gt;
* Keine Unterscheidung mehr zwischen TweenMax und TweenMax Lite, Timeline... Es gibt &amp;#039;&amp;#039;&amp;#039;nur noch ein gsap Objekt&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Duration ist jetzt im Eigenschaften Objekt.&lt;br /&gt;
 //OLD - duration was 2nd parameter&lt;br /&gt;
 TweenMax.to(&amp;quot;.class&amp;quot;, 1, {x:100});&lt;br /&gt;
 //NEW - duration is now a property of the vars object&lt;br /&gt;
 gsap.to(&amp;quot;.class&amp;quot;, {duration:1, x:100});&lt;br /&gt;
* Ease ist einfacher&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Vererbung von Timeline Eigenschaften ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
gsap.timeline({defaults:{ease:&amp;quot;back&amp;quot;, duration:2}})&lt;br /&gt;
    .to(&amp;quot;.class-1&amp;quot;, {x:100}) //inherits the ease and duration from the parent timeline!&lt;br /&gt;
    .to(&amp;quot;.class-2&amp;quot;, {y:200}) //this one too&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Staggering als Eigenschaft ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Staggering&amp;#039;&amp;#039;&amp;#039; in den Properties. Früher mußte man stagger Funktionen nutzen (staggerTo()...)&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;
=== Keyframes ===&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;/syntaxhighligh&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Neue Timeline Control Features ===&lt;br /&gt;
Standardmäßig startet ein Tween nachdem der vorige beendet ist. möchte man ihn gleichzeitig starten musste man früher mit Labels arbeiten, oder die Dauer wissen und ihn vorziehen. Jetzt geht das einfacher. &amp;#039;&amp;#039;&amp;#039;Man kann eine nachfolgende Animation relativ zum Endpunkt ODER zum Startpunkt der vorigen positionieren.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;quot;&amp;lt;&amp;quot; references the most recently-added animation&amp;#039;s START time&lt;br /&gt;
* &amp;quot;&amp;gt;&amp;quot; references the most recently-added animation&amp;#039;s END time&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var tl = gsap.timeline();&lt;br /&gt;
tl.to(...)&lt;br /&gt;
  .to(..., &amp;quot;&amp;quot;) //starts immediately after the previous tween&amp;#039;s end time (sequenced)&lt;br /&gt;
  .to(..., &amp;quot;&amp;gt;-0.5&amp;quot;) //overlaps with the previous tween by 0.5 seconds (because the number is negative)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Globale Timeline kontrollieren ===&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;
&lt;br /&gt;
=== Sinnvollere Aliase ===&lt;br /&gt;
* Sinnvollere Aliase für CSS-Eigenschaften: x -&amp;gt; translateX, y -&amp;gt; translateY, rotate -&amp;gt; rotation&lt;br /&gt;
Geschickte Shortcuts für 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;
Einheiten für x und y Transformationen möglich:&lt;br /&gt;
 gsap.to(&amp;quot;.class&amp;quot;, {&lt;br /&gt;
   x:&amp;quot;50vw&amp;quot;, //units! (default is px)&lt;br /&gt;
   y:&amp;quot;5em&amp;quot;&lt;br /&gt;
 });&lt;br /&gt;
=== Sonstiges ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MotionPathPlugin&amp;#039;&amp;#039;&amp;#039; ersetzt BezierPlugin. Hat zusätzlich einen &amp;#039;&amp;#039;&amp;#039;Editor&amp;#039;&amp;#039;&amp;#039; (nur Club Members)&lt;br /&gt;
* Neue &amp;#039;&amp;#039;&amp;#039;random&amp;#039;&amp;#039;&amp;#039; Funktion&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;getProperty&amp;#039;&amp;#039;&amp;#039; Funktion mit Konvertierung von Einheiten&lt;br /&gt;
* Es lassen sich &amp;quot;&amp;#039;&amp;#039;&amp;#039;effects&amp;#039;&amp;#039;&amp;#039;&amp;quot; definieren, die man dann als Animation / Timeline wieder verwenden kann. Auch Parameter kann man nutzen.&lt;br /&gt;
* Man kann jetzt width und height von DOM Objekten animieren die mit &amp;quot;&amp;#039;&amp;#039;&amp;#039;auto&amp;#039;&amp;#039;&amp;#039;&amp;quot; definiert sind.&lt;br /&gt;
* Snap Plugin - bietet mehrere Möglichkeiten auf bestimmte Werte zu runden (in Array, in der Nähe...)&lt;br /&gt;
* Zahlreiche nützliche Utility Funktionen&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27084</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27084"/>
		<updated>2024-04-19T17:12:52Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Kleine ProcessWire Renderübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// $page-&amp;gt;render&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// renderValue usage&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value);&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value, string $file = &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Render a value using site/templates/fields/my-images.php custom output template&lt;br /&gt;
$images = $page-&amp;gt;images;&lt;br /&gt;
echo $page-&amp;gt;renderValue($images, &amp;#039;my-images&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// In Template .../fields/children.php access $results as $value &lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;);&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// $files-&amp;gt;renderUsage&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27083</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27083"/>
		<updated>2024-04-19T17:11:03Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Kleine ProcessWire Renderübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// renderValue usage&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value);&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value, string $file = &amp;#039;&amp;#039;);&lt;br /&gt;
// Render a value using site/templates/fields/my-images.php custom output template&lt;br /&gt;
$images = $page-&amp;gt;images;&lt;br /&gt;
echo $page-&amp;gt;renderValue($images, &amp;#039;my-images&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// In Template .../fields/children.php access $results as $value &lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;);&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// $files-&amp;gt;renderUsage&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27082</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27082"/>
		<updated>2024-04-19T17:09:55Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Kleine ProcessWire Renderübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// renderValue usage&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value);&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value, string $file = &amp;#039;&amp;#039;);&lt;br /&gt;
// Render a value using site/templates/fields/my-images.php custom output template&lt;br /&gt;
$images = $page-&amp;gt;images;&lt;br /&gt;
echo $page-&amp;gt;renderValue($images, &amp;#039;my-images&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// In Template access $results as $value / template is .../fields/children.php&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;);&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
// $files-&amp;gt;renderUsage&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27081</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27081"/>
		<updated>2024-04-19T17:04:42Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// renderValue basic usage&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value);&lt;br /&gt;
&lt;br /&gt;
// usage with all arguments&lt;br /&gt;
$mixed = $page-&amp;gt;renderValue(mixed $value, string $file = &amp;#039;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// Render PageArray using site/templates/fields/myFieldTemplate and access ther with &lt;br /&gt;
$page-&amp;gt;renderValue($myPageArray, &amp;#039;myField.php&amp;#039;); &lt;br /&gt;
// Render a value using site/templates/fields/my-images.php custom output template&lt;br /&gt;
$images = $page-&amp;gt;images;&lt;br /&gt;
echo $page-&amp;gt;renderValue($images, &amp;#039;my-images&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27080</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27080"/>
		<updated>2024-04-19T16:59:23Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// render the pages using templates/fields/myFieldTemplate and access ther with $page-&amp;gt;&lt;br /&gt;
$page-&amp;gt;renderValue($myPageArray, &amp;#039;myFieldTemplate&amp;#039;); &lt;br /&gt;
$page-&amp;gt;renderValue($myValue, &amp;#039;templateName&amp;#039;); // &lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27079</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27079"/>
		<updated>2024-04-19T16:55:51Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename (including .php) assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $myArray); // $myArray can be accessed via $options in Template&lt;br /&gt;
$page-&amp;gt;render($fieldname) // short for $page-&amp;gt;renderField() IF parameter is a fieldname - then pw looks for template file in /fields&lt;br /&gt;
&lt;br /&gt;
// render the pages using templates/fields/myFieldTemplate and access ther with $page-&amp;gt;&lt;br /&gt;
$page-&amp;gt;renderValue($myPageArray, &amp;#039;myFieldTemplate&amp;#039;); &lt;br /&gt;
$page-&amp;gt;renderValue($myValue, &amp;#039;templateName&amp;#039;); // &lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&lt;br /&gt;
//$page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file)&lt;br /&gt;
//wireRenderFile() renders a specific file without the need for a Page object&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Use Cases und Unterschiede ==&lt;br /&gt;
$page-&amp;gt;render(&amp;#039;some_field&amp;#039;) does indeed call renderField(), but only if the given param is a field name. Take a look at PageRender for more details. If you provide a filename as a param, $page-&amp;gt;render() will use that file to render given page.&lt;br /&gt;
&lt;br /&gt;
If you provide a filename (actual filename, not just something like &amp;quot;file&amp;quot;) to $page-&amp;gt;render() as the first param, you can provide an array as the second param, and the values stored in that array can then be accessed via $options.&lt;br /&gt;
&lt;br /&gt;
It seems to me that you&amp;#039;re trying to use $page-&amp;gt;render() to something it&amp;#039;s really not meant for: $page-&amp;gt;render() is intended for rendering a specific page (optionally using a specific file), while wireRenderFile() renders a specific file without the need for a Page object. Those are two different use cases.&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27078</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27078"/>
		<updated>2024-04-19T16:27:16Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Kleine ProcessWire Renderübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&lt;br /&gt;
// render the pages using templates/fields/myFieldTemplate and access ther with $page-&amp;gt;&lt;br /&gt;
$page-&amp;gt;renderValue($myPageArray, &amp;#039;myFieldTemplate&amp;#039;); &lt;br /&gt;
$page-&amp;gt;renderValue($myValue, &amp;#039;templateName&amp;#039;); // &lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27077</id>
		<title>ProcessWire - Rendering Templates mit fields Ordner</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27077"/>
		<updated>2024-04-19T16:19:50Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Felder aus anderen Seiten rendern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[ProcessWire - Render Funktionen]] (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. &lt;br /&gt;
Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix.&lt;br /&gt;
&lt;br /&gt;
Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das children.php Template kann auf die Seiten via $page-&amp;gt;children zugreifen, weil wir als Feldnamen &amp;#039;children&amp;#039; übergeben haben.&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27076</id>
		<title>ProcessWire - Rendering Templates mit fields Ordner</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27076"/>
		<updated>2024-04-19T16:15:15Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[ProcessWire - Render Funktionen]] (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. &lt;br /&gt;
Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix.&lt;br /&gt;
&lt;br /&gt;
Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27075</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27075"/>
		<updated>2024-04-19T16:11:30Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&lt;br /&gt;
$page-&amp;gt;renderValue($myPageArray, &amp;#039;myRenderFileNameInTemplatesFields&amp;#039;); // use the template above to render it&lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]); // mostly for delayed output&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27074</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27074"/>
		<updated>2024-04-19T16:07:52Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Kleine ProcessWire Renderübersicht */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
Die häufigsten...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]);&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27073</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27073"/>
		<updated>2024-04-19T16:05:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Kleine ProcessWire Renderübersicht ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&lt;br /&gt;
$files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]);&lt;br /&gt;
wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id)); // old version of $files-&amp;gt;render&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Funktionen&amp;diff=27072</id>
		<title>ProcessWire - Rendering Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Funktionen&amp;diff=27072"/>
		<updated>2024-04-19T15:55:53Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In den Template Strategien sind einige Methoden beschrieben wie man Seiten in ProcessWire rendern kann.&lt;br /&gt;
&lt;br /&gt;
PW stellt aber auch einige Funktionen bereit, mit denen man Dateien oder Seiten direkt rendern kann. Diese arbeiten auch gut mit dem WireCache zusammen. So kann man Teile der Ausgabe rendern und gleich Cachen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Render Funktionen]] (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)&lt;br /&gt;
 https://processwire.com/api/ref/wire-file-tools/render/&lt;br /&gt;
 https://processwire.com/api/ref/functions/wire-render-file/&lt;br /&gt;
 https://processwire.com/api/ref/page/render-field/&lt;br /&gt;
 https://processwire.com/talk/topic/20797-clean-syntax-for-rendering-pages-with-specific-template/&lt;br /&gt;
 https://processwire.com/talk/topic/3145-multiple-views-for-templates/page/2/?tab=comments#comment-32876 (ergiebiger thread)&lt;br /&gt;
 https://processwire.com/api/ref/inputfield-checkboxes/render/&lt;br /&gt;
 https://processwire.com/api/ref/page/render-field/&lt;br /&gt;
 https://processwire.com/api/ref/page/render-value/ (mit Markup File)&lt;br /&gt;
 https://processwire.com/docs/front-end/output/delayed/ (delayed output)&lt;br /&gt;
 https://processwire.com/talk/topic/13958-help-understanding-render-and-rendervalue/&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
 $files-&amp;gt;render // modern version for wireRenderFile&lt;br /&gt;
 $page-&amp;gt;render&lt;br /&gt;
 https://processwire.com/api/ref/page/render-field/&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($options); // array of options and/or your own variables&lt;br /&gt;
$page-&amp;gt;render(array(&amp;#039;foo&amp;#039; =&amp;gt; &amp;#039;bar&amp;#039;)); // same as above&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$content .= $files-&amp;gt;render(&amp;#039;teasers&amp;#039;, [&amp;#039;items&amp;#039; =&amp;gt; $pages-&amp;gt;find(&amp;quot;template=article&amp;quot;)]);&lt;br /&gt;
&lt;br /&gt;
foreach ($pages-&amp;gt;find(&amp;quot;template=article&amp;quot;) as $article) {&lt;br /&gt;
    $content .= $article-&amp;gt;render(&amp;#039;teaser.php&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Pass vars ===&lt;br /&gt;
==== Variable in render Funktion einer Seite übergeben ==== &lt;br /&gt;
&lt;br /&gt;
 echo $myPage-&amp;gt;render(array(&amp;#039;mobile&amp;#039; =&amp;gt; $mobile));&lt;br /&gt;
&lt;br /&gt;
==== Variable an RepeaterMatrix Item übergeben ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach(page()-&amp;gt;layout_blocks as $item) {&lt;br /&gt;
  $c++;&lt;br /&gt;
  $item-&amp;gt;set(&amp;#039;site&amp;#039;,$site);&lt;br /&gt;
  //...&lt;br /&gt;
}&lt;br /&gt;
// access in item via &lt;br /&gt;
// $page-&amp;gt;site&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Check if File is called directly or via wire-&amp;gt;render-&amp;gt;file ===&lt;br /&gt;
 https://processwire.com/talk/topic/20915-wirerenderfile-question-about-page/&lt;br /&gt;
Is there a way to check in my included template file if this child page is called directly, or whether it has been included from somewhere else? A simple check, so I can use the template in both scenarios (stand-alone view for just this page, or in cases I use wireRenderFile somewhere else). Right now I am passing the child page&amp;#039;s ID like this:&lt;br /&gt;
&lt;br /&gt;
 wireRenderFile(&amp;#039;my_template&amp;#039;, array(&amp;#039;pid&amp;#039; =&amp;gt; $child-&amp;gt;id));&lt;br /&gt;
And in my_template, to access it&amp;#039;s own page fields, etc. I use&lt;br /&gt;
&lt;br /&gt;
 $thisPage = pages()-&amp;gt;get($pid);&lt;br /&gt;
 $myField = $thisPage-&amp;gt;foo; // etc.&lt;br /&gt;
Is that the way to go, or do I overlook something obvious?&lt;br /&gt;
&lt;br /&gt;
d&amp;#039;oh of course, it&amp;#039;s as simple as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 if(isset($pid)) {&lt;br /&gt;
    $thisPage = pages()-&amp;gt;get($pid); // we get called with wireRenderFile&lt;br /&gt;
 } else {&lt;br /&gt;
    $thisPage = $page; // business as usual&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rendering von _main (AppendFile) verhindern ==&lt;br /&gt;
Manchmal möchte man das automatische Einbinden von _main.php das man vorher in config.php angelegt hat verhindern. Z.B. Wenn man nur einen Teilbereich mit einer Templatedatei render möchte.&lt;br /&gt;
&lt;br /&gt;
Es gibt verschiedene Strategien:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Template Einstellungen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In neueren Versionen kann man appendFile (und prependFile) direkt im Template unter dem Tab &amp;#039;&amp;#039;&amp;#039;Datei&amp;#039;&amp;#039;&amp;#039; deaktivieren&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;2. In _init.php Prüfvariable anlegen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* * Whether to include the _main.php markup file? &lt;br /&gt;
For example, your template * file would set it to false when generating a page &lt;br /&gt;
for sitemap.xml * or ajax output, in order to prevent display of the main &amp;lt;html&amp;gt; &lt;br /&gt;
document. * */&lt;br /&gt;
&lt;br /&gt;
$useMain = true;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In _main.php abfragen:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 if(!$useMain) return;&lt;br /&gt;
&lt;br /&gt;
In Templates die _main.php nicht nutzen sollen:&lt;br /&gt;
 $useMain = false;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;3. Man kann auch mit Funktionen das append Steuern:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$tpl = $templates-&amp;gt;get(&amp;quot;location&amp;quot;);&lt;br /&gt;
$tpl-&amp;gt;noAppendTemplateFile = 1;&lt;br /&gt;
$tpl-&amp;gt;appendFile = &amp;quot;&amp;quot;;&lt;br /&gt;
$tpl-&amp;gt;save();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Page_Rendering_Functions&amp;diff=27071</id>
		<title>ProcessWire - Page Rendering Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Page_Rendering_Functions&amp;diff=27071"/>
		<updated>2024-04-19T15:54:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[ProcessWire - Render Funktionen]] (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]] Weitere Render Funktionen&lt;br /&gt;
 https://processwire.com/talk/topic/13958-help-understanding-render-and-rendervalue/&lt;br /&gt;
 https://processwire.com/talk/topic/3145-multiple-views-for-templates/?page=2#comment-32876&lt;br /&gt;
&lt;br /&gt;
Auf den ersten Blick sehr verwirrend und nicht besonders gut dokumentiert sind die Render Funktionen in ProcessWire. Dazu kommen diverse shortcuts die den Überblick erschweren.&lt;br /&gt;
&lt;br /&gt;
== Sammlung ==&lt;br /&gt;
 $page-&amp;gt;render(&amp;quot;some_field&amp;quot;) &lt;br /&gt;
Ist ein Alias für &lt;br /&gt;
 $page-&amp;gt;renderField(),&lt;br /&gt;
Übergibst du einen &amp;#039;&amp;#039;&amp;#039;Dateinamen&amp;#039;&amp;#039;&amp;#039; wird diese Datei zum Rendern genutzt.&lt;br /&gt;
&lt;br /&gt;
Dann kannst du als &amp;#039;&amp;#039;&amp;#039;zweiten Parameter&amp;#039;&amp;#039;&amp;#039; ein Array übergeben in dem du Variablen hinterlegst. Auf diese kann über $options in der Renderdatei zugegriffen werden.&lt;br /&gt;
 wireRenderFile() &lt;br /&gt;
Kann eine Datei ohne page Objekt rendern.&lt;br /&gt;
&lt;br /&gt;
Du kannst auch Eigenschaften direkt an das Seitenobjekt hängen und dann darauf zugreifen. Du musst aber aufpassen, dass du nichts überschreibst&lt;br /&gt;
 $pageObject-&amp;gt;myVar = &amp;quot;Hallo Welt&amp;quot; // Nützlich für Layoutblocks&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$page-&amp;gt;render($filename); // $filename assumed in /site/templates/&lt;br /&gt;
$page-&amp;gt;render($pathname); // $pathname is full path, but must resolve somewhere in web root&lt;br /&gt;
$page-&amp;gt;render($options); // array of options and/or your own variables&lt;br /&gt;
$page-&amp;gt;render(array(&amp;#039;foo&amp;#039; =&amp;gt; &amp;#039;bar&amp;#039;)); // same as above&lt;br /&gt;
$page-&amp;gt;render($filename, $options); // specify filename and options/vars, etc.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
If you made this render() call:&lt;br /&gt;
&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;myfile.php&amp;#039;, array(&amp;#039;foo&amp;#039; =&amp;gt; &amp;#039;bar&amp;#039;)); &lt;br /&gt;
myfile.php could access the &amp;#039;foo&amp;#039; variable like this:&lt;br /&gt;
&lt;br /&gt;
 echo $options[&amp;#039;foo&amp;#039;]; // outputs &amp;quot;bar&amp;quot;&lt;br /&gt;
=== PageStack ===&lt;br /&gt;
 $options[&amp;#039;pageStack&amp;#039;]. That is an array containing a stack of pages that called render().&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27070</id>
		<title>ProcessWire - Rendering Templates mit fields Ordner</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27070"/>
		<updated>2024-04-19T15:54:28Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 ProcessWire - Render Funktionen (Inhaltsverzeichnis zu Renderseiten mit ProcessWire)&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. &lt;br /&gt;
Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix.&lt;br /&gt;
&lt;br /&gt;
Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27069</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27069"/>
		<updated>2024-04-19T15:53:25Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier eine Übersicht über verschiedene Möglichkeiten Files, Felder und Templates zu rendern.&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27068</id>
		<title>ProcessWire - Rendering Templates mit fields Ordner</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27068"/>
		<updated>2024-04-19T15:52:23Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Seit der Version 3 gibt es den fields Ordner mit dem man sehr einfach verschiedene Teiltemplates anlegen kann. &lt;br /&gt;
Das ist für mich die wichtigste Variante um flexible Backends anzulegen. Vor allem in Verbindung mit der RepeaterMatrix.&lt;br /&gt;
&lt;br /&gt;
Man kann den Inhalt eines Feldes aus dem Backend über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27067</id>
		<title>ProcessWire - Rendering Templates mit fields Ordner</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Rendering_Templates_mit_fields_Ordner&amp;diff=27067"/>
		<updated>2024-04-19T15:50:12Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: Die Seite wurde neu angelegt: „== Felder mit Templates rendern == ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes über ein Template rendern…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27066</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27066"/>
		<updated>2024-04-19T15:50:02Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: Der Seiteninhalt wurde durch einen anderen Text ersetzt: „Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates == Links ==  ProcessWire - Page Rendering Functions…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 [[ProcessWire - Rendering Templates mit fields Ordner]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27065</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27065"/>
		<updated>2024-04-19T15:47:40Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[ProcessWire - Page Rendering Functions]]&lt;br /&gt;
 [[ProcessWire - Rendering Funktionen]]&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire&amp;#039;s $page-&amp;gt;render Funktion ist extrem flexibel. Sie kann direkt den Inhalt eines Feldes über ein Template rendern, wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Der Inhalt eines body Felds soll ausgegeben werden und dazu soll ein Template genutzt werden, mit dem der Inhalt zusätzlich von einem Div umgeben wird.&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zur Ausgabe gibt es mehrere Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte. Einfach vorne und hinten ein Underscore.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung, die man in den Templates nutzen kann:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
Weitere Variablen kann man mit &amp;#039;&amp;#039;&amp;#039;$page-&amp;gt;set()&amp;#039;&amp;#039;&amp;#039; übergeben.&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder aus anderen Seiten rendern ===&lt;br /&gt;
Mit $page-&amp;gt;render() haben wir Werte aus der aktuellen Seite gerendert. Man kann aber auch aus beliebigen Seiten Felder Rendern. Dazu gibt es renderValue()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find(&amp;quot;body%=some text&amp;quot;); // find some pages and store in a PageArray&lt;br /&gt;
echo $page-&amp;gt;renderValue($results, &amp;#039;children&amp;#039;); // use the template above to render it&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier müssen wir die Seiten als Parameter mitgeben, da wir ja nicht von der aktuellen Seite rendern wollen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27064</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27064"/>
		<updated>2024-04-19T15:30:39Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire rendert Felder mit einem Template wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B. mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Felder sinnvoll gruppieren ===&lt;br /&gt;
Mit geschickter Strategie lassen sich zum Beispiel geschickt Varianten erzeugen. Z.B. verkürzte Absätze oder Thumbnails statt der Vollansicht:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/body.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render the first found paragraph only&lt;br /&gt;
if(preg_match(&amp;#039;!(&amp;lt;p&amp;gt;.+?&amp;lt;/p&amp;gt;)!&amp;#039;, $value, $matches)) {&lt;br /&gt;
  echo $matches[1];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/images.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a thumbnail of the first image&lt;br /&gt;
if(count($value)) {&lt;br /&gt;
  $image = $value-&amp;gt;first()-&amp;gt;width(200);&lt;br /&gt;
  echo &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039; alt=&amp;#039;$image-&amp;gt;description&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;/site/templates/fields/short/title-link.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// render a linked title&lt;br /&gt;
echo &amp;quot;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;h2&amp;gt;$page-&amp;gt;title&amp;lt;/h2&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Im Haupttemplate kann man das z.B. für eine Zusammenfassung nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $child) {&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;title&amp;#039;, &amp;#039;short/title-link&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;images&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
  echo $child-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;short/&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27063</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27063"/>
		<updated>2024-04-19T15:23:19Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire rendert Felder mit einem Template wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B. mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
&lt;br /&gt;
=== Varianten (Custom Template) ===&lt;br /&gt;
Mit einem Zweiten Parameter kann man auch weitere Templates anlegen. Die werden dann passend zum Namen gesucht. Reihenfolge wie im Beispiel&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;custom&amp;#039;); &lt;br /&gt;
Sucht nach templates wie unten und nimmt das erste das gefunden wird. Die erste Variante ergibt für mich am meisten Sinn.&lt;br /&gt;
&lt;br /&gt;
    /site/templates/fields/body/custom.php&lt;br /&gt;
    /site/templates/fields/custom/body.php&lt;br /&gt;
    /site/templates/fields/custom.php&lt;br /&gt;
    /site/templates/fields/body.php (fallback)&lt;br /&gt;
Man kann es aber auch genau angeben:&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom&amp;#039;); // use only custom.php&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;body&amp;#039;, &amp;#039;/custom/body&amp;#039;); // use only custom/body.php&lt;br /&gt;
&lt;br /&gt;
=== Felder mit Repeater Matrix ===&lt;br /&gt;
&lt;br /&gt;
Matrix Felder könnte man so handeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;test_matrix as $item) {&lt;br /&gt;
  if($item-&amp;gt;type == &amp;#039;content&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;h3&amp;gt;$item-&amp;gt;headline&amp;lt;/h3&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;$item-&amp;gt;summary&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if($item-&amp;gt;type == &amp;#039;quote&amp;#039;) {&lt;br /&gt;
    echo &amp;quot;&lt;br /&gt;
      &amp;lt;blockquote&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;$item-&amp;gt;quote&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;cite&amp;gt;$item-&amp;gt;cite&amp;lt;/cite&amp;gt;&lt;br /&gt;
      &amp;lt;/blockquote&amp;gt;&lt;br /&gt;
    &amp;quot;;&lt;br /&gt;
  } else if( ... ) {&lt;br /&gt;
    // and so on&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Über den Field Template Ansatz kann man die Matrix eleganter rendern. Wenn man sie so anlegt...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($value as $item) {&lt;br /&gt;
  echo $item-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
... sucht die render Funktion im nächsten Unterordner für jeden Typ das Templatefile...&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/test_matrix/content.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h3&amp;gt;&amp;lt;?= $page-&amp;gt;headline ?&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;summary ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
/site/templates/fields/test_matrix/quote.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;&amp;lt;?= $page-&amp;gt;quote ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;cite&amp;gt;&amp;lt;?= $page-&amp;gt;cite ?&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So kann man im Template ganz einfach aufrufen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 echo $page-&amp;gt;render(&amp;#039;test_matrix&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27062</id>
		<title>ProcessWire - Render Funktionen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Render_Funktionen&amp;diff=27062"/>
		<updated>2024-04-19T15:06:52Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: Die Seite wurde neu angelegt: „Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates == Links ==  https://processwire.com/blog/posts/processwire-3.0.7-expands-field-ren…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier einige Snippets und Links zum Rendern von Files, Feldern und Templates&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
== Felder mit Templates rendern ==&lt;br /&gt;
ProcessWire rendert Felder mit einem Template wenn es in /site/templates/fields/ liegt und richtig benannt ist.&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&lt;br /&gt;
/site/templates/fields/body.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?= $value ?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe z.B. mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;render(&amp;#039;body&amp;#039;);&lt;br /&gt;
echo $page-&amp;gt;render-&amp;gt;body;&lt;br /&gt;
echo $page-&amp;gt;_body_; // Nützlicher Shortcut wenn man mehrere Felder mit Template ausgeben möchte.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es stehen folgende Variablen zur Verfügung:&lt;br /&gt;
    $value - The value that needs to be rendered&lt;br /&gt;
    $page - The page that $value lives on&lt;br /&gt;
    $field - The field representing $value (of class Field) if you want it&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verschiedenes ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=27061</id>
		<title>ProcessWire - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=27061"/>
		<updated>2024-04-19T14:53:34Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* $page Object */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier findest du ein paar Basis Snippets. Codebeispiele zu Feldern findest du z.B. über die Seiten zu den Field Types.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 [[ProcessWire - Module Snippets]]&lt;br /&gt;
 [[ProcessWire - Navigation Snippets]]&lt;br /&gt;
 [[ProcessWire - Debugging Snippets]]&lt;br /&gt;
 [[ProcessWire - Selectors]]&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
=== Bild in Template einbinden ===&lt;br /&gt;
 &amp;lt;img src=&amp;quot;&amp;lt;?php echo $config-&amp;gt;urls-&amp;gt;templates?&amp;gt;img/menu.png&amp;quot; alt=&amp;quot;Home&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link zu Seite ===&lt;br /&gt;
 &amp;lt;a href=&amp;quot;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/kontakt/&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
=== Wert aus Textfeld ===&lt;br /&gt;
 &amp;lt;div class=&amp;quot;&amp;lt;? echo $page-&amp;gt;get(&amp;quot;content_class&amp;quot;)?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
== Bilder ==&lt;br /&gt;
&lt;br /&gt;
=== Umfassende Renderfunktion zum wiederverwenden ===&lt;br /&gt;
Hier immer wieder aktualisiert. Todo Option für srcset.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * render image tag from imageobject&lt;br /&gt;
 * @todo add srcset version,add ukimage version, other attributes&lt;br /&gt;
 * @todo attributes as object or string&lt;br /&gt;
 * @param Object Image&lt;br /&gt;
 * @param Int width&lt;br /&gt;
 * @return String&lt;br /&gt;
 */&lt;br /&gt;
function renderImage($image,$w=200,$options=array()){&lt;br /&gt;
  if(!$image instanceof \ProcessWire\Pageimage) return &amp;#039;&amp;#039;;&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;resizeHeight&amp;#039; =&amp;gt; false, // use height instead of width to resize&lt;br /&gt;
    &amp;#039;srcset&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;uikit&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;aspect&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;classes&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, // classes as string&lt;br /&gt;
		&amp;#039;attributes&amp;#039; =&amp;gt; false, // attributes as array(attr=&amp;gt;val) or string&lt;br /&gt;
		&amp;#039;title&amp;#039; =&amp;gt; true, // add title tag based on image description&lt;br /&gt;
		&amp;#039;alt&amp;#039; =&amp;gt; true, // add alt tag based on image description&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
	$attributes = array();&lt;br /&gt;
	$strAttr = &amp;#039;&amp;#039;;&lt;br /&gt;
  $classMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	// ATTRIBUTES&lt;br /&gt;
  $attributesMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
	if( $options[&amp;#039;attributes&amp;#039;] ){&lt;br /&gt;
		bd( gettype( $options[&amp;#039;attributes&amp;#039;] ) );&lt;br /&gt;
		if( gettype($options[&amp;#039;attributes&amp;#039;] ) == &amp;#039;string&amp;#039;) $strAttr = (string)$options[&amp;#039;attributes&amp;#039;];&lt;br /&gt;
		else if( gettype($options[&amp;#039;attributes&amp;#039;]) == &amp;#039;array&amp;#039; ){&lt;br /&gt;
			foreach( (array)$options[&amp;#039;attributes&amp;#039;] as $k =&amp;gt; $a ){&lt;br /&gt;
				$attributes[$k] = $a;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if($options[&amp;#039;alt&amp;#039;] &amp;amp;&amp;amp; $image-&amp;gt;description) $attributes[&amp;#039;alt&amp;#039;] = $image-&amp;gt;description;&lt;br /&gt;
	if($options[&amp;#039;title&amp;#039;] &amp;amp;&amp;amp; $image-&amp;gt;description) $attributes[&amp;#039;title&amp;#039;] = $image-&amp;gt;description;&lt;br /&gt;
	$attributesMarkup = implode(&amp;#039; &amp;#039;, $attributes);&lt;br /&gt;
	if($strAttr) $attributesMarkup .= &amp;quot; $strAttr&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
  if($options[&amp;#039;classes&amp;#039;]) $classMarkup = &amp;#039; class=&amp;quot;&amp;#039;.$options[&amp;#039;classes&amp;#039;].&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	if($options[&amp;#039;resizeHeight&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;height($w);&lt;br /&gt;
  }else if($options[&amp;#039;aspect&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;size($w, intval( $w / $options[&amp;#039;aspect&amp;#039;]) );&lt;br /&gt;
  }else if($options[&amp;#039;noResize&amp;#039;]){&lt;br /&gt;
    // Todo&lt;br /&gt;
&lt;br /&gt;
  }else{&lt;br /&gt;
    $i = $image-&amp;gt;width($w);&lt;br /&gt;
  } &lt;br /&gt;
	$out = &amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;.$i-&amp;gt;url.&amp;#039;&amp;quot; &amp;#039;.$classMarkup.$attributesMarkup.&amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Advanced Image Manipulation ===&lt;br /&gt;
ImageMagick, Externe Bilder laden, Bilder Vorrendern...&lt;br /&gt;
[[Processwire - Advanced Image Manipulation]]&lt;br /&gt;
&lt;br /&gt;
=== Praktische Renderfunktionen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Image Function&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get background-position style via focus point if available&lt;br /&gt;
 * mainly used in other functions&lt;br /&gt;
 * @param Pageimage PW image object&lt;br /&gt;
 * @return Array containing background-position&lt;br /&gt;
 */&lt;br /&gt;
function getFocusStyles($image){&lt;br /&gt;
	// Focal Points if available&lt;br /&gt;
	$imageStyles = array();&lt;br /&gt;
	if($image-&amp;gt;focus){&lt;br /&gt;
		$focus=$image-&amp;gt;focus();&lt;br /&gt;
		//var_dump($focus);&lt;br /&gt;
		$imageStyles[] = &amp;#039;background-position:&amp;#039;.number_format($focus[&amp;quot;left&amp;quot;],1,&amp;quot;.&amp;quot;,&amp;quot;&amp;quot;) .&amp;#039;% &amp;#039;.number_format($focus[&amp;quot;top&amp;quot;],1,&amp;quot;.&amp;quot;,&amp;quot;&amp;quot;).&amp;#039;%;&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return $imageStyles;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get background-image styles and create image&lt;br /&gt;
 * @todo - make image set instead of single image&lt;br /&gt;
 * @param Pageimage&lt;br /&gt;
 * @param Int Image width&lt;br /&gt;
 * @param String background-size attribute (cover, contain...)&lt;br /&gt;
 * @return array &lt;br /&gt;
 */&lt;br /&gt;
function getBgImageStyles($image, $w = 800,$options = array()){&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;size&amp;#039; =&amp;gt; &amp;#039;cover&amp;#039;,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
  &lt;br /&gt;
	if($image){&lt;br /&gt;
		$styles = array();&lt;br /&gt;
    if ($options[&amp;#039;noResize&amp;#039;]) $myImage = $image;&lt;br /&gt;
    else $myImage = $image-&amp;gt;width($w);&lt;br /&gt;
		$styles[] = &amp;quot;background-image: url($myImage-&amp;gt;url);&amp;quot;;&lt;br /&gt;
		$styles[] = &amp;#039;background-size: &amp;#039;.$options[&amp;#039;size&amp;#039;].&amp;#039;; background-repeat: no-repeat;&amp;#039;;&lt;br /&gt;
		$styles = array_merge( $styles, getFocusStyles($myImage) );&lt;br /&gt;
		return $styles;&lt;br /&gt;
	} else return array();&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * render image tag from imageobject&lt;br /&gt;
 * @todo add srcset version, add description, add ukimage version, other attributes&lt;br /&gt;
 * @param Object Image&lt;br /&gt;
 * @param Int width&lt;br /&gt;
 * @return String&lt;br /&gt;
 */&lt;br /&gt;
function renderImage($image,$w=200,$options=array()){&lt;br /&gt;
  if(!$image instanceof \ProcessWire\Pageimage) return &amp;#039;&amp;#039;;&lt;br /&gt;
  $defaults = array(&lt;br /&gt;
    &amp;#039;resizeHeight&amp;#039; =&amp;gt; false, // use height instead of width to resize&lt;br /&gt;
    &amp;#039;srcset&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;uikit&amp;#039; =&amp;gt; false, // todo&lt;br /&gt;
    &amp;#039;aspect&amp;#039; =&amp;gt; false,&lt;br /&gt;
    &amp;#039;noResize&amp;#039; =&amp;gt; false&lt;br /&gt;
  );&lt;br /&gt;
  $options = array_merge($defaults,$options);&lt;br /&gt;
	if($options[&amp;#039;resizeHeight&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;height($w);&lt;br /&gt;
  }else if($options[&amp;#039;aspect&amp;#039;]){&lt;br /&gt;
    $i = $image-&amp;gt;size($w, intval( $w / $options[&amp;#039;aspect&amp;#039;]) );&lt;br /&gt;
  }else if($options[&amp;#039;noResize&amp;#039;]){&lt;br /&gt;
    // Todo&lt;br /&gt;
  &lt;br /&gt;
  }else{&lt;br /&gt;
    $i = $image-&amp;gt;width($w);&lt;br /&gt;
  } &lt;br /&gt;
	$out = &amp;#039;&amp;lt;img src=&amp;quot;&amp;#039;.$i-&amp;gt;url.&amp;#039;&amp;quot; alt=&amp;quot;&amp;#039;.$i-&amp;gt;description.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einzelbild einfügen ===&lt;br /&gt;
&lt;br /&gt;
==== Maximale Breite oder maximale Höhe je nach Orientierung ====&lt;br /&gt;
 $thumburl = $image-&amp;gt;width &amp;gt; $image-&amp;gt;height ? $image-&amp;gt;size(450,0)-&amp;gt;url : $image-&amp;gt;size(0,320);&lt;br /&gt;
&lt;br /&gt;
==== Maximale Breite und maximale Höhe berücksichtigen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mW = 180;&lt;br /&gt;
$mH = 80;&lt;br /&gt;
$thumbUrl = ($mH / $image-&amp;gt;height) &amp;gt; ($mW / $image-&amp;gt;width) ? $image-&amp;gt;size($mW,0)-&amp;gt;url : $image-&amp;gt;size(0,$mH)-&amp;gt;url;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Bild aus Backend als Hintergrund einfügen====&lt;br /&gt;
(Feldname hier: &amp;#039;&amp;#039;main_image&amp;#039;&amp;#039;)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if($page-&amp;gt;main_image){$image = $page-&amp;gt;main_image-&amp;gt;size(640,960);}&lt;br /&gt;
else $image = NULL;&lt;br /&gt;
...&lt;br /&gt;
if($image){&lt;br /&gt;
  echo &amp;quot;&lt;br /&gt;
  &amp;lt;div class=&amp;#039;a-3-4 team-image&amp;#039; style=&amp;#039;background-image:url({$image-&amp;gt;url})&amp;#039;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{$myContent}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== n-tes Bild einfügen ===&lt;br /&gt;
 $page-&amp;gt;images-&amp;gt;eq(1); // second image&lt;br /&gt;
&lt;br /&gt;
=== Mehrere Bilder aus dem Backend ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$myImages=&amp;#039;&amp;#039;;&lt;br /&gt;
if(count($page-&amp;gt;images)) {&lt;br /&gt;
  foreach($page-&amp;gt;images as $image) {&lt;br /&gt;
    $myImages .=  &amp;#039;&amp;lt;img class=&amp;quot;img-responsive&amp;quot; src=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
echo $page-&amp;gt;images-&amp;gt;implode(function($item) {&lt;br /&gt;
  $large = $item-&amp;gt;size(1200,800);&lt;br /&gt;
  $thumb = $item-&amp;gt;size(400,300);&lt;br /&gt;
  return &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$large-&amp;gt;url&amp;#039;&amp;gt;&amp;lt;img src=&amp;#039;$thumb-&amp;gt;url&amp;#039; alt=&amp;#039;$item-&amp;gt;description&amp;#039;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}, array(&amp;#039;prepend&amp;#039; =&amp;gt; &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;, &amp;#039;append&amp;#039; =&amp;gt; &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;));  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Einfache Galerie ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$gallery = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$images = $page-&amp;gt;gallery;&lt;br /&gt;
&lt;br /&gt;
// add thumbnail to gallery&lt;br /&gt;
if(count($page-&amp;gt;thumbnail)){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$page-&amp;gt;thumbnail-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $page-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach($images as $image){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $image-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$gallery .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Slider mit Processwire ===&lt;br /&gt;
[[Processwire - Slider]]&lt;br /&gt;
&lt;br /&gt;
== Videos ==&lt;br /&gt;
[[Processwire - Working with Video]]&lt;br /&gt;
&lt;br /&gt;
== File Uploads ==&lt;br /&gt;
[[ProcessWire - Uploads]]&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
[[ProcessWire - Navigation Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Seiten ==&lt;br /&gt;
http://processwire.com/api/variables/pages/&lt;br /&gt;
=== Inhalt einer Seite mit $page-&amp;gt;get() ===&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Visit us at:  &amp;lt;?php  &lt;br /&gt;
$contact = $pages-&amp;gt;get(&amp;quot;/about/contact/&amp;quot;);&lt;br /&gt;
echo $contact-&amp;gt;address;&lt;br /&gt;
?&amp;gt; &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kürzer:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Visit us at: &amp;lt;?=$pages-&amp;gt;get(&amp;quot;/about/contact/&amp;quot;)-&amp;gt;address?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seiten Filtern find() ===&lt;br /&gt;
==== &amp;quot;Featured&amp;quot; Checkbox im Backend angehakt ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &amp;lt;?php &lt;br /&gt;
$features = $pages-&amp;gt;find(&amp;quot;featured=1&amp;quot;);&lt;br /&gt;
foreach($features as $feature)&lt;br /&gt;
   echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;{$feature-&amp;gt;url}&amp;#039;&amp;gt;{$feature-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt; &amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel: Limitierte Ausgabe, Sortieren und in Unterverzeichnis ====&lt;br /&gt;
 $pages-&amp;gt;find(&amp;quot;parent=/about/press/, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
oder&lt;br /&gt;
 $pages-&amp;gt;get(&amp;quot;/about/press/&amp;quot;)-&amp;gt;children(&amp;quot;featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
Finde in Kategorie&lt;br /&gt;
 $pages-&amp;gt;get(&amp;quot;/about/press/&amp;quot;)-&amp;gt;find(&amp;quot;featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
==== Seiten mit Template xyz ====&lt;br /&gt;
 $pages-&amp;gt;find(&amp;quot;template=press_release, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
Ausführliches Beispiel mit Ausgabe&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt; &amp;lt;?php &lt;br /&gt;
$features = $pages-&amp;gt;find(&amp;quot;template=press_release, featured=1, limit=3, sort=-date&amp;quot;);&lt;br /&gt;
foreach($features as $feature) {&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;h3&amp;gt;&amp;lt;a href=&amp;#039;{$feature-&amp;gt;url}&amp;#039;&amp;gt;{$feature-&amp;gt;title}&amp;lt;/a&amp;gt;&amp;lt;/h3&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;span class=&amp;#039;date&amp;#039;&amp;gt;{$feature-&amp;gt;date}&amp;lt;/span&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;p&amp;gt;{$feature-&amp;gt;summary}&amp;lt;/p&amp;gt;&amp;quot; .&lt;br /&gt;
    &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Felder ==&lt;br /&gt;
=== Label zu Feldes und Subfeldern ausgeben ===&lt;br /&gt;
Beispiel mit dem Combo Profield. Das Prinzip funktioniert bei allen Feldern.&lt;br /&gt;
 https://processwire.com/talk/topic/26183-getting-label-of-combo-subfield/#comment-217749&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$field = $fields-&amp;gt;get(&amp;#039;your_combo_field_name&amp;#039;);&lt;br /&gt;
$settings = $field-&amp;gt;getComboSettings();&lt;br /&gt;
$subfield = $settings-&amp;gt;getSubfield(&amp;#039;your_subfield_name&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// get label in current user language&lt;br /&gt;
$label = $subfield-&amp;gt;getLabel();&lt;br /&gt;
&lt;br /&gt;
// to get in a language other than current user language&lt;br /&gt;
$label = $subfield-&amp;gt;getLabel(&amp;#039;de&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// to get localized description&lt;br /&gt;
$description = $subfield-&amp;gt;getDescription();&lt;br /&gt;
&lt;br /&gt;
// to get localized notes&lt;br /&gt;
$notes = $subfield-&amp;gt;getNotes();&lt;br /&gt;
&lt;br /&gt;
// also note you can use getLanguageValue&lt;br /&gt;
$label = $subfield-&amp;gt;getLanguageValue(&amp;#039;de&amp;#039;, &amp;#039;label&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Label eines Felds ausgeben ===&lt;br /&gt;
Geht über das Feld-Objekt.&lt;br /&gt;
 echo $fields-&amp;gt;get(&amp;quot;body&amp;quot;)-&amp;gt;label;&lt;br /&gt;
&lt;br /&gt;
=== Ist ein Feld leer ? ===&lt;br /&gt;
 if($page-&amp;gt;summary_de) { ... }&lt;br /&gt;
 // check whitespace&lt;br /&gt;
 if(trim($page-&amp;gt;summary_de)) { ... }&lt;br /&gt;
&lt;br /&gt;
=== Datumsfelder formatieren ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
// aus Datumsfeldern&lt;br /&gt;
echo date(&amp;quot;Y-m-d&amp;quot;, $page-&amp;gt;getUnformatted(&amp;quot;closing&amp;quot;)); &lt;br /&gt;
&lt;br /&gt;
// aus Unix Timestamp mit Vanilla PHP&lt;br /&gt;
echo date(&amp;quot;Y-m-d&amp;quot;, $news-&amp;gt;created);&lt;br /&gt;
&lt;br /&gt;
setlocale(LC_TIME, &amp;quot;de_DE.utf8&amp;quot;);&lt;br /&gt;
$weekday = strftime ( &amp;#039;%A&amp;#039; , $page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;) );&lt;br /&gt;
$date = date(&amp;quot;d.m.Y&amp;quot;, $page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel aus ProcessWire Blog&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
setlocale(LC_ALL, array(&amp;#039;de_DE&amp;#039;,&amp;#039;de_DE.iso88591&amp;#039;,&amp;#039;de_DE.iso885915@euro&amp;#039;,&amp;#039;de_DE.utf8&amp;#039;,&amp;#039;de_DE@euro&amp;#039;));&lt;br /&gt;
$date = $page-&amp;gt;date ? date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;date&amp;quot;)) : date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;getUnformatted(&amp;quot;createdStr&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optionen eines Select Felds ausgeben (fieldtypeOptions)===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$options = $fieldtypes-&amp;gt;get(&amp;#039;FieldtypeOptions&amp;#039;)-&amp;gt;getOptions(&amp;#039;YOURFIELDNAME&amp;#039;); &lt;br /&gt;
foreach($options as $option) {&lt;br /&gt;
  echo $option-&amp;gt;id;&lt;br /&gt;
  echo $option-&amp;gt;value;&lt;br /&gt;
  echo $option-&amp;gt;title; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parent von Repeater oder RepeaterMatrix finden ===&lt;br /&gt;
Nutzt man ein Repeater Feld muss man manchmal die Seite herausfinden in der das Feld enthalten ist. Hierfür gibt es die Funktion getForPage().&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&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;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls man Repeater in Repeatern hat kann man auch eine rekursive Funktion nutzen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if (!function_exists(&amp;#039;getForPage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
  function getForPage($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 = getForPage($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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Searchbar ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	&amp;lt;!-- search form--&amp;gt;&lt;br /&gt;
	&amp;lt;form class=&amp;#039;search&amp;#039; action=&amp;#039;&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;template=search&amp;#039;)-&amp;gt;url; ?&amp;gt;&amp;#039; method=&amp;#039;get&amp;#039;&amp;gt;&lt;br /&gt;
		&amp;lt;input type=&amp;#039;text&amp;#039; name=&amp;#039;q&amp;#039; placeholder=&amp;#039;Search&amp;#039; value=&amp;#039;&amp;lt;?php echo $sanitizer-&amp;gt;entities($input-&amp;gt;whitelist(&amp;#039;q&amp;#039;)); ?&amp;gt;&amp;#039; /&amp;gt;&lt;br /&gt;
		&amp;lt;button type=&amp;#039;submit&amp;#039; name=&amp;#039;submit&amp;#039;&amp;gt;Search&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Create Admin User ==&lt;br /&gt;
=== Reset Password - Passwort zurücksetzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = $users-&amp;gt;get(&amp;#039;admin1&amp;#039;); // or whatever your username is&lt;br /&gt;
$admin-&amp;gt;setAndSave(&amp;#039;pass&amp;#039;, &amp;#039;geheim&amp;#039;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 https://processwire-recipes.com/recipes/resetting-admin-password-via-api/&lt;br /&gt;
Problem&lt;br /&gt;
For some reason, you have managed to lock yourself out of a site you are currently developing.&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
Paste the following into a file (e.g. &amp;quot;reset.php&amp;quot;) in the root folder of the site, then run it.&lt;br /&gt;
&lt;br /&gt;
ProcessWire version &amp;gt;= 2.6.9&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = $users-&amp;gt;get(&amp;#039;admin&amp;#039;); // or whatever your username is&lt;br /&gt;
$admin-&amp;gt;setAndSave(&amp;#039;pass&amp;#039;, &amp;#039;yo123456&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProcessWire version &amp;lt; 2.6.9&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
require &amp;quot;index.php&amp;quot;;&lt;br /&gt;
$admin = wire(&amp;#039;users&amp;#039;)-&amp;gt;get(&amp;#039;admin&amp;#039;);&lt;br /&gt;
$admin-&amp;gt;setOutputFormatting(false);&lt;br /&gt;
$admin-&amp;gt;set(&amp;#039;pass&amp;#039;, &amp;#039;yo12345&amp;#039;);&lt;br /&gt;
$admin-&amp;gt;save(&amp;#039;pass&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Editor Link / Login Logout Link ==&lt;br /&gt;
_main.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;editor&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
  if($user-&amp;gt;isLoggedin()) {&lt;br /&gt;
    // if user is logged in, show a logout link&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}login/logout/&amp;#039;&amp;gt;Logout ($user-&amp;gt;name)&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  } else {&lt;br /&gt;
    // if user not logged in, show a login link&lt;br /&gt;
    echo &amp;quot;&amp;lt;a href=&amp;#039;{$config-&amp;gt;urls-&amp;gt;admin}&amp;#039;&amp;gt;∆&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  // output an &amp;quot;Edit&amp;quot; link if this page happens to be editable by the current user&lt;br /&gt;
  if($page-&amp;gt;editable()) echo &amp;quot;&amp;lt;li class=&amp;#039;edit nav&amp;#039;&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;editUrl&amp;#039;&amp;gt;Edit&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Siehe auch [[ProcessWire - User Login / Logout]]&lt;br /&gt;
&lt;br /&gt;
== Conditions ==&lt;br /&gt;
=== Bedingungen durch Oder Operator in Feldern ===&lt;br /&gt;
Wenn das eine Feld leer ist nimm das nächste...&lt;br /&gt;
 $t = $page-&amp;gt;get(&amp;quot;long_title|title&amp;quot;);&lt;br /&gt;
=== Conditions für Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// If the page has children, then render navigation to them under the body.&lt;br /&gt;
// See the _func.php for the renderNav example function.&lt;br /&gt;
if($page-&amp;gt;hasChildren) {&lt;br /&gt;
	$content .= renderNav($page-&amp;gt;children);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// if the rootParent (section) page has more than 1 child, then render &lt;br /&gt;
// section navigation in the sidebar&lt;br /&gt;
if($page-&amp;gt;rootParent-&amp;gt;hasChildren &amp;gt; 1) {&lt;br /&gt;
	$sidebar = renderNavTree($page-&amp;gt;rootParent, 3) . $page-&amp;gt;sidebar; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Rendering ==&lt;br /&gt;
Es gibt viele Möglichkeiten deshalb ein eigenes Kapitel:&lt;br /&gt;
 [[ProcessWire - Render Funktionen]]&lt;br /&gt;
&lt;br /&gt;
== $page Object ==&lt;br /&gt;
Siehe auch [[ProcessWire - Page Object]]&lt;br /&gt;
=== Zugriff auf $page in Funktionen ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function getTitle() {&lt;br /&gt;
    $page = wire(&amp;quot;page&amp;quot;);&lt;br /&gt;
    $t = $page-&amp;gt;title;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder einfach übergeben.&lt;br /&gt;
=== Variablen zu Render-Datei senden ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// you can send vars (here item count)&lt;br /&gt;
// use this inside the field rendering script&lt;br /&gt;
// ie. $page-&amp;gt;_n&lt;br /&gt;
$page-&amp;gt;set(&amp;#039;_n&amp;#039;,$n);&lt;br /&gt;
$page-&amp;gt;set(&amp;#039;_type&amp;#039;,$item-&amp;gt;type); &lt;br /&gt;
$out .= $item-&amp;gt;render();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy and Paste ==&lt;br /&gt;
=== Einfache Datumssteuerung ===&lt;br /&gt;
Setzt Felder date_begin und date_end voraus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Date check&lt;br /&gt;
$dateValid = true;&lt;br /&gt;
$now = time();&lt;br /&gt;
$start = 0;&lt;br /&gt;
$end = 0;&lt;br /&gt;
if($page-&amp;gt;date_begin){&lt;br /&gt;
  $start = strtotime( $page-&amp;gt;date_begin(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 00:00:00&amp;quot;);&lt;br /&gt;
  if( !($now &amp;gt;= $start) ) $dateValid = false;&lt;br /&gt;
}&lt;br /&gt;
if($page-&amp;gt;date_end){&lt;br /&gt;
  $end = strtotime( $page-&amp;gt;date_end(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 23:59:59&amp;quot;);&lt;br /&gt;
  if( ($now &amp;gt; $end) ) $dateValid = false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if(!$dateValid) return &amp;#039;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Copyright / Published Date ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$published_date = date(&amp;#039;d.m.Y&amp;#039;,$page-&amp;gt;created);&lt;br /&gt;
&amp;lt;?= &amp;#039;&amp;amp;copy;&amp;#039;.$published_date ?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stylesheets und Skripte mit AIOM ===&lt;br /&gt;
 &amp;lt;script src=&amp;quot;&amp;lt;?php echo AIOM::JS(array(&amp;#039;scripts/jquery-2.2.4.min.js&amp;#039;,&amp;#039;scripts/jquery.chocolat.js&amp;#039;,&amp;#039;scripts/jquery.fitvids.js&amp;#039;,&amp;#039;scripts/jquery.flexslider-min.js&amp;#039;, &amp;#039;scripts/main.js&amp;#039;)); ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;&amp;lt;?php echo AIOM::CSS(&amp;#039;styles/main.less&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php echo $homepage-&amp;gt;site_title .&amp;#039; &amp;#039;. Date(&amp;#039;Y&amp;#039;); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Link zur Seite anhand URL-Pfad ===&lt;br /&gt;
 &amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/ueber-uns/&amp;#039;)-&amp;gt;url; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feld einer Seite ===&lt;br /&gt;
 $content_left = $page-&amp;gt;get(&amp;#039;content_left&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
=== Bild ===&lt;br /&gt;
 if($page-&amp;gt;main_image){$image = $page-&amp;gt;main_image-&amp;gt;size(640,960);}&lt;br /&gt;
 else $image = NULL;&lt;br /&gt;
=== Bild von der Homepage ===&lt;br /&gt;
in _init.php&lt;br /&gt;
 $homepage = $pages-&amp;gt;get(&amp;#039;/&amp;#039;);&lt;br /&gt;
im Template&lt;br /&gt;
 if($homepage-&amp;gt;config_logo){$logo = $homepage-&amp;gt;config_logo-&amp;gt;width(280);}&lt;br /&gt;
 else $logo = NULL;&lt;br /&gt;
&lt;br /&gt;
=== Simple Navigation ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;ul class=&amp;#039;nav-list&amp;#039;&amp;gt;&lt;br /&gt;
  &amp;lt;?php&lt;br /&gt;
  // Childrens&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;
      echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
    } else {&lt;br /&gt;
      echo &amp;#039;&amp;lt;li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    echo &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;
  }&lt;br /&gt;
  ?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Auflistung mit div. Feldern aus Kindseiten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Publications list template&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
$publications = &amp;#039;&amp;#039;;&lt;br /&gt;
$children = $page-&amp;gt;children;&lt;br /&gt;
foreach($children as $child){&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;h2&amp;gt;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; parent=&amp;quot;&amp;#039;. $child-&amp;gt;parent-&amp;gt;title .&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;.$child-&amp;gt;title.&amp;#039;&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;/h2&amp;gt;&amp;#039;;&lt;br /&gt;
  $publications .= $child-&amp;gt;body;&lt;br /&gt;
  $publications .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$content = $page-&amp;gt;body . $publications;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Minigalerie ===&lt;br /&gt;
Thumbnails / Child Pages&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$works = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$children = $page-&amp;gt;children;&lt;br /&gt;
foreach($children as $child){&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;a class=&amp;quot;ajax-link&amp;quot; parent=&amp;quot;&amp;#039;. $child-&amp;gt;parent-&amp;gt;title .&amp;#039;&amp;quot; name=&amp;quot;&amp;#039;.$child-&amp;gt;title.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;. $child-&amp;gt;url. &amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $child-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  if(count($child-&amp;gt;thumbnail)){&lt;br /&gt;
      $works .= &amp;#039;&amp;lt;div class=&amp;quot;thumbnail&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $child-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  $works .= &amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$works .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$content = $page-&amp;gt;body . $works . &amp;#039;&amp;lt;br/&amp;gt;&amp;#039; . $page-&amp;gt;video;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Page Navigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// add next button if there is another page next&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
    $next = &amp;#039;&amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&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;&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;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$content = &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $page-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039; . $page-&amp;gt;body . &amp;#039;&amp;lt;br/&amp;gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;&amp;#039; . $page-&amp;gt;video .&amp;#039;&amp;lt;/div&amp;gt;&amp;#039; . $next;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Simple Gallery with next Page ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$gallery = &amp;#039;&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$images = $page-&amp;gt;gallery;&lt;br /&gt;
&lt;br /&gt;
// add thumbnail to gallery&lt;br /&gt;
if(count($page-&amp;gt;thumbnail)){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$page-&amp;gt;thumbnail-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $page-&amp;gt;thumbnail-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach($images as $image){&lt;br /&gt;
    $gallery .= &amp;#039;&amp;lt;a class=&amp;quot;chocolat-image gallery-item&amp;quot; href=&amp;quot;&amp;#039;.$image-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;. $image-&amp;gt;getThumb(&amp;#039;thumbnail&amp;#039;) .&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;. $image-&amp;gt;description .&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$gallery .= &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// add next button if there is another page next&lt;br /&gt;
if($page-&amp;gt;next-&amp;gt;id){&lt;br /&gt;
    $next = &amp;#039;&amp;lt;div class=&amp;quot;next&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Next:&amp;lt;/i&amp;gt;&amp;amp;nbsp;&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;&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;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$content = &amp;#039;&amp;lt;h2&amp;gt;&amp;#039;. $page-&amp;gt;title . &amp;#039;&amp;lt;/h2&amp;gt;&amp;#039; . $page-&amp;gt;body . &amp;#039;&amp;lt;br/&amp;gt;&amp;#039; . $gallery . &amp;#039;&amp;lt;br/&amp;gt;&amp;lt;div class=&amp;quot;video&amp;quot;&amp;gt;&amp;#039; . $page-&amp;gt;video .&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;. $next;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Platzhalter-Seite mit Redirect auf erste Unterseite ===&lt;br /&gt;
Möchte man eine Eltern-Seite für das Menü generieren die keinen eigenen Inhalt besitzt sondern nur Unterseiten enthält, kann man ein Template für diese Seite erstellen, dass den User auf die erste Unterseite weiterleitet.&lt;br /&gt;
&lt;br /&gt;
Diese Lösung ist ein regulärer Redirect. Ob das die Beste Lösung ist müßte man mal überlegen. Auf alle Fälle besser als Duplicate Content.&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;
$root = $pages-&amp;gt;get(&amp;quot;/&amp;quot;);&lt;br /&gt;
if($page-&amp;gt;numChildren){&lt;br /&gt;
	$session-&amp;gt;redirect($page-&amp;gt;child()-&amp;gt;url);&lt;br /&gt;
} else $session-&amp;gt;redirect($root-&amp;gt;url);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== In Funktionen auf Page Objekt zugreifen ===&lt;br /&gt;
Entweder als Parameter übergeben (evtl. by reference) oder wenn ein ProcessWire Objekt in der Funktion vorliegt das vom Wire Objekt abgeleitet ist (fast alle) kannst du dieses nutzen:&lt;br /&gt;
 $page = $items-&amp;gt;wire(&amp;#039;page&amp;#039;); // $items is a PageArray - use its wire to get current page&lt;br /&gt;
&lt;br /&gt;
== ProcessWire - Debugging Snippets ==&lt;br /&gt;
[[ProcessWire - Debugging Snippets]]&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27060</id>
		<title>GSAP - Timelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27060"/>
		<updated>2024-04-19T13:03:01Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://greensock.com/docs/v3/GSAP/gsap.timeline()&lt;br /&gt;
 https://greensock.com/forums/topic/12643-master-timeline-and-the-use-of-functions/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// WITHOUT Timelines (only using delays):&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { x: 100, duration: 1 });&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { y: 50, duration: 1, delay: 1 }); //wait 1 second&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { opacity: 0, duration: 1, delay: 2 }); //wait 2 seconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//WITH Timelines (cleaner, more versatile)&lt;br /&gt;
var tl = gsap.timeline({repeat: 2, repeatDelay: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {x: 100, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {y: 50, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {opacity: 0, duration: 1});&lt;br /&gt;
&lt;br /&gt;
// then we can control the whole thing easily...&lt;br /&gt;
tl.pause();&lt;br /&gt;
tl.resume();&lt;br /&gt;
tl.seek(1.5);&lt;br /&gt;
tl.reverse();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Master Timeline ==&lt;br /&gt;
Gutes Vorgehen für flexiblen Einsatz:&lt;br /&gt;
Ältere Beispiele (v2)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function getFirst() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getSecond() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getThird() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getThird());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of both techniques is going to be identical and both offer a modular approach. However, wrapping your timelines in a function has two advantages which may not be applicable all the time, but its nice to have them:)&lt;br /&gt;
&lt;br /&gt;
1: By using functions to create your timelines, you can create them &amp;quot;on-demand&amp;quot; only when needed. In the context of a large game or application the function-wrapped way means you don&amp;#039;t have to create 500 timelines in advance, you can just call the proper function when you need a timeline. &lt;br /&gt;
&lt;br /&gt;
2: You can create the same timeline multiple times and add each unique copy of the timeline to the same or any parent timeline. Although it isn&amp;#039;t always necessary, it is very easy to use the function-wrapped technique to do&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to doing elaborate, dynamic scene changes (based on user interaction) it makes things incredibly flexible.&lt;br /&gt;
&lt;br /&gt;
Imagine your app has a variety of scenes, and each scene has its own timeline for animating in and out.&lt;br /&gt;
&lt;br /&gt;
You could do something like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene1Out());&lt;br /&gt;
navTimeline.add(scene3In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would trigger the timeline that the scene3In() function generates 1 second before the scene1Out animation ends.&lt;br /&gt;
&lt;br /&gt;
and then maybe later the user wants to go back to scene1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene3Out());&lt;br /&gt;
navTimeline.add(scene1In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of this technique is that you can generate your transition timelines whenever you need them, as many times as you need them, and glue them together in any number of ways. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function carMove(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#car&amp;quot;, 2, {x:&amp;quot;+=200&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wheelsRotate(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#wheels&amp;quot;, 2, {rotation:&amp;quot;+=360&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
masterTL&lt;br /&gt;
.add( carMove())&lt;br /&gt;
.add( wheelsRotate());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27059</id>
		<title>GSAP - Timelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27059"/>
		<updated>2024-04-19T13:02:31Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://greensock.com/docs/v3/GSAP/gsap.timeline()&lt;br /&gt;
 https://greensock.com/forums/topic/12643-master-timeline-and-the-use-of-functions/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// WITHOUT Timelines (only using delays):&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { x: 100, duration: 1 });&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { y: 50, duration: 1, delay: 1 }); //wait 1 second&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { opacity: 0, duration: 1, delay: 2 }); //wait 2 seconds&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//WITH Timelines (cleaner, more versatile)&lt;br /&gt;
var tl = gsap.timeline({repeat: 2, repeatDelay: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {x: 100, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {y: 50, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {opacity: 0, duration: 1});&lt;br /&gt;
&lt;br /&gt;
// then we can control the whole thing easily...&lt;br /&gt;
tl.pause();&lt;br /&gt;
tl.resume();&lt;br /&gt;
tl.seek(1.5);&lt;br /&gt;
tl.reverse();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Master Timeline ==&lt;br /&gt;
Gutes Vorgehen für flexiblen Einsatz:&lt;br /&gt;
Ältere Beispiele (v2)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function getFirst() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getSecond() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getThird() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getThird());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of both techniques is going to be identical and both offer a modular approach. However, wrapping your timelines in a function has two advantages which may not be applicable all the time, but its nice to have them:)&lt;br /&gt;
&lt;br /&gt;
1: By using functions to create your timelines, you can create them &amp;quot;on-demand&amp;quot; only when needed. In the context of a large game or application the function-wrapped way means you don&amp;#039;t have to create 500 timelines in advance, you can just call the proper function when you need a timeline. &lt;br /&gt;
&lt;br /&gt;
2: You can create the same timeline multiple times and add each unique copy of the timeline to the same or any parent timeline. Although it isn&amp;#039;t always necessary, it is very easy to use the function-wrapped technique to do&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to doing elaborate, dynamic scene changes (based on user interaction) it makes things incredibly flexible.&lt;br /&gt;
&lt;br /&gt;
Imagine your app has a variety of scenes, and each scene has its own timeline for animating in and out.&lt;br /&gt;
&lt;br /&gt;
You could do something like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene1Out());&lt;br /&gt;
navTimeline.add(scene3In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would trigger the timeline that the scene3In() function generates 1 second before the scene1Out animation ends.&lt;br /&gt;
&lt;br /&gt;
and then maybe later the user wants to go back to scene1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene3Out());&lt;br /&gt;
navTimeline.add(scene1In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of this technique is that you can generate your transition timelines whenever you need them, as many times as you need them, and glue them together in any number of ways. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function carMove(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#car&amp;quot;, 2, {x:&amp;quot;+=200&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wheelsRotate(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#wheels&amp;quot;, 2, {rotation:&amp;quot;+=360&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
masterTL&lt;br /&gt;
.add( carMove())&lt;br /&gt;
.add( wheelsRotate());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27058</id>
		<title>GSAP - Timelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27058"/>
		<updated>2024-04-19T13:02:13Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://greensock.com/docs/v3/GSAP/gsap.timeline()&lt;br /&gt;
 https://greensock.com/forums/topic/12643-master-timeline-and-the-use-of-functions/&lt;br /&gt;
== Master Timeline ==&lt;br /&gt;
Gutes Vorgehen für flexiblen Einsatz:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// WITHOUT Timelines (only using delays):&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { x: 100, duration: 1 });&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { y: 50, duration: 1, delay: 1 }); //wait 1 second&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { opacity: 0, duration: 1, delay: 2 }); //wait 2 seconds&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//WITH Timelines (cleaner, more versatile)&lt;br /&gt;
var tl = gsap.timeline({repeat: 2, repeatDelay: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {x: 100, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {y: 50, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {opacity: 0, duration: 1});&lt;br /&gt;
&lt;br /&gt;
// then we can control the whole thing easily...&lt;br /&gt;
tl.pause();&lt;br /&gt;
tl.resume();&lt;br /&gt;
tl.seek(1.5);&lt;br /&gt;
tl.reverse();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ältere Beispiele (v2)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function getFirst() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getSecond() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getThird() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getThird());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of both techniques is going to be identical and both offer a modular approach. However, wrapping your timelines in a function has two advantages which may not be applicable all the time, but its nice to have them:)&lt;br /&gt;
&lt;br /&gt;
1: By using functions to create your timelines, you can create them &amp;quot;on-demand&amp;quot; only when needed. In the context of a large game or application the function-wrapped way means you don&amp;#039;t have to create 500 timelines in advance, you can just call the proper function when you need a timeline. &lt;br /&gt;
&lt;br /&gt;
2: You can create the same timeline multiple times and add each unique copy of the timeline to the same or any parent timeline. Although it isn&amp;#039;t always necessary, it is very easy to use the function-wrapped technique to do&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to doing elaborate, dynamic scene changes (based on user interaction) it makes things incredibly flexible.&lt;br /&gt;
&lt;br /&gt;
Imagine your app has a variety of scenes, and each scene has its own timeline for animating in and out.&lt;br /&gt;
&lt;br /&gt;
You could do something like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene1Out());&lt;br /&gt;
navTimeline.add(scene3In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would trigger the timeline that the scene3In() function generates 1 second before the scene1Out animation ends.&lt;br /&gt;
&lt;br /&gt;
and then maybe later the user wants to go back to scene1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene3Out());&lt;br /&gt;
navTimeline.add(scene1In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of this technique is that you can generate your transition timelines whenever you need them, as many times as you need them, and glue them together in any number of ways. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function carMove(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#car&amp;quot;, 2, {x:&amp;quot;+=200&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wheelsRotate(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#wheels&amp;quot;, 2, {rotation:&amp;quot;+=360&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
masterTL&lt;br /&gt;
.add( carMove())&lt;br /&gt;
.add( wheelsRotate());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27057</id>
		<title>GSAP - Timelines</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=GSAP_-_Timelines&amp;diff=27057"/>
		<updated>2024-04-19T13:01:17Z</updated>

		<summary type="html">&lt;p&gt;134.3.86.14: /* Master Timeline */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://greensock.com/docs/v3/GSAP/gsap.timeline()&lt;br /&gt;
 https://greensock.com/forums/topic/12643-master-timeline-and-the-use-of-functions/&lt;br /&gt;
== Master Timeline ==&lt;br /&gt;
Gutes Vorgehen für flexiblen Einsatz:&lt;br /&gt;
&lt;br /&gt;
Celli, I read you question a little differently. it seems you are already using a modular approach, it&amp;#039;s just that you are doing&lt;br /&gt;
// WITHOUT Timelines (only using delays):&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { x: 100, duration: 1 });&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { y: 50, duration: 1, delay: 1 }); //wait 1 second&lt;br /&gt;
gsap.to(&amp;quot;#id&amp;quot;, { opacity: 0, duration: 1, delay: 2 }); //wait 2 seconds&lt;br /&gt;
&lt;br /&gt;
What if you wanted to make the first animation longer? You&amp;#039;d need to adjust every delay thereafter. And what if you want to pause() the whole sequence or restart() it or reverse() it on-the-fly or repeat it twice? This could become quite messy, but GSAP&amp;#039;s Timelines make it incredibly simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//WITH Timelines (cleaner, more versatile)&lt;br /&gt;
var tl = gsap.timeline({repeat: 2, repeatDelay: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {x: 100, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {y: 50, duration: 1});&lt;br /&gt;
tl.to(&amp;quot;#id&amp;quot;, {opacity: 0, duration: 1});&lt;br /&gt;
&lt;br /&gt;
// then we can control the whole thing easily...&lt;br /&gt;
tl.pause();&lt;br /&gt;
tl.resume();&lt;br /&gt;
tl.seek(1.5);&lt;br /&gt;
tl.reverse();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ältere Beispiele (v2)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function getFirst() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getSecond() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getThird() {&lt;br /&gt;
  var tl = new TimelineLite();&lt;br /&gt;
  tl.to(...)&lt;br /&gt;
  return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getThird());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of both techniques is going to be identical and both offer a modular approach. However, wrapping your timelines in a function has two advantages which may not be applicable all the time, but its nice to have them:)&lt;br /&gt;
&lt;br /&gt;
1: By using functions to create your timelines, you can create them &amp;quot;on-demand&amp;quot; only when needed. In the context of a large game or application the function-wrapped way means you don&amp;#039;t have to create 500 timelines in advance, you can just call the proper function when you need a timeline. &lt;br /&gt;
&lt;br /&gt;
2: You can create the same timeline multiple times and add each unique copy of the timeline to the same or any parent timeline. Although it isn&amp;#039;t always necessary, it is very easy to use the function-wrapped technique to do&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getFirst());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
master.add(getSecond());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When it comes to doing elaborate, dynamic scene changes (based on user interaction) it makes things incredibly flexible.&lt;br /&gt;
&lt;br /&gt;
Imagine your app has a variety of scenes, and each scene has its own timeline for animating in and out.&lt;br /&gt;
&lt;br /&gt;
You could do something like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene1Out());&lt;br /&gt;
navTimeline.add(scene3In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which would trigger the timeline that the scene3In() function generates 1 second before the scene1Out animation ends.&lt;br /&gt;
&lt;br /&gt;
and then maybe later the user wants to go back to scene1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
navTimeline.add(scene3Out());&lt;br /&gt;
navTimeline.add(scene1In(), &amp;quot;-=1&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The end result of this technique is that you can generate your transition timelines whenever you need them, as many times as you need them, and glue them together in any number of ways. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function carMove(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#car&amp;quot;, 2, {x:&amp;quot;+=200&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wheelsRotate(){&lt;br /&gt;
var tl = new TimelineMax();&lt;br /&gt;
tl.to(&amp;quot;#wheels&amp;quot;, 2, {rotation:&amp;quot;+=360&amp;quot;})&lt;br /&gt;
/* more tweens go here */&lt;br /&gt;
return tl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
masterTL&lt;br /&gt;
.add( carMove())&lt;br /&gt;
.add( wheelsRotate());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.86.14</name></author>
	</entry>
</feed>