<?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.84.225</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.84.225"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/134.3.84.225"/>
	<updated>2026-05-06T13:57:36Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26216</id>
		<title>3D-Drucker - Düse wechseln / reinigen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26216"/>
		<updated>2022-09-11T10:56:17Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Düse aufheizen bis annähernd Filament Temperatur - Niemals kalt abschrauben.&lt;br /&gt;
# Filament entfernen (kurz leicht stupsen und dann rausziehen um evtl. Reste nochmal zu lösen.&lt;br /&gt;
# Nozzle in heißem Zustand abschrauben. Evtl. Heizung mit Zange o.ä. festhalten. Vorsichtig - heiß. Unten aufpassen evtl. Tuch unterlegen&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26215</id>
		<title>3D-Drucker - Düse wechseln / reinigen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26215"/>
		<updated>2022-09-11T10:26:33Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Düse aufheizen bis annähernd Filament Temperatur - Niemals kalt abschrauben.&lt;br /&gt;
# Filament entfernen (kurz leicht stupsen und dann rausziehen um evtl. Reste nochmal zu lösen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26214</id>
		<title>3D-Drucker - Düse wechseln / reinigen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Drucker_-_D%C3%BCse_wechseln_/_reinigen&amp;diff=26214"/>
		<updated>2022-09-11T10:05:18Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „# Düse aufheizen bis annähernd Filament Temperatur - Niemals kalt abschrauben.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Düse aufheizen bis annähernd Filament Temperatur - Niemals kalt abschrauben.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=26213</id>
		<title>3D-Druck</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=26213"/>
		<updated>2022-09-11T10:04:21Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Links */&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;
=== TPU ===&lt;br /&gt;
 [[3D-Druck TPU drucken]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Wordpress_-_Google_Fonts_statisch_einbinden&amp;diff=26212</id>
		<title>Wordpress - Google Fonts statisch einbinden</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Wordpress_-_Google_Fonts_statisch_einbinden&amp;diff=26212"/>
		<updated>2022-09-10T15:00:16Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Mit Plugins entfernen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aus Datenschutzgründen sollte man Google Fonts statisch auf dem Server seines Vertrauens vorhalten. Doch wie entfernt man Sie aus Wordpress Themes?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manuell entfernen ==&lt;br /&gt;
Die Fonts werde aus den Einstellungen des Themes meist über die functions.php und die wp_head Funktion geladen. Dabei findet man in &lt;br /&gt;
&lt;br /&gt;
=== Wo sucht man? ===&lt;br /&gt;
header.php&lt;br /&gt;
 &amp;lt;?php wp_head();?&amp;gt;&lt;br /&gt;
etwas in der Art. Das ist ein sehr wichtiger Hook in WP über den alles mögliche geladen werden kann.&lt;br /&gt;
&lt;br /&gt;
In functions.php wird es konkret. Hier finden wir etwas in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wp_enqueue_style(&amp;#039;googleFontbody&amp;#039;, &amp;#039;http://fonts.googleapis.com/css?family=&amp;#039;.$font_body ,&amp;#039;&amp;#039;,NULL);	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird also ein Stylesheet von Google in die Warteschlange gestellt, die dann später an der Stelle von wp_head() eingefügt wird. Außerdem stellen wir ein eigenes Stylesheet für unser Child Theme in den Queue um damit unsere Fonts einzubinden.&lt;br /&gt;
&lt;br /&gt;
=== Google Fonts entfernen und Stylesheet einbinden ===&lt;br /&gt;
Um diese Styles wieder loszuwerde registrieren wir im ChildTheme einfach eine eigene Funktion und schmeißen über diese die Google Styles wieder aus der Warteschlange.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
add_action( &amp;#039;wp_enqueue_scripts&amp;#039;, &amp;#039;theme_enqueue_styles&amp;#039; );&lt;br /&gt;
function theme_enqueue_styles() {&lt;br /&gt;
    wp_enqueue_style( &amp;#039;parent-style&amp;#039;, get_template_directory_uri() . &amp;#039;/style.css&amp;#039; );&lt;br /&gt;
    wp_enqueue_style( &amp;#039;child-style&amp;#039;,&lt;br /&gt;
        get_stylesheet_directory_uri() . &amp;#039;/style.css&amp;#039;,&lt;br /&gt;
        array(&amp;#039;parent-style&amp;#039;)&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function my_deregister_styles() {&lt;br /&gt;
    wp_deregister_style( &amp;#039;googleFontbody&amp;#039; );// no google font scripts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fonts kommen in einen Ordner &amp;quot;fonts&amp;quot; im Child Theme und können So referenziert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* oswald-regular - latin */&lt;br /&gt;
@font-face {&lt;br /&gt;
	font-family: &amp;#039;Oswald&amp;#039;;&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
	font-weight: 400;&lt;br /&gt;
	src: local(&amp;#039;&amp;#039;),&lt;br /&gt;
		 url(&amp;#039;fonts/oswald-v35-latin-regular.woff2&amp;#039;) format(&amp;#039;woff2&amp;#039;), /* Chrome 26+, Opera 23+, Firefox 39+ */&lt;br /&gt;
		 url(&amp;#039;fonts/oswald-v35-latin-regular.woff&amp;#039;) format(&amp;#039;woff&amp;#039;); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */&lt;br /&gt;
  }&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Styles können dann wie üblich mit font-family gesetzt werden&lt;br /&gt;
 body{font-family: Oswald,sans-serif;}&lt;br /&gt;
&lt;br /&gt;
Tipp: Mit welchem Bezeichner der Style im Queue steht sieht man u.U. auch direkt am Style&lt;br /&gt;
 &amp;lt;link rel=&amp;#039;stylesheet&amp;#039; id=&amp;#039;googleFontQuote-css&amp;#039;  href=&amp;#039;http://fonts.googleapis.com/css?family=Playfair+Display:400,400italic&amp;#039; type=&amp;#039;text/css&amp;#039; media=&amp;#039;all&amp;#039; /&amp;gt;&lt;br /&gt;
steht für einen Bezeichner googleFontQuote also muss die Zeile heißen:&lt;br /&gt;
 wp_deregister_style( &amp;#039;googleFontQuote&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
== Mit Plugins entfernen ==&lt;br /&gt;
Mittlerweile gibt es auch ein paar Tools:&lt;br /&gt;
 https://www.strato.de/blog/google-fonts-in-wordpress-lokal-hosten/&lt;br /&gt;
Essentiell ist dieses:&lt;br /&gt;
&lt;br /&gt;
Um die Google Fonts aus dem Theme und den Plugins zu entfernen, kannst du das Plugin Disable and Remove Google Fonts einsetzen. Es kommt gänzlich ohne Optionen daher und verbannt einfach sämtliche Google Fonts aus deinem Blog.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Wordpress_-_Google_Fonts_statisch_einbinden&amp;diff=26211</id>
		<title>Wordpress - Google Fonts statisch einbinden</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Wordpress_-_Google_Fonts_statisch_einbinden&amp;diff=26211"/>
		<updated>2022-09-10T14:55:55Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aus Datenschutzgründen sollte man Google Fonts statisch auf dem Server seines Vertrauens vorhalten. Doch wie entfernt man Sie aus Wordpress Themes?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Manuell entfernen ==&lt;br /&gt;
Die Fonts werde aus den Einstellungen des Themes meist über die functions.php und die wp_head Funktion geladen. Dabei findet man in &lt;br /&gt;
&lt;br /&gt;
=== Wo sucht man? ===&lt;br /&gt;
header.php&lt;br /&gt;
 &amp;lt;?php wp_head();?&amp;gt;&lt;br /&gt;
etwas in der Art. Das ist ein sehr wichtiger Hook in WP über den alles mögliche geladen werden kann.&lt;br /&gt;
&lt;br /&gt;
In functions.php wird es konkret. Hier finden wir etwas in der Art:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
wp_enqueue_style(&amp;#039;googleFontbody&amp;#039;, &amp;#039;http://fonts.googleapis.com/css?family=&amp;#039;.$font_body ,&amp;#039;&amp;#039;,NULL);	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier wird also ein Stylesheet von Google in die Warteschlange gestellt, die dann später an der Stelle von wp_head() eingefügt wird. Außerdem stellen wir ein eigenes Stylesheet für unser Child Theme in den Queue um damit unsere Fonts einzubinden.&lt;br /&gt;
&lt;br /&gt;
=== Google Fonts entfernen und Stylesheet einbinden ===&lt;br /&gt;
Um diese Styles wieder loszuwerde registrieren wir im ChildTheme einfach eine eigene Funktion und schmeißen über diese die Google Styles wieder aus der Warteschlange.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
add_action( &amp;#039;wp_enqueue_scripts&amp;#039;, &amp;#039;theme_enqueue_styles&amp;#039; );&lt;br /&gt;
function theme_enqueue_styles() {&lt;br /&gt;
    wp_enqueue_style( &amp;#039;parent-style&amp;#039;, get_template_directory_uri() . &amp;#039;/style.css&amp;#039; );&lt;br /&gt;
    wp_enqueue_style( &amp;#039;child-style&amp;#039;,&lt;br /&gt;
        get_stylesheet_directory_uri() . &amp;#039;/style.css&amp;#039;,&lt;br /&gt;
        array(&amp;#039;parent-style&amp;#039;)&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function my_deregister_styles() {&lt;br /&gt;
    wp_deregister_style( &amp;#039;googleFontbody&amp;#039; );// no google font scripts&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Fonts kommen in einen Ordner &amp;quot;fonts&amp;quot; im Child Theme und können So referenziert werden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* oswald-regular - latin */&lt;br /&gt;
@font-face {&lt;br /&gt;
	font-family: &amp;#039;Oswald&amp;#039;;&lt;br /&gt;
	font-style: normal;&lt;br /&gt;
	font-weight: 400;&lt;br /&gt;
	src: local(&amp;#039;&amp;#039;),&lt;br /&gt;
		 url(&amp;#039;fonts/oswald-v35-latin-regular.woff2&amp;#039;) format(&amp;#039;woff2&amp;#039;), /* Chrome 26+, Opera 23+, Firefox 39+ */&lt;br /&gt;
		 url(&amp;#039;fonts/oswald-v35-latin-regular.woff&amp;#039;) format(&amp;#039;woff&amp;#039;); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */&lt;br /&gt;
  }&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Styles können dann wie üblich mit font-family gesetzt werden&lt;br /&gt;
 body{font-family: Oswald,sans-serif;}&lt;br /&gt;
&lt;br /&gt;
Tipp: Mit welchem Bezeichner der Style im Queue steht sieht man u.U. auch direkt am Style&lt;br /&gt;
 &amp;lt;link rel=&amp;#039;stylesheet&amp;#039; id=&amp;#039;googleFontQuote-css&amp;#039;  href=&amp;#039;http://fonts.googleapis.com/css?family=Playfair+Display:400,400italic&amp;#039; type=&amp;#039;text/css&amp;#039; media=&amp;#039;all&amp;#039; /&amp;gt;&lt;br /&gt;
steht für einen Bezeichner googleFontQuote also muss die Zeile heißen:&lt;br /&gt;
 wp_deregister_style( &amp;#039;googleFontQuote&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
== Mit Plugins entfernen ==&lt;br /&gt;
Mittlerweile gibt es auch ein paar Tools:&lt;br /&gt;
 https://www.strato.de/blog/google-fonts-in-wordpress-lokal-hosten/&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Modules_-_common_functions&amp;diff=26210</id>
		<title>ProcessWire Modules - common functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Modules_-_common_functions&amp;diff=26210"/>
		<updated>2022-09-09T16:55:01Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „Hier sind einige Funktionen und Eigenschaften erklärt, die bei der Entwicklung von Modulen immer wieder vorkommen.  === sleepValue(), wakeupValue(), sanitizeV…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier sind einige Funktionen und Eigenschaften erklärt, die bei der Entwicklung von Modulen immer wieder vorkommen.&lt;br /&gt;
&lt;br /&gt;
=== sleepValue(), wakeupValue(), sanitizeValue ===&lt;br /&gt;
 https://processwire.com/talk/topic/671-relationship-between-sleepvalue-wakeupvalue-and-sanitizevalue-methods&lt;br /&gt;
 https://processwire.com/api/ref/fieldtype/wakeup-value/&lt;br /&gt;
 https://processwire.com/api/ref/fieldtype/sleep-value/&lt;br /&gt;
&lt;br /&gt;
Hintergrund: Wenn man Fieldtypes programmiert gibt es oft komplexe Objekte die man auf der Seite anzeigen möchte, die aber nicht so in der Datenbank gespeichert werden können. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;sleepValue&amp;#039;&amp;#039;&amp;#039; ist eine Funktion in der man seinen Datentyp in einen einfachen Typ übersetzt, den an in der Datenbank speichern kann. Z.B. als JSON String o.ä.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;wakeupValue&amp;#039;&amp;#039;&amp;#039; macht das umgekehrte und übersetzt den Basic Type in ein Objekt für das Page Objekt.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Module_schreiben&amp;diff=26209</id>
		<title>ProcessWire - Module schreiben</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Module_schreiben&amp;diff=26209"/>
		<updated>2022-09-09T16:49:27Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Interessantes - Read On */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wichtigste Resourcen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 https://processwire.com/docs/modules/development/ - Guter Ausgangspunkt&lt;br /&gt;
 https://processwire.com/api/ref/module/ - Module API&lt;br /&gt;
 https://processwire.com/docs/modules/types/ - Welche Modultypen gibt es ?&lt;br /&gt;
 https://processwire.com/talk/topic/778-module-dependencies/ - Module die andere Module benötigen&lt;br /&gt;
 https://processwire.com/talk/forum/19-moduleplugin-development/ - Forum zum Thema Module entwickeln&lt;br /&gt;
 http://somatonic.github.io/Captain-Hook/ - Hook Cheatsheet&lt;br /&gt;
 https://processwire.com/blog/posts/new-module-configuration-options/ - Neuere Konfigurationsmöglichkeiten&lt;br /&gt;
 https://processwire.com/docs/start/api-access/ Zugriff auf ProcessWire API Variablen (wire Objekt)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Tutorials und Beispiele zum Einstieg &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 https://processwire.com/docs/modules/ - Introduction, Development, Hooks, Types, Pro Modules, Third Party&lt;br /&gt;
 https://github.com/ryancramerdesign/ProcessHello - Modul Skelett Beispiel für eigene Backend (Process) Module&lt;br /&gt;
 https://github.com/ryancramerdesign/FieldtypeMapMarker - Beispiel für ein Fieldtype und Inputfield Modul&lt;br /&gt;
 https://processwire.com/blog/posts/building-custom-admin-pages-with-process-modules/ - super Tutorial zu Admin Modulen&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/a-beginners-introduction-to-writing-modules-in-processwire--cms-26862&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wikiseiten&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 [[ProcessWire - Module Snippets]]&lt;br /&gt;
 [[ProcessWire - Fieldtype erstellen (Module)]]&lt;br /&gt;
 [[Process Module (ProcessWire)]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Links&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 http://modules.pw/ (Module Creator)&lt;br /&gt;
&lt;br /&gt;
== Wo - Was ? ==&lt;br /&gt;
=== Welche Typen von Modulen gibt es ? ===&lt;br /&gt;
 https://processwire.com/docs/modules/types/&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Fieldtype&amp;#039;&amp;#039;&amp;#039;: Repräsentiert einen Datentyp. Meistens keine Public API, Handelt Daten / Datenbank - [[ProcessWire - Fieldtype erstellen (Module)]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Inputfield&amp;#039;&amp;#039;&amp;#039;: Sammelt User Eingaben über ein Formular im Admin Bereich. Im Gegensatz zum Fieldtype geht es hier um das UI im Backend. Das Handling der Daten liegt beim Fieldtype.&lt;br /&gt;
* [[Process Module (ProcessWire)|&amp;#039;&amp;#039;&amp;#039;Process&amp;#039;&amp;#039;&amp;#039; for creating admin processes/applications.]]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Textformatter&amp;#039;&amp;#039;&amp;#039; for formatting text.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;AdminTheme&amp;#039;&amp;#039;&amp;#039; for creating themes in the admin.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;WireMail&amp;#039;&amp;#039;&amp;#039; for modules that send email and extend the WireMail class.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Tfa&amp;#039;&amp;#039;&amp;#039; for implementing a specific kind of two-factor authentication.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ImageSizerEngine&amp;#039;&amp;#039;&amp;#039; for modules that extend ImageSizerEngine for resizing images.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FileCompiler&amp;#039;&amp;#039;&amp;#039; for modules that extend FileCompilerModule for compilation of files.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FileValidator&amp;#039;&amp;#039;&amp;#039; for modules that extend FileValidatorModule for validation of files.&lt;br /&gt;
&lt;br /&gt;
=== Wie werden Felder in der Datenbank angelegt ? ===&lt;br /&gt;
Felder die in der Datenbank speichern sind vom Typ &amp;quot;Fieldtype&amp;quot;, meistens in Kombination mit einem Inputfield das dann die Frontendausgabe übernimmt. &lt;br /&gt;
Module können auch für ihre eigene Konfiguration Daten in der Datenbank speichern. Das geht z.B. über eine ModulnameConfig Datei (s.u.).&lt;br /&gt;
&lt;br /&gt;
=== Namenskonventionen ===&lt;br /&gt;
Ein Modulname sollte mit dem Typ den das Modul hat beginnen. Also etwa ProcessMeinAdminModul oder FieldtypeTable. ProcessWire listet das Modul dann in der Entsprechenden Kategorie auf. Wenn man etwas anderes nimmt z.B. LoginRegister dann kommt das Modul unter der neuen Rubrik &amp;quot;Login&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Konfigurierbare Module ===&lt;br /&gt;
Das geht seit 2.5.5 mittlerweile sehr einfach mit den neuen configuration-options.&lt;br /&gt;
 https://processwire.com/blog/posts/new-module-configuration-options/&lt;br /&gt;
 [[ProcessWire - Konfigurierbare Module]]&lt;br /&gt;
&lt;br /&gt;
== Spezielle Funktionen in Modulen ==&lt;br /&gt;
&lt;br /&gt;
=== Modulinformation ===&lt;br /&gt;
Das Modul stellt Infos zur Verfügung und nutzt dafür eine von 3 Methoden:&lt;br /&gt;
    getModuleInfo() static method in your module class that returns an array.&lt;br /&gt;
    YourModuleClass.info.php file that populates an $info array.&lt;br /&gt;
    YourModuleClass.info.json file that contains an info object.&lt;br /&gt;
&lt;br /&gt;
Hier werden title, version, summary und weitere Daten hinterlegt. Hier kann man auch angeben ob ein Modul ein Autoload Modul ist.&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/api/ref/module/&lt;br /&gt;
&lt;br /&gt;
=== init ===&lt;br /&gt;
 public function init(){}&lt;br /&gt;
Initialisiert das Modul. ProcessWire ruft diese Funktion auf, wenn das Modul geladen ist. Bei Autoload Modulen wird es aufgerufen wenn die ProcessWire API bereit ist. Daher ist es ein guter Ort um Hooks einzubinden.&lt;br /&gt;
&lt;br /&gt;
=== ready ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
  public function ready() {&lt;br /&gt;
    if($this-&amp;gt;page-&amp;gt;template == &amp;#039;admin&amp;#039;) {&lt;br /&gt;
      $this-&amp;gt;message($this-&amp;gt;hi());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wird in autoload Modulen aufgerufen wenn die API bereit ist. Nützlich für Hooks:&lt;br /&gt;
&lt;br /&gt;
=== execute ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * This function is executed when a page with your Process assigned is accessed. &lt;br /&gt;
 	 *&lt;br /&gt;
	 * This can be seen as your main or index function. You&amp;#039;ll probably want to replace&lt;br /&gt;
	 * everything in this function. &lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function ___execute() {&lt;br /&gt;
		// greetingType and greeting are automatically populated to this module&lt;br /&gt;
		// and they were defined in ProcessHello.config.php&lt;br /&gt;
		if($this-&amp;gt;greetingType == &amp;#039;message&amp;#039;) {&lt;br /&gt;
			$this-&amp;gt;message($this-&amp;gt;greeting); &lt;br /&gt;
		} else if($this-&amp;gt;greetingType == &amp;#039;warning&amp;#039;) {&lt;br /&gt;
			$this-&amp;gt;warning($this-&amp;gt;greeting); &lt;br /&gt;
		} else {&lt;br /&gt;
			$this-&amp;gt;error($this-&amp;gt;greeting); &lt;br /&gt;
		}&lt;br /&gt;
		// generate some navigation&lt;br /&gt;
		$out = 	&amp;quot;&lt;br /&gt;
			&amp;lt;h2&amp;gt;$this-&amp;gt;greeting&amp;lt;/h2&amp;gt;&lt;br /&gt;
			&amp;lt;dl class=&amp;#039;nav&amp;#039;&amp;gt;&lt;br /&gt;
				&amp;lt;dt&amp;gt;&amp;lt;a href=&amp;#039;./something/&amp;#039;&amp;gt;Do Something&amp;lt;/a&amp;gt;&amp;lt;/dt&amp;gt;&lt;br /&gt;
				&amp;lt;dd&amp;gt;Runs the executeSomething() function.&amp;lt;/dd&amp;gt;&lt;br /&gt;
			&amp;lt;/dl&amp;gt;&lt;br /&gt;
			&amp;quot;;&lt;br /&gt;
		return $out;&lt;br /&gt;
	}	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== executeSomething ===&lt;br /&gt;
Ruft man eine Unterseite des Moduls auf kann man eine eigene execute Funktion nutzen&lt;br /&gt;
___executeSlug wobei Slug für den Url Slug steht. Heißt der slug /field/ dann wird executeField() aufgerufen, falls diese Funktion existiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called when the URL is this module&amp;#039;s page URL + &amp;quot;/something/&amp;quot;&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function ___executeSomething() {&lt;br /&gt;
		// set a new headline, replacing the one used by our page&lt;br /&gt;
		// this is optional as PW will auto-generate a headline &lt;br /&gt;
		$this-&amp;gt;headline(&amp;#039;This is something!&amp;#039;); &lt;br /&gt;
		// add a breadcrumb that returns to our main page &lt;br /&gt;
		// this is optional as PW will auto-generate breadcrumbs&lt;br /&gt;
		$this-&amp;gt;breadcrumb(&amp;#039;../&amp;#039;, &amp;#039;Hello&amp;#039;); &lt;br /&gt;
		$out = 	&amp;quot;&lt;br /&gt;
			&amp;lt;h2&amp;gt;Not much to to see here&amp;lt;/h2&amp;gt;&lt;br /&gt;
			&amp;lt;p&amp;gt;&amp;lt;a href=&amp;#039;../&amp;#039;&amp;gt;Go Back&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
			&amp;quot;;&lt;br /&gt;
		return $out; &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* executeMySecondPage translates to my-second-page in the URL&lt;br /&gt;
* executeMysecondpage translates to mysecondpage in the URL&lt;br /&gt;
&lt;br /&gt;
=== install &amp;amp; uninstall ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
	 * Called only when your module is installed&lt;br /&gt;
	 *&lt;br /&gt;
	 * If you don&amp;#039;t need anything here, you can simply remove this method. &lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function ___install() {&lt;br /&gt;
		parent::___install(); // always remember to call parent method&lt;br /&gt;
	}&lt;br /&gt;
	/**&lt;br /&gt;
	 * Called only when your module is uninstalled&lt;br /&gt;
	 *&lt;br /&gt;
	 * This should return the site to the same state it was in before the module was installed. &lt;br /&gt;
	 *&lt;br /&gt;
	 * If you don&amp;#039;t need anything here, you can simply remove this method. &lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function ___uninstall() {&lt;br /&gt;
		parent::___uninstall(); // always remember to call parent method&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vererbung und Eigenschaften in Modulen ==&lt;br /&gt;
Modules are not different from PHP classes.&lt;br /&gt;
&lt;br /&gt;
To change the properties of MyModule class from within MyOtherModule class, you can either:&lt;br /&gt;
&lt;br /&gt;
#Make MyOtherModule class extend MyModule. It will thus inherit MyModule&amp;#039;s public and protected properties and methods&lt;br /&gt;
#Make the properties firstName and lastName configurable by passing them as parameters/arguments in MyModule&amp;#039;s constructor method.&lt;br /&gt;
&lt;br /&gt;
== Autoload Module und Hooks ==&lt;br /&gt;
Autoload werden automatisch geladen müssen also nicht in einem Template o.ä. gestartet werden. Daher bieten sie sich an um die Funktionalität von ProcessWire zu erweitern. Als Werkzeug dafür dienen Hooks. Mit Hooks kann man an vielen Stellen den Rendering Process der Seiten beeinflussen. Außerdem kann man für eigene Module ebenfalls Hooks bereitstellen. &lt;br /&gt;
&lt;br /&gt;
=== Hooks ===&lt;br /&gt;
 https://processwire.com/docs/modules/hooks/&lt;br /&gt;
Hooks sind ein mächtiges Werkzeug. Sie geben einem die Möglichkeit an vielen Stellen &amp;quot;einzuhaken&amp;quot; und Funktionalität einzubauen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function ready() {&lt;br /&gt;
  $this-&amp;gt;addHookAfter(&amp;#039;Page::render&amp;#039;, function($event) {&lt;br /&gt;
    $event-&amp;gt;return .= &amp;#039;&amp;lt;p&amp;gt;Hallo&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
  });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Schreibt am Ende Jeder Seite ein &amp;quot;Hallo&amp;quot;. Das $event Objekt ist ein [https://processwire.com/api/ref/hook-event/ HookEvent]. Im Beispiel fügen wir einfach etwas Markup hinzu. Über $event-&amp;gt;arguments() kann man aber auf ale Argumente zugreifen.&lt;br /&gt;
&lt;br /&gt;
Das gleiche aber nicht mit anonymer Funktion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function ready() {&lt;br /&gt;
  // add hook after Page::render() and make it call the &amp;quot;test&amp;quot; method of $this module&lt;br /&gt;
  $this-&amp;gt;addHookAfter(&amp;#039;Page::render&amp;#039;, $this, &amp;#039;test&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function test($event) {&lt;br /&gt;
  // modify the return value of Page::render() to include the following:&lt;br /&gt;
  $event-&amp;gt;return .= &amp;#039;&amp;lt;p&amp;gt;Hallo&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hooks zum erweitern von existierenden Klassen nutzen ===&lt;br /&gt;
Mit Hooks kann man in vorhandene Klassen einhaken. Z.B. läßt sich das Page Objekt erweitern.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function ready() {&lt;br /&gt;
  $this-&amp;gt;addHook(&amp;#039;Page::summarize&amp;#039;, $this, &amp;#039;summarize&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
public function summarize($event) {&lt;br /&gt;
  $page = $event-&amp;gt;object; // the $event-&amp;gt;object represents the object hooked (Page)&lt;br /&gt;
  $maxlen = $event-&amp;gt;arguments(0); // first argument is the optional max length&lt;br /&gt;
  if(!$maxlen) $maxlen = 200; // if no $maxlen was present, we&amp;#039;ll use a default of 200&lt;br /&gt;
  $summary = $this-&amp;gt;sanitizer-&amp;gt;truncate($page-&amp;gt;body, $maxlen); // use sanitizer truncate method to create a summary&lt;br /&gt;
  $event-&amp;gt;return = $summary; // populate $summary to $event-&amp;gt;return, the return value&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
So kann man ganz einfach eine Zusammenfassung aller Kindseiten in einem Template rendern:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
foreach($page-&amp;gt;children as $item) {&lt;br /&gt;
  $summary = $item-&amp;gt;summarize(150);&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$item-&amp;gt;url&amp;#039;&amp;gt;$item-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;$summary&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Autoload Module nur im Admin Bereich laden ===&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;autoload&amp;#039; =&amp;gt; &amp;#039;template=admin&amp;#039; &lt;br /&gt;
statt&lt;br /&gt;
 &amp;#039;autoload&amp;#039; =&amp;gt; true&lt;br /&gt;
&lt;br /&gt;
=== Hook Beispiele ===&lt;br /&gt;
Hook am Ende des Renderings&lt;br /&gt;
 $this-&amp;gt;addHookAfter(&amp;#039;Page::render&amp;#039;, function($event) {...});&lt;br /&gt;
Füge eine Funktion &amp;quot;summarize&amp;quot; zum Page Objekt hinzu.&lt;br /&gt;
 $this-&amp;gt;addHook(&amp;#039;Page::summarize&amp;#039;, $this, &amp;#039;summarize&amp;#039;);&lt;br /&gt;
Hook auf eine einzelne Instanz (hier pages Objekt)&lt;br /&gt;
 $this-&amp;gt;pages-&amp;gt;addHookAfter(&amp;#039;saved&amp;#039;, function($event){...});&lt;br /&gt;
 $this-&amp;gt;addHook(&amp;#039;Page::method&amp;#039;, ...) // Spricht ALLE Instanzen an - Regelfall&lt;br /&gt;
 $page-&amp;gt;addHook(&amp;#039;method&amp;#039;, ...) // Spricht nur die EINE Instanz der Seite an.&lt;br /&gt;
&lt;br /&gt;
== Module Dependencies - voneinander abhängige Module ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/778-module-dependencies/&lt;br /&gt;
Wenn ein Modul nicht ohne ein anderes funktioniert spricht man von Module Dependency. In solchen Fällen kann man in der Modul Info angeben In vielen Fällen besteht ein Modul unter der Haube aus mehreren Einzelmodulen.&lt;br /&gt;
&lt;br /&gt;
Um ProcessWire mitzuteilen dass ein Modul benötigt wird gibt man es in der Moduldefinition an:&lt;br /&gt;
 &amp;#039;requires&amp;#039; =&amp;gt; &amp;quot;LazyCron&amp;quot;  // added this line&lt;br /&gt;
oder auch mehrere als Array&lt;br /&gt;
 &amp;#039;requires&amp;#039; =&amp;gt; array(&amp;quot;LazyCron&amp;quot;, &amp;quot;AdminBar&amp;quot;)  // added this line&lt;br /&gt;
&lt;br /&gt;
ProcessWire kann auch dafür sorgen, dass ein Modul andere &amp;quot;Kindmodule&amp;quot; gleich mitinstalliert bzw. deinstalliert wenn es nicht mehr benötigt wird. Dazu gibt man dem Modul noch die &amp;#039;install&amp;#039; dependency mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
public static function getModuleInfo() {&lt;br /&gt;
   return array(&lt;br /&gt;
       &amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Log Master&amp;#039;,&lt;br /&gt;
       &amp;#039;version&amp;#039; =&amp;gt; 101,&lt;br /&gt;
       &amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Lumberjack Bob&amp;#039;,&lt;br /&gt;
       &amp;#039;summary&amp;#039; =&amp;gt; &amp;#039;Log all actions on your site&amp;#039;,&lt;br /&gt;
       &amp;#039;requires&amp;#039; =&amp;gt; &amp;#039;LazyCron&amp;#039;, &lt;br /&gt;
       &amp;#039;installs&amp;#039; =&amp;gt; &amp;#039;ProcessLogMaster&amp;#039;  // added this line&lt;br /&gt;
       ); &lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProcessWire sieht dann eine Kindabhängigkeit zu diesem Modul und handelt auch das Deinstallieren, wenn das Elternmodul deinstalliert wird.&lt;br /&gt;
&lt;br /&gt;
== CSS und JavaScript in Modulen ==&lt;br /&gt;
Bei Process Modulen möchte man für das Styling etc. im Backend oft CSS und JS Dateien hinzufügen.&lt;br /&gt;
&lt;br /&gt;
Einfach Eine Datei MeinModul.css und / oder MeinModul.js hinzufügen. JQuery ist im Admin bereits geladen daher kann eine MeinModul.js Starter Datei so aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This JS file is only loaded when the ProcessHello module is run&lt;br /&gt;
 *&lt;br /&gt;
 * You should delete it if you have no javascript to add.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	// do something&lt;br /&gt;
}); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Flexibler Umgang mit Templates - TemplateFile ==&lt;br /&gt;
TemplateFile sind eine Möglichkeit Templates zu Managen. Nützlich in Modulen oder in größeren Teams wo man sehr granuliert die Zugriffe über den Code steuern möchte.&lt;br /&gt;
 https://processwire.com/talk/topic/291-simple-tutorial-on-how-to-use-templatefile-class/&lt;br /&gt;
 https://processwire.com/api/ref/template-file/&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$out = new TemplateFile(&amp;quot;./includes/my_markup.html&amp;quot;); &lt;br /&gt;
$out-&amp;gt;set(&amp;#039;headline&amp;#039;, $page-&amp;gt;get(&amp;quot;headline|title&amp;quot;)); &lt;br /&gt;
$out-&amp;gt;set(&amp;#039;body&amp;#039;, $page-&amp;gt;body);&lt;br /&gt;
$out-&amp;gt;set(&amp;#039;sidebar&amp;#039;, $page-&amp;gt;sidebar); &lt;br /&gt;
$out-&amp;gt;set(&amp;#039;navigation&amp;#039;, $pages-&amp;gt;find(&amp;quot;parent=/&amp;quot;));&lt;br /&gt;
echo $out-&amp;gt;render();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In my_markup.html kann man headline, body... einfach als Variablen setzen. Beim Rendern werden diese dann ersetzt.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Felder und Templates erstellen ===&lt;br /&gt;
In einem Modul kann man Felder und Templates automatisch erstellen. &lt;br /&gt;
 https://processwire.com/talk/topic/20533-solved-fields-templates-and-fieldgroups-how-do-they-interact/&lt;br /&gt;
&lt;br /&gt;
 For everyone not deeply into obscure PW vodoo magic, creating a template with fields is always:&lt;br /&gt;
&lt;br /&gt;
    Create a template&lt;br /&gt;
    Create a fieldgroup with the same name as the template&lt;br /&gt;
    Create your fields, save them and add them to the fieldgroup&lt;br /&gt;
    Save the fieldgroup&lt;br /&gt;
    Set the fieldgroup in the template&lt;br /&gt;
    Save the template&lt;br /&gt;
&lt;br /&gt;
* Are Fieldgroups required for adding fields to templates? What are these for?&lt;br /&gt;
** Yes, they are. As written above, they are just a necessary glue. &lt;br /&gt;
*What if I&amp;#039;d like to add fields after the template was saved and how can I add them to the same fieldgroup?&lt;br /&gt;
** Just add them to the fieldgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$fg = $template-&amp;gt;fieldgroup;&lt;br /&gt;
$fg-&amp;gt;add($field);&lt;br /&gt;
$fg-&amp;gt;save();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Frontend Rendering Module ===&lt;br /&gt;
A bit old but working&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * FrontEndRender&lt;br /&gt;
 *&lt;br /&gt;
 * Author: Ben Byford&lt;br /&gt;
 *&lt;br /&gt;
 * ProcessWire 2.x&lt;br /&gt;
 * Copyright (C) 2010 by Ryan Cramer&lt;br /&gt;
 * Licensed under GNU/GPL v2, see LICENSE.TXT&lt;br /&gt;
 *&lt;br /&gt;
 * http://www.processwire.com&lt;br /&gt;
 * http://www.ryancramer.com&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
class FrontEndRender extends WireData implements Module {&lt;br /&gt;
&lt;br /&gt;
	public static function getModuleInfo() {&lt;br /&gt;
		return array(&lt;br /&gt;
			&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;FrontEndRender&amp;#039;,&lt;br /&gt;
			&amp;#039;version&amp;#039; =&amp;gt; 0.1,&lt;br /&gt;
			&amp;#039;summary&amp;#039; =&amp;gt; &amp;quot;Outputs html and static variables to frontend&amp;quot;,&lt;br /&gt;
			&amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Ben Byford&amp;#039;,&lt;br /&gt;
			&amp;#039;singular&amp;#039; =&amp;gt; true,&lt;br /&gt;
			&amp;#039;href&amp;#039; =&amp;gt; &amp;#039;https://github.com/benbyford/PW-starter-modules&amp;#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// protected variable only accessable within module&lt;br /&gt;
	protected $name = &amp;#039;Ben&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* render function to be called in PW template like this:&lt;br /&gt;
	* $FrontEndRender = $modules-&amp;gt;getModule(&amp;#039;FrontEndRender&amp;#039;);&lt;br /&gt;
	* echo &amp;#039;&amp;lt;h1&amp;gt;&amp;#039; . $FrontEndRender-&amp;gt;render() . &amp;#039;&amp;lt;/h1&amp;gt;&amp;#039;;&lt;br /&gt;
	*&lt;br /&gt;
	*/&lt;br /&gt;
	public function render(){&lt;br /&gt;
		return &amp;quot;Hello &amp;quot; . $this-&amp;gt;name;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ProcessWire Hello World Modul ===&lt;br /&gt;
Beispiel Modul mit Hooks (liegt immer in der Standardinstallation)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ProcessWire &amp;#039;Hello world&amp;#039; demonstration module&lt;br /&gt;
 *&lt;br /&gt;
 * Demonstrates the Module interface and how to add hooks.&lt;br /&gt;
 * &lt;br /&gt;
 * See README file for further links regarding module development.&lt;br /&gt;
 * &lt;br /&gt;
 * This file is licensed under the MIT license&lt;br /&gt;
 * https://processwire.com/about/license/mit/&lt;br /&gt;
 * &lt;br /&gt;
 * ProcessWire 3.x, Copyright 2016 by Ryan Cramer&lt;br /&gt;
 * https://processwire.com&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
class Helloworld extends WireData implements Module {&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * getModuleInfo is a module required by all modules to tell ProcessWire about them&lt;br /&gt;
	 *&lt;br /&gt;
	 * @return array&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public static function getModuleInfo() {&lt;br /&gt;
&lt;br /&gt;
		return array(&lt;br /&gt;
&lt;br /&gt;
			// The module&amp;#039;s title, typically a little more descriptive than the class name&lt;br /&gt;
			&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Hello World&amp;#039;, &lt;br /&gt;
&lt;br /&gt;
			// version number &lt;br /&gt;
			&amp;#039;version&amp;#039; =&amp;gt; 3, &lt;br /&gt;
&lt;br /&gt;
			// summary is brief description of what this module is&lt;br /&gt;
			&amp;#039;summary&amp;#039; =&amp;gt; &amp;#039;An example module used for demonstration purposes.&amp;#039;,&lt;br /&gt;
			&lt;br /&gt;
			// Optional URL to more information about the module&lt;br /&gt;
			&amp;#039;href&amp;#039; =&amp;gt; &amp;#039;https://processwire.com&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
			// singular=true: indicates that only one instance of the module is allowed.&lt;br /&gt;
			// This is usually what you want for modules that attach hooks. &lt;br /&gt;
			&amp;#039;singular&amp;#039; =&amp;gt; true, &lt;br /&gt;
&lt;br /&gt;
			// autoload=true: indicates the module should be started with ProcessWire.&lt;br /&gt;
			// This is necessary for any modules that attach runtime hooks, otherwise those&lt;br /&gt;
			// hooks won&amp;#039;t get attached unless some other code calls the module on it&amp;#039;s own.&lt;br /&gt;
			// Note that autoload modules are almost always also &amp;#039;singular&amp;#039; (seen above).&lt;br /&gt;
			&amp;#039;autoload&amp;#039; =&amp;gt; true, &lt;br /&gt;
		&lt;br /&gt;
			// Optional font-awesome icon name, minus the &amp;#039;fa-&amp;#039; part&lt;br /&gt;
			&amp;#039;icon&amp;#039; =&amp;gt; &amp;#039;smile-o&amp;#039;, &lt;br /&gt;
			);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Initialize the module&lt;br /&gt;
	 *&lt;br /&gt;
	 * ProcessWire calls this when the module is loaded. For &amp;#039;autoload&amp;#039; modules, this will be called&lt;br /&gt;
	 * when ProcessWire&amp;#039;s API is ready. As a result, this is a good place to attach hooks. &lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function init() {&lt;br /&gt;
&lt;br /&gt;
		// add a hook after the $pages-&amp;gt;save, to issue a notice every time a page is saved&lt;br /&gt;
		$this-&amp;gt;pages-&amp;gt;addHookAfter(&amp;#039;save&amp;#039;, $this, &amp;#039;example1&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
		// add a hook after each page is rendered and modify the output&lt;br /&gt;
		$this-&amp;gt;addHookAfter(&amp;#039;Page::render&amp;#039;, $this, &amp;#039;example2&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
		// add a &amp;#039;hello&amp;#039; method to every page that returns &amp;quot;Hello World&amp;quot;&lt;br /&gt;
		// use &amp;quot;echo $page-&amp;gt;hello();&amp;quot; in your template file to display output&lt;br /&gt;
		$this-&amp;gt;addHook(&amp;#039;Page::hello&amp;#039;, $this, &amp;#039;example3&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
		// add a &amp;#039;hello_world&amp;#039; property to every page that returns &amp;quot;Hello [user]&amp;quot;&lt;br /&gt;
		// use &amp;quot;echo $page-&amp;gt;hello_world;&amp;quot; in your template file to display output&lt;br /&gt;
		$this-&amp;gt;addHookProperty(&amp;#039;Page::hello_world&amp;#039;, $this, &amp;#039;example4&amp;#039;); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Example1 hooks into the pages-&amp;gt;save method and displays a notice every time a page is saved&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param HookEvent $event&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function example1($event) {&lt;br /&gt;
		/** @var Page $page */&lt;br /&gt;
		$page = $event-&amp;gt;arguments[0]; &lt;br /&gt;
		$this-&amp;gt;message(&amp;quot;Hello World! You saved {$page-&amp;gt;path}.&amp;quot;); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Example2 hooks into every page after it&amp;#039;s rendered and adds &amp;quot;Hello World&amp;quot; text at the bottom&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param HookEvent $event&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function example2($event) {&lt;br /&gt;
&lt;br /&gt;
		/** @var Page $page */&lt;br /&gt;
		$page = $event-&amp;gt;object; &lt;br /&gt;
&lt;br /&gt;
		// don&amp;#039;t add this to the admin pages&lt;br /&gt;
		if($page-&amp;gt;template == &amp;#039;admin&amp;#039;) return;&lt;br /&gt;
&lt;br /&gt;
		// add a &amp;quot;Hello World&amp;quot; paragraph right before the closing body tag&lt;br /&gt;
		$event-&amp;gt;return = str_replace(&amp;quot;&amp;lt;/body&amp;gt;&amp;quot;, &amp;quot;&amp;lt;p&amp;gt;Hello World!&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;quot;, $event-&amp;gt;return); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Example3 adds a &amp;#039;hello&amp;#039; method (not property) to every page that simply returns &amp;quot;Hello World&amp;quot;&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param HookEvent $event&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function example3($event) {&lt;br /&gt;
		$event-&amp;gt;return = &amp;quot;Hello World&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Example 4 adds a &amp;#039;hello_world&amp;#039; property (not method) to every page that returns &amp;quot;Hello [user]&amp;quot;&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param HookEvent $event&lt;br /&gt;
	 *&lt;br /&gt;
	 */&lt;br /&gt;
	public function example4($event) {&lt;br /&gt;
		$event-&amp;gt;return = &amp;quot;Hello &amp;quot; . $this-&amp;gt;user-&amp;gt;name; &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ProcessWire Admin Bereich mit eigener Funktionalität erweitern (Modul)===&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/extending-the-processwire-admin-using-custom-modules--cms-26863&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
* ProcessSimpleAdminPage&lt;br /&gt;
*&lt;br /&gt;
* @author Ben Byford&lt;br /&gt;
* http://www.benbyford.com&lt;br /&gt;
*&lt;br /&gt;
* @see http://www.processwire.com&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
class ProcessSimpleAdminPage extends Process {&lt;br /&gt;
&lt;br /&gt;
    public static function getModuleInfo() {&lt;br /&gt;
        return array(&lt;br /&gt;
            &amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Process Simple Admin Page&amp;#039;,&lt;br /&gt;
            &amp;#039;summary&amp;#039; =&amp;gt; &amp;#039;Simple Process module that adds new admin page with&amp;#039;,&lt;br /&gt;
            &amp;#039;version&amp;#039; =&amp;gt; 001,&lt;br /&gt;
&lt;br /&gt;
            // Modules that extend Process may specify a &amp;#039;page&amp;#039; attribute in the&lt;br /&gt;
            // getModuleInfo(), this page will automatically be given the module&lt;br /&gt;
            // process when added to teh pagetree.&lt;br /&gt;
&lt;br /&gt;
            // I have exampled but commented out the &amp;#039;page&amp;#039; settings below&lt;br /&gt;
            // so that I can show how one might add a page to install() and&lt;br /&gt;
            // uninstall() in this and other modules (that might not extend&lt;br /&gt;
            // Process)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        // 	&amp;#039;page&amp;#039; =&amp;gt; array(&lt;br /&gt;
        // 		&amp;#039;name&amp;#039; =&amp;gt; &amp;#039;site-config&amp;#039;,&lt;br /&gt;
        // 		&amp;#039;parent&amp;#039; =&amp;gt; &amp;#039;admin&amp;#039;,&lt;br /&gt;
        // 		&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Site Config&amp;#039;&lt;br /&gt;
        // 	   )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function execute() {&lt;br /&gt;
        return &amp;#039;&lt;br /&gt;
            &amp;lt;h2&amp;gt;Edit the text here in the module&amp;lt;/h2&amp;gt;&lt;br /&gt;
            &amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam mattis eros vitae metus sodales eget suscipit purus rhoncus. Proin ultrices gravida dolor, non porttitor enim interdum vitae. Integer feugiat lacinia tincidunt. Nulla laoreet tristique tristique. Sed elementum justo a nisl elementum sit amet accumsan nisi tempor. Nulla quis eros et massa dignissim imperdiet a vitae purus.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;Donec scelerisque pulvinar sem eu lobortis. Maecenas turpis ipsum, tempus dictum pharetra eu, consectetur vitae arcu. Fusce orci mauris, semper at tempus quis, volutpat molestie tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed quam tortor, tincidunt sed semper lacinia, scelerisque dapibus quam. Morbi at nisi luctus lacus auctor ultrices eu eu leo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;Praesent faucibus purus id felis tincidunt dignissim. Sed sit amet ligula mi, eget semper dui. Proin consectetur gravida massa, nec luctus purus hendrerit in. Etiam volutpat, elit non venenatis suscipit, libero neque consectetur diam, id rutrum magna odio ac ligula. Maecenas sollicitudin congue neque fermentum vestibulum. Morbi nec leo nisi. Donec at nisl odio, et porta ligula.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            &amp;lt;p&amp;gt;Sed quis arcu nisi, ac tempor augue. Praesent non elit libero, a ullamcorper lorem. Curabitur porta odio eu nunc ultricies interdum id nec risus. Donec nibh nibh, porta eget vehicula ac, aliquet eget ante. Phasellus eget lorem eu eros eleifend ultrices. Cras sit amet neque sit amet nibh fringilla cursus ut id mauris. Praesent quis nunc justo, sed suscipit lectus. Phasellus eget ultrices risus. Curabitur eu semper est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut suscipit, nisl ut imperdiet eleifend, turpis arcu placerat tortor, nec laoreet lacus neque ac tellus. Aenean ac lacus justo, quis ultricies nisi.&amp;lt;/p&amp;gt;&lt;br /&gt;
            &amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    public function install(){&lt;br /&gt;
&lt;br /&gt;
        // create new page to add to CMS&lt;br /&gt;
		$page = new Page();&lt;br /&gt;
&lt;br /&gt;
        // add page attributes&lt;br /&gt;
        $page-&amp;gt;template = &amp;quot;admin&amp;quot;;&lt;br /&gt;
        $page-&amp;gt;name = &amp;quot;cms-faq&amp;quot;;&lt;br /&gt;
        $page-&amp;gt;title = &amp;quot;CMS FAQ&amp;quot;;&lt;br /&gt;
        $page-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
        // set this module as the page process, this allows us to display the above&lt;br /&gt;
        $page-&amp;gt;process = &amp;#039;ProcessSimpleAdminPage&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        // get admin page and set as page parent&lt;br /&gt;
        $admin = $this-&amp;gt;pages-&amp;gt;get(&amp;quot;id=2&amp;quot;);&lt;br /&gt;
        $page-&amp;gt;parent = $admin;&lt;br /&gt;
&lt;br /&gt;
        // save page&lt;br /&gt;
        $page-&amp;gt;save();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function uninstall(){&lt;br /&gt;
&lt;br /&gt;
        // delete created page&lt;br /&gt;
        $page = $this-&amp;gt;pages-&amp;gt;get(&amp;quot;name=cms-faq&amp;quot;);&lt;br /&gt;
        if(count($page)) $this-&amp;gt;pages-&amp;gt;delete($page, true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ProcessWire Textformatter Modul ===&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/extending-the-processwire-admin-using-custom-modules--cms-26863&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * TextformatterFindReplace&lt;br /&gt;
 *&lt;br /&gt;
 * Author: Ben Byford&lt;br /&gt;
 *&lt;br /&gt;
 * ProcessWire 2.x&lt;br /&gt;
 * Copyright (C) 2010 by Ryan Cramer&lt;br /&gt;
 * Licensed under GNU/GPL v2, see LICENSE.TXT&lt;br /&gt;
 *&lt;br /&gt;
 * http://www.processwire.com&lt;br /&gt;
 * http://www.ryancramer.com&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
class TextformatterFindReplace extends Textformatter implements Module {&lt;br /&gt;
&lt;br /&gt;
	public static function getModuleInfo() {&lt;br /&gt;
		return array(&lt;br /&gt;
			&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;TextformatterFindReplace&amp;#039;,&lt;br /&gt;
			&amp;#039;version&amp;#039; =&amp;gt; 0.1,&lt;br /&gt;
			&amp;#039;summary&amp;#039; =&amp;gt; &amp;quot;Finds and replaces any instance of config input to config output&amp;quot;,&lt;br /&gt;
			&amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Ben Byford&amp;#039;,&lt;br /&gt;
			&amp;#039;singular&amp;#039; =&amp;gt; true,&lt;br /&gt;
			&amp;#039;href&amp;#039; =&amp;gt; &amp;#039;https://github.com/benbyford/PW-starter-modules&amp;#039;&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
     * Find and Replace the input string&lt;br /&gt;
     *&lt;br /&gt;
     * @param string $str The block of text to parse&lt;br /&gt;
     *&lt;br /&gt;
     * The incoming string is replaced with the formatted version of itself.&lt;br /&gt;
	 **/&lt;br /&gt;
&lt;br /&gt;
	public function format(&amp;amp;$str) {&lt;br /&gt;
		$find = $this-&amp;gt;findStr;&lt;br /&gt;
		$str = preg_replace_callback($find, array($this,&amp;quot;replace&amp;quot;), $str);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// adding three underscores to a function allows other modules to hook it&lt;br /&gt;
	public function ___replace($match) {&lt;br /&gt;
		return $this-&amp;gt;replaceStr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Admin Funktionalität: Countdown zum Seitenveröffentlichen ===&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/extending-the-processwire-admin-using-custom-modules--cms-26863&lt;br /&gt;
&lt;br /&gt;
The module PageDeferredPublish, on clicking one of the &amp;#039;&amp;#039;&amp;#039;Publish Later buttons&amp;#039;&amp;#039;&amp;#039;, sets LazyCron to check that page’s countdown every minute and publishes the page when its countdown reaches 0. This means I can publish a page approximately 24 hours in advance (obviously the checking interval and delay time can be changed to your requirements).&lt;br /&gt;
&lt;br /&gt;
I did this by:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Creating two fields&amp;#039;&amp;#039;&amp;#039; within my install() function: a checkbox field to set to true when a button is checked to indicate the page should countdown, and a countdown field to store the count in seconds for that specific page.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adding hooks&amp;#039;&amp;#039;&amp;#039; to both &amp;#039;&amp;#039;ProcessPageEdit::buildForm&amp;#039;&amp;#039; and &amp;#039;&amp;#039;ProcessPageListActions::getExtraActions&amp;#039;&amp;#039; enabling me to add the two buttons.&lt;br /&gt;
&lt;br /&gt;
Checking to see if one of the buttons was clicked with my &amp;#039;&amp;#039;&amp;#039;ready() function&amp;#039;&amp;#039;&amp;#039; then setting the corresponding page’s checkbox to true.&lt;br /&gt;
&lt;br /&gt;
Using a &amp;#039;&amp;#039;&amp;#039;LazyCron hook function&amp;#039;&amp;#039;&amp;#039; to check all pages that are unpublished for true checkboxes and then comparing the seconds field to see if the page needs publishing. If not then deduct the elapsed time in seconds.&lt;br /&gt;
&lt;br /&gt;
The result is a &amp;#039;&amp;#039;&amp;#039;module that has settings&amp;#039;&amp;#039;&amp;#039; (the time interval to check and publish at a later time), &amp;#039;&amp;#039;&amp;#039;hooks into the admin&amp;#039;&amp;#039;&amp;#039; using buttons and fields, and enables us to &amp;#039;&amp;#039;&amp;#039;use other modules installe&amp;#039;&amp;#039;&amp;#039;d in PW (i.e. LazyCron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * DeferredPublish (0.0.1)&lt;br /&gt;
 * DeferredPublish publishes a page after a defined amount of time has elapsed using lazycron.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Ben Byford&lt;br /&gt;
 * http://www.benbyford.com&lt;br /&gt;
 *&lt;br /&gt;
 * ProcessWire 2.x&lt;br /&gt;
 * Copyright (C) 2011 by Ryan Cramer&lt;br /&gt;
 * Licensed under GNU/GPL v2, see LICENSE.TXT&lt;br /&gt;
 *&lt;br /&gt;
 * http://www.processwire.com&lt;br /&gt;
 * http://www.ryancramer.com&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
class PageDeferredPublish extends WireData implements Module {&lt;br /&gt;
&lt;br /&gt;
	public static function getModuleInfo() {&lt;br /&gt;
		return array(&lt;br /&gt;
			&amp;#039;title&amp;#039; =&amp;gt; &amp;quot;PageDeferredPublish&amp;quot;,&lt;br /&gt;
			&amp;#039;version&amp;#039; =&amp;gt; &amp;quot;0.0.1&amp;quot;,&lt;br /&gt;
			&amp;#039;summary&amp;#039; =&amp;gt; &amp;quot;PageDeferredPublish&amp;quot;,&lt;br /&gt;
			&amp;#039;author&amp;#039; =&amp;gt; &amp;quot;Ben Byford&amp;quot;,&lt;br /&gt;
			&amp;#039;href&amp;#039; =&amp;gt; &amp;quot;https://github.com/benbyford/PW-intermediate-modules&amp;quot;,&lt;br /&gt;
			&amp;#039;icon&amp;#039; =&amp;gt; &amp;quot;clock-o&amp;quot;,&lt;br /&gt;
			&amp;#039;autoload&amp;#039; =&amp;gt; true,&lt;br /&gt;
			&amp;#039;singular&amp;#039; =&amp;gt; true,&lt;br /&gt;
			&amp;#039;requires&amp;#039; =&amp;gt; &amp;quot;LazyCron&amp;quot;,&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private $postPubLater 	= null;&lt;br /&gt;
	private $pageID 		= null;&lt;br /&gt;
	private $pagePubLater 	= null;&lt;br /&gt;
	private $currentPage	= null;&lt;br /&gt;
&lt;br /&gt;
	private $submitName 	= &amp;#039;pdp_pub_later_submit&amp;#039;;&lt;br /&gt;
	private $listPageName	= &amp;#039;pdp_pub_later_list&amp;#039;;&lt;br /&gt;
	private $fieldName 		= &amp;#039;pdp_pub_later&amp;#039;;&lt;br /&gt;
	private $checkboxName	= &amp;#039;pdp_pub_later_check&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	private $defaultInterval = &amp;#039;everyMinute&amp;#039;;&lt;br /&gt;
	private $defaultTime 	= 86400;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	public function install(){&lt;br /&gt;
		// add new fields needed for module&lt;br /&gt;
		$this-&amp;gt;installFields();&lt;br /&gt;
	}&lt;br /&gt;
	public function uninstall(){&lt;br /&gt;
		// uninstall fields&lt;br /&gt;
		$this-&amp;gt;uninstallFields();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// initialize the hook in your AutoLoad module&lt;br /&gt;
	public function init() {&lt;br /&gt;
&lt;br /&gt;
		// get defaults from module setting in CMS&lt;br /&gt;
		$this-&amp;gt;defaultTime = $this-&amp;gt;pub_after;&lt;br /&gt;
		$this-&amp;gt;defaultInterval = $this-&amp;gt;cron_check;&lt;br /&gt;
&lt;br /&gt;
		// get admin URL&lt;br /&gt;
		$this-&amp;gt;adminUrl = $this-&amp;gt;wire(&amp;#039;config&amp;#039;)-&amp;gt;urls-&amp;gt;admin;&lt;br /&gt;
&lt;br /&gt;
		// add hooks to CRON, PageList, PageEdit&lt;br /&gt;
	    $this-&amp;gt;addHookAfter(&amp;quot;LazyCron::{$this-&amp;gt;defaultInterval}&amp;quot;, $this, &amp;#039;publishDefferedPages&amp;#039;);&lt;br /&gt;
		$this-&amp;gt;addHook(&amp;quot;ProcessPageListActions::getExtraActions&amp;quot;, $this, &amp;#039;hookPageListActions&amp;#039;);&lt;br /&gt;
		$this-&amp;gt;addHookAfter(&amp;quot;ProcessPageEdit::buildForm&amp;quot;, $this, &amp;quot;editForm&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function ready() {&lt;br /&gt;
&lt;br /&gt;
		// if list button clicked then grab id&lt;br /&gt;
		$this-&amp;gt;pagePubLater = $this-&amp;gt;input-&amp;gt;get($this-&amp;gt;listPageName);&lt;br /&gt;
		$this-&amp;gt;pageID = $this-&amp;gt;input-&amp;gt;id;&lt;br /&gt;
&lt;br /&gt;
		// get page&lt;br /&gt;
		$this-&amp;gt;currentPage = $this-&amp;gt;pages-&amp;gt;get($this-&amp;gt;pageID);&lt;br /&gt;
&lt;br /&gt;
		// if pagelist pub later submit button clicked&lt;br /&gt;
		if($this-&amp;gt;pagePubLater){&lt;br /&gt;
			$this-&amp;gt;message(&amp;quot;Page {$this-&amp;gt;currentPage-&amp;gt;name} deffered for publish.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if page edit submit button clicked&lt;br /&gt;
		$this-&amp;gt;postPubLater = $this-&amp;gt;input-&amp;gt;post($this-&amp;gt;submitName);&lt;br /&gt;
		if($this-&amp;gt;postPubLater){&lt;br /&gt;
			$this-&amp;gt;message(&amp;quot;Page {$this-&amp;gt;currentPage-&amp;gt;name} deffered for publish.&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// if either deffered publish sumbit found then publish page later&lt;br /&gt;
		if($this-&amp;gt;pagePubLater || $this-&amp;gt;postPubLater){&lt;br /&gt;
			$this-&amp;gt;publishLater();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	*	Hook: ProcessPageEdit::buildForm&lt;br /&gt;
	*&lt;br /&gt;
	*	add Publish Later button to edit page if not yet published&lt;br /&gt;
	*/&lt;br /&gt;
	public function ___editForm(HookEvent $form) {&lt;br /&gt;
&lt;br /&gt;
		// get the InputFieldForm object from the event (return value of buildForm())&lt;br /&gt;
		$form = $form-&amp;gt;return;&lt;br /&gt;
&lt;br /&gt;
		$page = $this-&amp;gt;pages-&amp;gt;get($this-&amp;gt;input-&amp;gt;get-&amp;gt;id);&lt;br /&gt;
		$check = $page-&amp;gt;get($this-&amp;gt;checkboxName);&lt;br /&gt;
&lt;br /&gt;
		// check if publish button available and therfore unpublished&lt;br /&gt;
		$target = $form-&amp;gt;get(&amp;#039;submit_publish&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		if($target &amp;amp;&amp;amp; $check == false){&lt;br /&gt;
&lt;br /&gt;
			// get InputfieldText module&lt;br /&gt;
			$submit2 = $this-&amp;gt;modules-&amp;gt;get(&amp;#039;InputfieldSubmit&amp;#039;);&lt;br /&gt;
			$submit2-&amp;gt;attr(&amp;#039;name&amp;#039;, $this-&amp;gt;submitName);&lt;br /&gt;
			$submit2-&amp;gt;attr(&amp;#039;id&amp;#039;, &amp;#039;publish_later&amp;#039;);&lt;br /&gt;
			$submit2-&amp;gt;attr(&amp;#039;class&amp;#039;, &amp;#039;ui-button ui-widget ui-corner-all head_button_clone ui-state-default ui-priority-secondary&amp;#039;);&lt;br /&gt;
			$submit2-&amp;gt;attr(&amp;#039;value&amp;#039;, &amp;#039;Publish Later&amp;#039;); // Button: save unpublished&lt;br /&gt;
&lt;br /&gt;
			// get form element save and place before&lt;br /&gt;
			$target = $form-&amp;gt;get(&amp;#039;submit_save&amp;#039;);&lt;br /&gt;
			$form-&amp;gt;insertBefore($submit2, $target);&lt;br /&gt;
&lt;br /&gt;
			$form-&amp;gt;return = $form;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function ___hookPageListActions(HookEvent $event) {&lt;br /&gt;
&lt;br /&gt;
		// get current page&lt;br /&gt;
		$page = $event-&amp;gt;arguments[0];&lt;br /&gt;
&lt;br /&gt;
		// check to see if page is published&lt;br /&gt;
		$pagePub = $page-&amp;gt;is(Page::statusUnpublished);&lt;br /&gt;
&lt;br /&gt;
		// check to see if page template has deffered field&lt;br /&gt;
		$pageHasDefferField = $page-&amp;gt;get($this-&amp;gt;fieldName);&lt;br /&gt;
&lt;br /&gt;
		$actions = array();&lt;br /&gt;
&lt;br /&gt;
		// don&amp;#039;t get homepage or pages that are already published or are being deffered for publish&lt;br /&gt;
		if($page-&amp;gt;id &amp;gt; 1 &amp;amp;&amp;amp; $pagePub == &amp;quot;published&amp;quot; &amp;amp;&amp;amp; !is_null($pageHasDefferField) &amp;amp;&amp;amp; $page-&amp;gt;get($this-&amp;gt;checkboxName) == false) {&lt;br /&gt;
&lt;br /&gt;
			$actions[&amp;#039;publish_later&amp;#039;] = array(&lt;br /&gt;
				&amp;#039;cn&amp;#039;   =&amp;gt; &amp;#039;PublishLater&amp;#039;,&lt;br /&gt;
				&amp;#039;name&amp;#039; =&amp;gt; &amp;#039;pub later&amp;#039;,&lt;br /&gt;
				&amp;#039;url&amp;#039;  =&amp;gt; &amp;quot;{$this-&amp;gt;adminUrl}?{$this-&amp;gt;listPageName}=1&amp;amp;id={$page-&amp;gt;id}&amp;quot;,&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		if(count($actions)) $event-&amp;gt;return = $actions + $event-&amp;gt;return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* Publish Page on cron job&lt;br /&gt;
	*&lt;br /&gt;
	* Gets deffered page and publishes&lt;br /&gt;
	*/&lt;br /&gt;
	public function ___publish($page) {&lt;br /&gt;
		$page-&amp;gt;removeStatus(Page::statusUnpublished);&lt;br /&gt;
		$page-&amp;gt;removeStatus(Page::statusHidden);&lt;br /&gt;
		$page-&amp;gt;Save();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* Main publish later function&lt;br /&gt;
	*&lt;br /&gt;
	* Gets deffered page and sets fields to be checked be lazy cron&lt;br /&gt;
	*/&lt;br /&gt;
	private function ___publishLater() {&lt;br /&gt;
&lt;br /&gt;
		// get page&lt;br /&gt;
		$page = $this-&amp;gt;pages-&amp;gt;get($this-&amp;gt;pageID);&lt;br /&gt;
&lt;br /&gt;
		// set output formatting to false&lt;br /&gt;
		$page-&amp;gt;of(false);&lt;br /&gt;
&lt;br /&gt;
		//  set field time to settings default time and checkbox to true&lt;br /&gt;
		$page-&amp;gt;set($this-&amp;gt;checkboxName, true);&lt;br /&gt;
		$page-&amp;gt;set($this-&amp;gt;fieldName, $this-&amp;gt;defaultTime);&lt;br /&gt;
&lt;br /&gt;
		// save page&lt;br /&gt;
		$page-&amp;gt;save();&lt;br /&gt;
		$page-&amp;gt;of(true);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* Lazy Cron hook function&lt;br /&gt;
	*&lt;br /&gt;
	* Triggers every [set time interval] and checks pages&lt;br /&gt;
	* Publishes page if time runout&lt;br /&gt;
	*&lt;br /&gt;
	* Adds publish page log&lt;br /&gt;
	*/&lt;br /&gt;
	public function ___publishDefferedPages(HookEvent $e){&lt;br /&gt;
&lt;br /&gt;
		// seconds since last lazycron&lt;br /&gt;
		$seconds = $e-&amp;gt;arguments[0];&lt;br /&gt;
&lt;br /&gt;
		// find all pages with deffered field&lt;br /&gt;
		$defferedPages = $this-&amp;gt;pages-&amp;gt;find(&amp;quot;{$this-&amp;gt;checkboxName}=1,include=unpublished&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// for each page decrease time for deffered field&lt;br /&gt;
		foreach ($defferedPages as $page) {&lt;br /&gt;
&lt;br /&gt;
			// get current page time&lt;br /&gt;
			$timeTillPublish = $page-&amp;gt;get($this-&amp;gt;fieldName);&lt;br /&gt;
&lt;br /&gt;
			// set time to time minus time past&lt;br /&gt;
			$timeLeft = $timeTillPublish - $seconds;&lt;br /&gt;
&lt;br /&gt;
			// if time passed 0 or less then publish page&lt;br /&gt;
			$page-&amp;gt;of(false);&lt;br /&gt;
			if($timeLeft &amp;lt;= 0){&lt;br /&gt;
				// remove flags and save&lt;br /&gt;
				$this-&amp;gt;publish($page);&lt;br /&gt;
&lt;br /&gt;
				$page-&amp;gt;set($this-&amp;gt;fieldName, 0);&lt;br /&gt;
				$page-&amp;gt;set($this-&amp;gt;checkboxName, 0);&lt;br /&gt;
&lt;br /&gt;
				// log a page has been published&lt;br /&gt;
				$log = wire(&amp;#039;log&amp;#039;);&lt;br /&gt;
				$log-&amp;gt;message(&amp;#039;CRON:&amp;#039;. $seconds .&amp;#039; Pages: &amp;#039;. $page-&amp;gt;name .&amp;#039; published&amp;#039;);&lt;br /&gt;
			}else{&lt;br /&gt;
				$page-&amp;gt;set($this-&amp;gt;fieldName, $timeLeft);&lt;br /&gt;
			}&lt;br /&gt;
			// save page time&lt;br /&gt;
			$page-&amp;gt;Save();&lt;br /&gt;
			$page-&amp;gt;of(true);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* Install new module specific fields&lt;br /&gt;
	*/&lt;br /&gt;
	private function installFields(){&lt;br /&gt;
&lt;br /&gt;
		// install pub later checkbox field&lt;br /&gt;
		// find installed fields&lt;br /&gt;
		$f = $this-&amp;gt;fields-&amp;gt;get($this-&amp;gt;fieldName);&lt;br /&gt;
		if($f){&lt;br /&gt;
&lt;br /&gt;
			// if field already found then don&amp;#039;t try and make it&lt;br /&gt;
			$this-&amp;gt;message($this-&amp;gt;fieldName . &amp;#039; field found&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		}else{&lt;br /&gt;
&lt;br /&gt;
			// create new field object to store crontime&lt;br /&gt;
			$f = new Field();&lt;br /&gt;
			// get a field type&lt;br /&gt;
			$f-&amp;gt;type = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;FieldtypeInteger&amp;quot;);&lt;br /&gt;
			$f-&amp;gt;name = $this-&amp;gt;fieldName;&lt;br /&gt;
			$f-&amp;gt;label = &amp;#039;Publish Time Left&amp;#039;;&lt;br /&gt;
			$f-&amp;gt;defaultValue = $this-&amp;gt;defaultTime;&lt;br /&gt;
			$f-&amp;gt;icon = &amp;#039;clock-o&amp;#039;;&lt;br /&gt;
			$f-&amp;gt;columnWidth = 50;&lt;br /&gt;
			$f-&amp;gt;collapsed = 1;&lt;br /&gt;
			$f-&amp;gt;flags = 4;&lt;br /&gt;
&lt;br /&gt;
			$f-&amp;gt;save(); // save the field&lt;br /&gt;
&lt;br /&gt;
			// create new field object to store whether to publish or not&lt;br /&gt;
			$f = new Field();&lt;br /&gt;
			// get a field type&lt;br /&gt;
			$f-&amp;gt;type = $this-&amp;gt;modules-&amp;gt;get(&amp;quot;FieldtypeCheckbox&amp;quot;);&lt;br /&gt;
			$f-&amp;gt;name = $this-&amp;gt;checkboxName;&lt;br /&gt;
			$f-&amp;gt;label = &amp;#039;Publish Page later&amp;#039;;&lt;br /&gt;
			$f-&amp;gt;defaultValue = false;&lt;br /&gt;
			$f-&amp;gt;columnWidth = 50;&lt;br /&gt;
			$f-&amp;gt;icon = &amp;#039;clock-o&amp;#039;;&lt;br /&gt;
			$f-&amp;gt;collapsed = 1;&lt;br /&gt;
			$f-&amp;gt;flags = 4;&lt;br /&gt;
&lt;br /&gt;
			$f-&amp;gt;save(); // save the field&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	* Uninstall module specific fields&lt;br /&gt;
	*/&lt;br /&gt;
	private function uninstallFields(){&lt;br /&gt;
&lt;br /&gt;
		// find installed fields&lt;br /&gt;
		$fInt = $this-&amp;gt;fields-&amp;gt;get($this-&amp;gt;fieldName);&lt;br /&gt;
		$fCheck = $this-&amp;gt;fields-&amp;gt;get($this-&amp;gt;checkboxName);&lt;br /&gt;
&lt;br /&gt;
		if($fInt &amp;amp;&amp;amp; $fCheck){&lt;br /&gt;
			$fieldIntUsed = $fInt-&amp;gt;numFieldgroups();&lt;br /&gt;
			$fieldCheckUsed = $fCheck-&amp;gt;numFieldgroups();&lt;br /&gt;
&lt;br /&gt;
			if($fieldIntUsed){&lt;br /&gt;
				// field in use by template&lt;br /&gt;
				$this-&amp;gt;message(&amp;#039;Unable to uninstall field &amp;#039;.$fInt-&amp;gt;name);&lt;br /&gt;
			}else{&lt;br /&gt;
				// delete installed fields&lt;br /&gt;
				$this-&amp;gt;fields-&amp;gt;delete($fInt);&lt;br /&gt;
				$this-&amp;gt;fields-&amp;gt;save;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if($fieldCheckUsed){&lt;br /&gt;
				// field in use by template&lt;br /&gt;
				$this-&amp;gt;message(&amp;#039;Unable to uninstall field &amp;#039;.$fCheck-&amp;gt;name);&lt;br /&gt;
			}else{&lt;br /&gt;
				// delete installed fields&lt;br /&gt;
				$this-&amp;gt;fields-&amp;gt;delete($fCheck);&lt;br /&gt;
				$this-&amp;gt;fields-&amp;gt;save;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inputfield / Fieldtype ===&lt;br /&gt;
[[ProcessWire - Fieldtype erstellen (Module)]]&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsdatei statt getModuleInfo ===&lt;br /&gt;
Bei größeren Konfigruation (z.B. Admin Page Navigation) sinnvoll.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * ProcessHello.info.php&lt;br /&gt;
 * &lt;br /&gt;
 * Return information about this module.&lt;br /&gt;
 *&lt;br /&gt;
 * If preferred, you can use a getModuleInfo() method in your module file, &lt;br /&gt;
 * or you can use a ModuleName.info.json file (if you prefer JSON definition). &lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
$info = array(&lt;br /&gt;
	// Your module&amp;#039;s title&lt;br /&gt;
	&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Hello: Process Module Example&amp;#039;, &lt;br /&gt;
	// A 1 sentence description of what your module does&lt;br /&gt;
	&amp;#039;summary&amp;#039; =&amp;gt; &amp;#039;A starting point module skeleton from which to build your own Process module.&amp;#039;, &lt;br /&gt;
	// Module version number: use 1 for 0.0.1 or 100 for 1.0.0, and so on&lt;br /&gt;
	&amp;#039;version&amp;#039; =&amp;gt; 1, &lt;br /&gt;
	// Name of person who created this module (change to your name)&lt;br /&gt;
	&amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Ryan Cramer&amp;#039;, &lt;br /&gt;
	// Icon to accompany this module (optional), uses font-awesome icon names, minus the &amp;quot;fa-&amp;quot; part&lt;br /&gt;
	&amp;#039;icon&amp;#039; =&amp;gt; &amp;#039;thumbs-up&amp;#039;, &lt;br /&gt;
	// URL to more info: change to your full modules.processwire.com URL (if available), or something else if you prefer&lt;br /&gt;
	&amp;#039;href&amp;#039; =&amp;gt; &amp;#039;http://modules.processwire.com/&amp;#039;, &lt;br /&gt;
	// name of permission required of users to execute this Process (optional)&lt;br /&gt;
	&amp;#039;permission&amp;#039; =&amp;gt; &amp;#039;helloworld&amp;#039;, &lt;br /&gt;
	// permissions that you want automatically installed/uninstalled with this module (name =&amp;gt; description)&lt;br /&gt;
	&amp;#039;permissions&amp;#039; =&amp;gt; array(&lt;br /&gt;
		&amp;#039;helloworld&amp;#039; =&amp;gt; &amp;#039;Run the HelloWorld module&amp;#039;&lt;br /&gt;
	), &lt;br /&gt;
	&lt;br /&gt;
	// page that you want created to execute this module&lt;br /&gt;
	&amp;#039;page&amp;#039; =&amp;gt; array(&lt;br /&gt;
		&amp;#039;name&amp;#039; =&amp;gt; &amp;#039;helloworld&amp;#039;,&lt;br /&gt;
		&amp;#039;parent&amp;#039; =&amp;gt; &amp;#039;setup&amp;#039;, &lt;br /&gt;
		&amp;#039;title&amp;#039; =&amp;gt; &amp;#039;Hello World&amp;#039;&lt;br /&gt;
	),&lt;br /&gt;
	// optional extra navigation that appears in admin&lt;br /&gt;
	// if you change this, you&amp;#039;ll need to a Modules &amp;gt; Refresh to see changes&lt;br /&gt;
	&amp;#039;nav&amp;#039; =&amp;gt; array(&lt;br /&gt;
		array(&lt;br /&gt;
			&amp;#039;url&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &lt;br /&gt;
			&amp;#039;label&amp;#039; =&amp;gt; &amp;#039;Hello&amp;#039;, &lt;br /&gt;
			&amp;#039;icon&amp;#039; =&amp;gt; &amp;#039;smile-o&amp;#039;, &lt;br /&gt;
		), &lt;br /&gt;
		array(&lt;br /&gt;
			&amp;#039;url&amp;#039; =&amp;gt; &amp;#039;something/&amp;#039;, &lt;br /&gt;
			&amp;#039;label&amp;#039; =&amp;gt; &amp;#039;Something&amp;#039;, &lt;br /&gt;
			&amp;#039;icon&amp;#039; =&amp;gt; &amp;#039;beer&amp;#039;, &lt;br /&gt;
		),&lt;br /&gt;
	)&lt;br /&gt;
	// for more options that you may specify here, see the file: /wire/core/Process.php&lt;br /&gt;
	// and the file: /wire/core/Module.php&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Interessantes - Read On ==&lt;br /&gt;
 https://processwire.com/talk/topic/24067-solved-settings-fields-that-dont-save-to-database/&lt;br /&gt;
 https://processwire.com/talk/topic/24075-solved-create-field-and-add-to-template/&lt;br /&gt;
 [[ProcessWire Modules - common functions]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26208</id>
		<title>E-Mail Probleme beheben</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26208"/>
		<updated>2022-09-08T13:01:26Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 All-inkl - Newsletter Anbieter einrichten&lt;br /&gt;
 [[TYPO3 - E-Mail]]&lt;br /&gt;
 https://it-stack.de/30/05/2018/anti-spam-basics-fuer-versender-spf-dkim-dmarc-mehr/&lt;br /&gt;
&lt;br /&gt;
== Testtools ==&lt;br /&gt;
 https://mxtoolbox.com/SuperTool.aspx&lt;br /&gt;
&lt;br /&gt;
== Spam Codes ==&lt;br /&gt;
 https://www.futurequest.net/docs/SA/ (Spam Assasin Liste mit Scorewerten)&lt;br /&gt;
Codes die den Spam Level verändern können&lt;br /&gt;
 FREEMAIL_FORGED_REPLYTO -&amp;gt; Freemail in Reply-To, aber nicht in From&lt;br /&gt;
 HEADER_FROM_DIFFERENT_DOMAINS&lt;br /&gt;
 HTML_MESSAGE&lt;br /&gt;
 RCVD_IN_DNSWL_NONE&lt;br /&gt;
 RDNS_NONE - hoher Score: Delivered to internal network by a host with no rDNS&lt;br /&gt;
 SPF_HELO_NONE - kein spf eintrag nicht so schlimm&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
Make sure you have SPF, DMARC, DKIM, and sign up for their JMRP and SDNS they will tell you.&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/kas/tools/dns-werkzeuge/spf_482.html&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SPF, Sender Policy Framework&amp;#039;&amp;#039;&amp;#039;, ist ein Standard zur Überprüfung des Absenders einer E-Mail und &amp;#039;&amp;#039;&amp;#039;vermutlich der wichtigste Anti-Spam-Indikator&amp;#039;&amp;#039;&amp;#039;. SPF ist ein TXT-Eintrag im DNS der Absender-Domain und leicht zu setzen. &lt;br /&gt;
&lt;br /&gt;
Etwas mehr Wissen erfordert unter Umständen das &amp;#039;&amp;#039;&amp;#039;Generieren des TXT Eintrags&amp;#039;&amp;#039;&amp;#039;. Hier muss beachtet werden, welche Mailserver und Maildienste für das Versenden der Mails benutzt werden. Wenn ich den Mailserver meines Webhosters nutze, jedoch Mails über die Googlemail Weboberfläche schicke (E-Mail über SMTP eingebunden), muss ich das im SPF-Eintrag beachten. Hierzu gibt es von fast allen Anbietern entsprechende Infos/Hilfeseiten, etwas googeln hilft hier schnell.&lt;br /&gt;
&lt;br /&gt;
Ein beispielhafter SPF-Eintrag, der Google als Relay inkludiert, könnte so aussehen:&lt;br /&gt;
 v=spf1 a mx include:_spf.google.com ~all&lt;br /&gt;
* Kein ptr im SPF eintragen, wenn MX gesetzt ist, auch wenn das viele Generatoren immernoch machen. &lt;br /&gt;
* Überprüfung mit SPF Check der MXToolBox. Weitere Infos findet ihr bestimmt in der Hilfe eures Maildienstleisters/Hosters mit der Suche nach „SPF“.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
Erklärungen zur Syntax von SPF:&lt;br /&gt;
&lt;br /&gt;
Am Anfang des SPF Records wird mit v= die SPF-Version festgelegt. Bislang gibt es nur spf1. Danach werden üblicherweise Direktiven angegeben. Diese bestehen aus einem optionalen Qualifikator und einem Mechanismus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Qualifikatoren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 + Pass - autorisierte Sender, daher Annahme der E-Mail; Standard, wenn kein Qualifikator explizit angegeben wird&lt;br /&gt;
 - Fail - nicht autorisierte Sender, daher Abweisung der E-Mail&lt;br /&gt;
 ~ SoftFail - nicht autorisierte Sender, E-Mail wird trotzdem angenommen, kann jedoch z.b. als Spam markiert werden&lt;br /&gt;
 ? Neutral - Sender, über deren Gültigkeit nichts gesagt werden kann und die akzeptiert werden müssen, daher Annahme der E-Mail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gängige Mechanismen (=Befehle):&lt;br /&gt;
&lt;br /&gt;
 a               A-/AAAA-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 mx              MX-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ptr             PTR-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ip4             IPv4-Adresse oder IPv4-Subnetz&lt;br /&gt;
 ip6             IPv6-Adresse oder IPv6-Subnetz&lt;br /&gt;
 include         SPF-Abfrage der angegebenen Domain, diese sollte einen gültigen SPF-Record besitzen&lt;br /&gt;
 all             immer&lt;br /&gt;
&lt;br /&gt;
Sofern für einen Mechanismus ein Argument übergeben werden soll, dann trennen Sie dies mit einem Doppelpunkt.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Beispiel für einen sehr gängigen Eintrag&lt;br /&gt;
 v=spf1 mx a -all&lt;br /&gt;
Dieser bedeutet, dass für alle E-Mails, die von Sendern kommen, die sich nicht aus dem A- bzw. MX-Record des DNS ergeben, ein negatives Ergebnis zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
 v=spf1 a:mail.example.org -all&lt;br /&gt;
Mails erlaubt, wenn sie aus den DNS Einträgen der Hauptdomain hervorgehen (-all) oder wenn es vom Server mit dem A-Record zu mail.example.org gehört.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Server im SPF Eintrag ==&lt;br /&gt;
Möchten Sie die &amp;#039;&amp;#039;&amp;#039;IP eines E-Mail-Server&amp;#039;&amp;#039;&amp;#039; in einen SPF-Eintrag aufnehmen, geben Sie vor dem Argument ~all die IP-Adresse des Servers ein. Verwenden Sie das &amp;#039;&amp;#039;&amp;#039;Format ip4:Adresse oder ip6:Adresse&amp;#039;&amp;#039;&amp;#039;, wie in diesem Beispiel:&lt;br /&gt;
 v=spf1 ip4:172.16.254.1 include:_spf.google.com ~all&lt;br /&gt;
Soll die &amp;#039;&amp;#039;&amp;#039;Domain eines E-Mail-Servers&amp;#039;&amp;#039;&amp;#039; hinzugefügt werden, verwenden Sie für jede Domain eine &amp;quot;&amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;&amp;quot;-Anweisung. Beispiel:&lt;br /&gt;
 v=spf1 include:serverdomain.com include:_spf.google.com ~all&lt;br /&gt;
&lt;br /&gt;
=== SPF-Beispiele ===&lt;br /&gt;
 https://stackoverflow.com/questions/14261214/too-many-dns-lookups-in-an-spf-record?rq=1&lt;br /&gt;
==== Amazon SES ====&lt;br /&gt;
Here are the TXT records we currently use successfully for Amazon SES as per Authenticating Your Email Address and (it&amp;#039;s indeed unfortunate that their documentation doesn&amp;#039;t address the quoting needs):&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;v=spf1 include:amazonses.com ~all&amp;quot;&lt;br /&gt;
 &amp;quot;spf2.0/pra include:amazonses.com ~all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== DKIM ==&lt;br /&gt;
DKIM Signiert die Mails, so kann der Empfänger kontrollieren, ob der Inhalt unverändert ankommt. Also erstmal kein Spam Tool.&lt;br /&gt;
&lt;br /&gt;
DKIM, DomainKeys Identified Mail (Standard, Wikipedia), ist wie SPF ebenfalls ein Protokoll zur Überprüfung von eingehenden Mails und deren unverändertem Inhalt.&lt;br /&gt;
DKIM nutzt zur Überprüfung eine asymmetrische Verschlüsselungstechnik mit zwei Schlüsseln – einem privaten Schlüssel, der Mails unsichtbar angehängt wird und einem öffentlichen Schlüssel, abgelegt im DNS des Absenders. &lt;br /&gt;
&lt;br /&gt;
Somit kann der Empfänger-Mailserver die Schlüssel aus dem Absender DNS und der Mail-Signatur gegeneinander prüfen und validieren. Das Hinzufügen des privaten Schlüssels in den Mailserver, damit dieser unsichtbar alle ausgehenden Mails damit signiert, erfordert eine fortgeschrittene Anpassung des Mailservers bzw. Konfiguration des Mailers und übersteigt den Rahmen dieses Artikels. Für GMail-Nutzer hilft die Google DKIM Step-by-Step-Anleitung, ansonsten wieder beim Anbieter/Hoster in der Hilfe schauen bzw. Support fragen.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil besteht aus einem TXT DNS Record, der zuvor generiert werden muss. Benötigt wird dafür die Domain und ein „Selektor“; eine beliebige Zeichenkette, z.B. „meindkim1“. Der Record sollte immer mit v=DKIM1;k=rsa;p= anfangen! Selbst wenn die Generatoren gerne einen der Parameter v oder k weglassen, oder diese als optional angeben, sollten beide gesetzt sein. Info: Beide Überprüfungs-Tools (MxToolBox und GSuite MX-Check) bestätigen einen validen DKIM übrigens nur mit Parametern v UND k, Warnungen falls einer fehlt. Die Überprüfung von DKIM erfordert dann ebenfalls Domain und Selektor und sollte anschließend positiv ausfallen.&lt;br /&gt;
&lt;br /&gt;
Aber Achtung: Ausschließlich den DKIM DNS Eintrag zu setzen, ohne die Mails zu signieren, hat keine weiteren positiven Auswirkungen (meistens aber auch keine negativen) und ist daher nicht zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
=== DKIM bei all-inkl aktivieren ===&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/providerwechsel/einrichtung/dns/dkim-bei-versand-ueber-unsere-mailserver_541.html&lt;br /&gt;
* In den Domaineinstellungen DKIM aktivieren. &lt;br /&gt;
* Der passende DNS Eintrag wird automatisch ergänzt und sieht ungefähr so aus:&lt;br /&gt;
 Name: kas202005201235._domainkey.meineDomain.de&lt;br /&gt;
 Typ: TXT&lt;br /&gt;
 Eintrag: v=DKIM1; k=rsa; p=MIIB[MEHR SCHLÜSSELINHALT]QAB&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
 https://elasticemail.com/dmarc (Generator für DMARC Einträge)&lt;br /&gt;
&lt;br /&gt;
DMARC, Domain-based Message Authentication, Reporting, and Conformance (Standard, Wikipedia)&lt;br /&gt;
&lt;br /&gt;
Technologie zur Erweiterung von SPF und DKIM. Geliefert werden zusätzliche Informationen, wie der Empfängerserver mit geprüften Mails umgehen soll sowie die Möglichkeit von Reports der Überprüfungen. &lt;br /&gt;
&lt;br /&gt;
Auch hier ein DNS TXT Eintrag, der die Infos liefert. Zwei grundlegende Fragen müsst ihr euch stellen:&lt;br /&gt;
# Wie sollen Mails behandelt werden, deren SPF/DKIM-Überprüfung fehlschlägt? Ignorieren / Spam / Abweisen.&lt;br /&gt;
# Sollen Daten und fehlgeschlagene Überprüfungen als Reports verschickt werden und an welche Mail-Adresse?&lt;br /&gt;
&lt;br /&gt;
Solltet ihr mit „Ignorieren“ dem Empfangsserver kein Verhalten vorschreiben wollen und auch keinerlei Reporting wünschen (v=DMARC1;p=none;), erfüllt DMARC keinen Zweck und hat auch keine weiteren Effekte auf den Mailempfang, kann also ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
Restriktiveres Verhalten oder Reporting gewünscht? Dann wird einer der vielen existierenden Generatoren aus den gewählten Optionen einen einfachen bis recht komplexen TXT Record erstellen:&lt;br /&gt;
 v=DMARC1; p=none; rua=mailto:admin@it-stack.de; ruf=mailto:admin@it-stack.de; fo=1;&lt;br /&gt;
Dieser Eintrag schickt Reportings an mich, wenn SPF oder DKIM fehlschlägt sowie generelle Reports, der Mailserver soll die Fehlschläge jedoch wie gewohnt behandeln, ich gebe kein strikteres Vorgehen vor.&lt;br /&gt;
&lt;br /&gt;
== Blacklists ==&lt;br /&gt;
Es gibt eine Vielzahl von professionell betriebenen Anti-Spam-Listen, also Blacklists, die von Mailservern zur weiteren Überprüfung abgefragt werden können. Ob mein Mailserver auf einer Blacklist steht, kann ich beispielsweise mit der MxToolBox Blacklist Suche herausfinden. Gebt hier eure Domain ein und eine Auswertung von über 100 Blackslists wird eventuelle Funde aufzeigen. Solltet euer Mailserver nicht die IP eurer Domain teilen oder weitere in das Mailing involvierten MX-Server-IPs bekannt sein, diese am besten auch noch testen.&lt;br /&gt;
Eure Domain/IP ist in einer Blacklist gefunden worden? Das ist unpraktisch, kann aber mal passieren. Geblacklistet werden für gewöhnlich ganze Server. Auf einem Shared Server, wie das bei Webhosting fast immer der Fall ist, sind, je nach Vertrag, 20 bis 100 weitere Kunden untergebracht. Die Chance, dass ein anderer Kunde für das Blacklisting verantwortlich ist, ist hoch.&lt;br /&gt;
Was tun? Auf der Betreiberseite der Blacklist gibt es meistens Suchen/Informationsportale, in denen Blacklist-Kandidaten, teilweise mit mehr Details und Begründung, gesucht werden können. Ich empfehle zwei Recherchen: Suche nach der Domain und nach der/den IPs.&lt;br /&gt;
So kann es sein, dass die IP-Adresse des Servers in mehreren Einträgen gefunden wird (Reportfunde bei Spamhaus ZEN: Link1, Link2, in welchen wiederum eure Domain nicht erwähnt wird), für die Domain jedoch kein Eintrag vorhanden ist. Das sind weitere Hinweise darauf, dass nicht ihr, sondern ein anderer Kunde des Servers Schuld hat.&lt;br /&gt;
Unabhängig von diesen Recherchen könnt ihr vermutlich wenig gegen das Blacklisting tun. Manche Betreiber bieten Unblock Formulare an, andere nicht. Informiert auf jeden Fall euren Webhoster/Mailing-Anbieter mit allen herausgefundenen Informationen über das Blacklisting – dieser hat für gewöhnlich andere Optionen und kann direkt selbst in die Behandlung der Problemursache, also gegen entsprechende Kunden, vorgehen.&lt;br /&gt;
&lt;br /&gt;
== User Trust ==&lt;br /&gt;
Desweiteren hilft es, sich zusätzlich Trust über den User/Empfänger zu holen – beispielsweise durch das Hinzufügen eurer Absenderadresse zu den Kontakten, das Markieren der Nachrichten als „Wichtig“ oder Versehen mit Sternchen/Markern (je nach Client heißt das anders), den Absender „Nie als Spam markieren“ (ebenfalls je Client anders) und mehr. Alles, was man mit einer Mail oder einem Absender bei dem jeweiligen Anbieter des Empfängers tun kann, dass letztlich einen positiven Effekt hat. Die Anbieter speichern solche Informationen (wie oft wurde eine Mail mit Inhalt X positiv behandelt, wie oft der Absender usw.) und behandeln Mails dieses Absenders zukünftig besser. Diese Maßnahme kann man bis zu einer gewissen Anzahl mit den eigenen Mitarbeitern starten – Mails an ihre private Mailadresse schicken, bestenfalls bei unterschiedlichen Anbietern, und die Mails von ihnen „positiv behandeln“ lassen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Bootable_USB_Stick_erzeugen&amp;diff=26207</id>
		<title>Mac - Bootable USB Stick erzeugen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Bootable_USB_Stick_erzeugen&amp;diff=26207"/>
		<updated>2022-09-07T16:35:30Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einen bootable USB Stick benötigt man z.b. zur Installation von Betriebssystemen wie Linux. Aber auch Windows 10 oder 11 ist möglich.&lt;br /&gt;
Mit dem Mac Terminal hat man alle benötigten Tools. &lt;br /&gt;
&lt;br /&gt;
== Beispiel Ubuntu ISO auf bootable USB Stick: ==&lt;br /&gt;
Quelle (Zugriff 2022-09-07) &lt;br /&gt;
 https://www.cyberciti.biz/faq/creating-a-bootable-ubuntu-usb-stick-on-a-debian-linux/&lt;br /&gt;
&lt;br /&gt;
=== Step 1 – Download Ubuntu .iso image ===&lt;br /&gt;
&lt;br /&gt;
Visit the Ubuntu.com and grab the desktop or server CD/DVD iso image.&lt;br /&gt;
=== Step 2 – Find your usb device name on Linux ===&lt;br /&gt;
&lt;br /&gt;
Insert your USB stick and type the following df command to see if it is mounted automatically on a Debian or any other Linux desktop system:&lt;br /&gt;
&lt;br /&gt;
 df&lt;br /&gt;
&lt;br /&gt;
Sample outputs (see /media/vivek/data that is my USB):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Filesystem            1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
udev                   16432268       0  16432268   0% /dev&lt;br /&gt;
tmpfs                   3288884   26244   3262640   1% /run&lt;br /&gt;
/dev/mapper/md0_crypt 491076512 9641092 456420380   3% /&lt;br /&gt;
tmpfs                  16444408  105472  16338936   1% /dev/shm&lt;br /&gt;
tmpfs                      5120       4      5116   1% /run/lock&lt;br /&gt;
tmpfs                  16444408       0  16444408   0% /sys/fs/cgroup&lt;br /&gt;
/dev/sdc1             122546800  124876 116153868   1% /boot&lt;br /&gt;
tmpfs                   3288880      24   3288856   1% /run/user/119&lt;br /&gt;
tmpfs                   3288880      72   3288808   1% /run/user/1000&lt;br /&gt;
/dev/sdd1               1467360 1467360         0 100% /media/vivek/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can try the &amp;#039;&amp;#039;lsblk&amp;#039;&amp;#039; command or dmesg command as well to list your usb devices:&lt;br /&gt;
 lsblk&lt;br /&gt;
 dmesg&lt;br /&gt;
&lt;br /&gt;
You need to &amp;#039;&amp;#039;&amp;#039;unmount&amp;#039;&amp;#039;&amp;#039; /media/vivek/data:&lt;br /&gt;
 sudo umount /media/vivek/data&lt;br /&gt;
&lt;br /&gt;
Or try:&lt;br /&gt;
 sudo umount /dev/sdd1&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Another option&amp;#039;&amp;#039;&amp;#039; is to run &amp;#039;&amp;#039;dmesg&amp;#039;&amp;#039; command to &amp;#039;&amp;#039;&amp;#039;find out usb device name:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg&lt;br /&gt;
&lt;br /&gt;
Sample outputs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[461339.310378] usb 2-1.7: new high-speed USB device number 12 using ehci-pci&lt;br /&gt;
[461339.420453] usb 2-1.7: New USB device found, idVendor=0781, idProduct=558a&lt;br /&gt;
[461339.420457] usb 2-1.7: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[461339.420460] usb 2-1.7: Product: Ultra&lt;br /&gt;
[461339.420461] usb 2-1.7: Manufacturer: SanDisk&lt;br /&gt;
[461339.420463] usb 2-1.7: SerialNumber: FooBarNixCraftSerialNumber&lt;br /&gt;
[461339.421010] usb-storage 2-1.7:1.0: USB Mass Storage device detected&lt;br /&gt;
[461339.421457] scsi host6: usb-storage 2-1.7:1.0&lt;br /&gt;
[461340.431909] scsi 6:0:0:0: Direct-Access     SanDisk  Ultra            1.00 PQ: 0 ANSI: 6&lt;br /&gt;
[461340.432886] sd 6:0:0:0: Attached scsi generic sg4 type 0&lt;br /&gt;
[461340.433448] sd 6:0:0:0: [sdd] 121307136 512-byte logical blocks: (62.1 GB/57.8 GiB)&lt;br /&gt;
[461340.435434] sd 6:0:0:0: [sdd] Write Protect is off&lt;br /&gt;
[461340.435438] sd 6:0:0:0: [sdd] Mode Sense: 43 00 00 00&lt;br /&gt;
[461340.436405] sd 6:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn&amp;#039;t support DPO or FUA&lt;br /&gt;
[461340.449612]  sdd: sdd1 sdd2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is clear that /dev/sdd is my usb stick device name. &amp;#039;&amp;#039;&amp;#039;You can also use the lsblk command.&amp;#039;&amp;#039;&amp;#039; For example:&lt;br /&gt;
&lt;br /&gt;
 lsblk&lt;br /&gt;
=== Step 3 – Verify Ubuntu .iso CD/DVD image file ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TIP:&amp;#039;&amp;#039;&amp;#039; You can find DVD iso image checksum such as 443511f6bf12402c12503733059269a2e10dec602916c0a75263e5d990f6bb93 on Ubuntu.com download page itself.&lt;br /&gt;
&lt;br /&gt;
However, I like to verify my download. For example:&lt;br /&gt;
 ls -l ubuntu-20.04.1-live-server-amd64.iso&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;443511f6bf12402c12503733059269a2e10dec602916c0a75263e5d990f6bb93 *ubuntu-20.04.1-live-server-amd64.iso&amp;quot; \&lt;br /&gt;
 | shasum -a 256 --check&lt;br /&gt;
&lt;br /&gt;
You should get the following output:&lt;br /&gt;
 ubuntu-20.04.1-live-server-amd64.iso: OK&lt;br /&gt;
&lt;br /&gt;
Once verified you can write it to the USB device.&lt;br /&gt;
=== Step 4 – Create a bootable USB stick on Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warning: Be careful with the USB stick/pen/disk names. Wrong names always result in data loss. Make sure you type the correct name.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Type the following dd command to create a bootable USB image from a .ISO file:&lt;br /&gt;
 sudo dd if=artful-desktop-amd64.iso of=/dev/sdd bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Another example:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=ubuntu-20.04.1-live-server-amd64.iso of=/dev/sda bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
The dd command will write process data to a usb stick (/dev/sdd or /dev/sda)and a progress bar appears on screen.&lt;br /&gt;
Ubuntu to create a bootable Ubuntu USB flash drive from terminal&lt;br /&gt;
&lt;br /&gt;
In this example I am going to create a bootable flash drive for ubuntu-18.04.3-live-server-amd64.iso file as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=/isos/ubuntu-18.04.3-live-server-amd64.iso of=/dev/sdb bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Ubuntu iso bootable USB create using dd command on Linux&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Another example&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=/isos/ubuntu-19.04-live-server-amd64.iso of=/dev/sdb bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Here is what I see:&lt;br /&gt;
&lt;br /&gt;
 748+0 records in&lt;br /&gt;
 748+0 records out&lt;br /&gt;
 784334848 bytes (784 MB, 748 MiB) copied, 119.174 s, 6.6 MB/s&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Understanding the dd command options&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 dd : Start the dd command to write DVD/CD iso image.&lt;br /&gt;
 if=/iso/ubuntu.iso : Path to input file.&lt;br /&gt;
 of=/dev/sdd : Path to destination USB disk/stick.&lt;br /&gt;
 bs=1M : read and write up to BYTES bytes at a time. In this example, 1M at a time.&lt;br /&gt;
 status=progress : Display progress bar while writing image to the USB stick such as /dev/sdd. See “Linux dd Command Show Progress Copy Bar With Status” for more info.&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Install Ubuntu using newly created USB drive ===&lt;br /&gt;
&lt;br /&gt;
That’s all, folks! You now have Ubuntu on a USB stick, bootable and ready to install on your Laptop, Desktop or server based system.&lt;br /&gt;
Conclusion&lt;br /&gt;
&lt;br /&gt;
You learned how to create a bootable usb pen drive from downloaded Ubuntu desktop or server .ISO image. See Ubuntu download page.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Mac_-_Bootable_USB_Stick_erzeugen&amp;diff=26206</id>
		<title>Mac - Bootable USB Stick erzeugen</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Mac_-_Bootable_USB_Stick_erzeugen&amp;diff=26206"/>
		<updated>2022-09-07T16:35:05Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „Einen bootable USB Stick benötigt man z.b. zur Installation von Betriebssystemen wie Linux. Aber auch Windows 10 oder 11 ist möglich. Mit dem Mac Terminal ha…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einen bootable USB Stick benötigt man z.b. zur Installation von Betriebssystemen wie Linux. Aber auch Windows 10 oder 11 ist möglich.&lt;br /&gt;
Mit dem Mac Terminal hat man alle benötigten Tools. &lt;br /&gt;
&lt;br /&gt;
== Beispiel Ubuntu ISO auf bootable USB Stick: ==&lt;br /&gt;
Quelle (Zugriff 2022-09-07) &lt;br /&gt;
 https://www.cyberciti.biz/faq/creating-a-bootable-ubuntu-usb-stick-on-a-debian-linux/&lt;br /&gt;
&lt;br /&gt;
=== Step 1 – Download Ubuntu .iso image ===&lt;br /&gt;
&lt;br /&gt;
Visit the Ubuntu.com and grab the desktop or server CD/DVD iso image.&lt;br /&gt;
=== Step 2 – Find your usb device name on Linux ===&lt;br /&gt;
&lt;br /&gt;
Insert your USB stick and type the following df command to see if it is mounted automatically on a Debian or any other Linux desktop system:&lt;br /&gt;
&lt;br /&gt;
 df&lt;br /&gt;
&lt;br /&gt;
Sample outputs (see /media/vivek/data that is my USB):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Filesystem            1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
udev                   16432268       0  16432268   0% /dev&lt;br /&gt;
tmpfs                   3288884   26244   3262640   1% /run&lt;br /&gt;
/dev/mapper/md0_crypt 491076512 9641092 456420380   3% /&lt;br /&gt;
tmpfs                  16444408  105472  16338936   1% /dev/shm&lt;br /&gt;
tmpfs                      5120       4      5116   1% /run/lock&lt;br /&gt;
tmpfs                  16444408       0  16444408   0% /sys/fs/cgroup&lt;br /&gt;
/dev/sdc1             122546800  124876 116153868   1% /boot&lt;br /&gt;
tmpfs                   3288880      24   3288856   1% /run/user/119&lt;br /&gt;
tmpfs                   3288880      72   3288808   1% /run/user/1000&lt;br /&gt;
/dev/sdd1               1467360 1467360         0 100% /media/vivek/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can try the &amp;#039;&amp;#039;lsblk&amp;#039;&amp;#039; command or dmesg command as well to list your usb devices:&lt;br /&gt;
 lsblk&lt;br /&gt;
 dmesg&lt;br /&gt;
&lt;br /&gt;
You need to &amp;#039;&amp;#039;&amp;#039;unmount&amp;#039;&amp;#039;&amp;#039; /media/vivek/data:&lt;br /&gt;
 sudo umount /media/vivek/data&lt;br /&gt;
&lt;br /&gt;
Or try:&lt;br /&gt;
 sudo umount /dev/sdd1&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Another option&amp;#039;&amp;#039;&amp;#039; is to run &amp;#039;&amp;#039;dmesg&amp;#039;&amp;#039; command to &amp;#039;&amp;#039;&amp;#039;find out usb device name:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo dmesg&lt;br /&gt;
&lt;br /&gt;
Sample outputs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[461339.310378] usb 2-1.7: new high-speed USB device number 12 using ehci-pci&lt;br /&gt;
[461339.420453] usb 2-1.7: New USB device found, idVendor=0781, idProduct=558a&lt;br /&gt;
[461339.420457] usb 2-1.7: New USB device strings: Mfr=1, Product=2, SerialNumber=3&lt;br /&gt;
[461339.420460] usb 2-1.7: Product: Ultra&lt;br /&gt;
[461339.420461] usb 2-1.7: Manufacturer: SanDisk&lt;br /&gt;
[461339.420463] usb 2-1.7: SerialNumber: FooBarNixCraftSerialNumber&lt;br /&gt;
[461339.421010] usb-storage 2-1.7:1.0: USB Mass Storage device detected&lt;br /&gt;
[461339.421457] scsi host6: usb-storage 2-1.7:1.0&lt;br /&gt;
[461340.431909] scsi 6:0:0:0: Direct-Access     SanDisk  Ultra            1.00 PQ: 0 ANSI: 6&lt;br /&gt;
[461340.432886] sd 6:0:0:0: Attached scsi generic sg4 type 0&lt;br /&gt;
[461340.433448] sd 6:0:0:0: [sdd] 121307136 512-byte logical blocks: (62.1 GB/57.8 GiB)&lt;br /&gt;
[461340.435434] sd 6:0:0:0: [sdd] Write Protect is off&lt;br /&gt;
[461340.435438] sd 6:0:0:0: [sdd] Mode Sense: 43 00 00 00&lt;br /&gt;
[461340.436405] sd 6:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn&amp;#039;t support DPO or FUA&lt;br /&gt;
[461340.449612]  sdd: sdd1 sdd2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It is clear that /dev/sdd is my usb stick device name. &amp;#039;&amp;#039;&amp;#039;You can also use the lsblk command.&amp;#039;&amp;#039;&amp;#039; For example:&lt;br /&gt;
&lt;br /&gt;
 lsblk&lt;br /&gt;
=== Step 3 – Verify Ubuntu .iso CD/DVD image file ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;TIP:&amp;#039;&amp;#039;&amp;#039; You can find DVD iso image checksum such as 443511f6bf12402c12503733059269a2e10dec602916c0a75263e5d990f6bb93 on Ubuntu.com download page itself.&lt;br /&gt;
&lt;br /&gt;
However, I like to verify my download. For example:&lt;br /&gt;
 ls -l ubuntu-20.04.1-live-server-amd64.iso&lt;br /&gt;
 &lt;br /&gt;
 echo &amp;quot;443511f6bf12402c12503733059269a2e10dec602916c0a75263e5d990f6bb93 *ubuntu-20.04.1-live-server-amd64.iso&amp;quot; \&lt;br /&gt;
 | shasum -a 256 --check&lt;br /&gt;
&lt;br /&gt;
You should get the following output:&lt;br /&gt;
 ubuntu-20.04.1-live-server-amd64.iso: OK&lt;br /&gt;
&lt;br /&gt;
Once verified you can write it to the USB device.&lt;br /&gt;
=== &lt;br /&gt;
Step 4 – Create a bootable USB stick on Linux ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Warning: Be careful with the USB stick/pen/disk names. Wrong names always result in data loss. Make sure you type the correct name.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Type the following dd command to create a bootable USB image from a .ISO file:&lt;br /&gt;
 sudo dd if=artful-desktop-amd64.iso of=/dev/sdd bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Another example:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=ubuntu-20.04.1-live-server-amd64.iso of=/dev/sda bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
The dd command will write process data to a usb stick (/dev/sdd or /dev/sda)and a progress bar appears on screen.&lt;br /&gt;
Ubuntu to create a bootable Ubuntu USB flash drive from terminal&lt;br /&gt;
&lt;br /&gt;
In this example I am going to create a bootable flash drive for ubuntu-18.04.3-live-server-amd64.iso file as follows:&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=/isos/ubuntu-18.04.3-live-server-amd64.iso of=/dev/sdb bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Ubuntu iso bootable USB create using dd command on Linux&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Another example&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 sudo dd if=/isos/ubuntu-19.04-live-server-amd64.iso of=/dev/sdb bs=1M status=progress&lt;br /&gt;
&lt;br /&gt;
Here is what I see:&lt;br /&gt;
&lt;br /&gt;
 748+0 records in&lt;br /&gt;
 748+0 records out&lt;br /&gt;
 784334848 bytes (784 MB, 748 MiB) copied, 119.174 s, 6.6 MB/s&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Understanding the dd command options&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 dd : Start the dd command to write DVD/CD iso image.&lt;br /&gt;
 if=/iso/ubuntu.iso : Path to input file.&lt;br /&gt;
 of=/dev/sdd : Path to destination USB disk/stick.&lt;br /&gt;
 bs=1M : read and write up to BYTES bytes at a time. In this example, 1M at a time.&lt;br /&gt;
 status=progress : Display progress bar while writing image to the USB stick such as /dev/sdd. See “Linux dd Command Show Progress Copy Bar With Status” for more info.&lt;br /&gt;
&lt;br /&gt;
=== Step 5: Install Ubuntu using newly created USB drive ===&lt;br /&gt;
&lt;br /&gt;
That’s all, folks! You now have Ubuntu on a USB stick, bootable and ready to install on your Laptop, Desktop or server based system.&lt;br /&gt;
Conclusion&lt;br /&gt;
&lt;br /&gt;
You learned how to create a bootable usb pen drive from downloaded Ubuntu desktop or server .ISO image. See Ubuntu download page.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26205</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26205"/>
		<updated>2022-09-04T10:27:30Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Snippets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Tipp - effektives Anpassen ==&lt;br /&gt;
Mit der Erweiterung AdminOnSteroids kann man die Anpassungen vereinfachen, da man nicht in jedes Feld muss. Todo - kleineres Modul als Alternative finden.&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
Siehe auch&lt;br /&gt;
 https://processwire.com/talk/topic/17862-share-your-ckeditor-settings/&lt;br /&gt;
=== Tabellenmodul anpassen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 Here is another snippet that I use to get rid of unwanted table properties:&lt;br /&gt;
&lt;br /&gt;
// Remove unwanted attributes from tables&lt;br /&gt;
CKEDITOR.on(&amp;#039;dialogDefinition&amp;#039;, function(ev) {&lt;br /&gt;
  var dialogName = ev.data.name;&lt;br /&gt;
  var dialogDefinition = ev.data.definition;&lt;br /&gt;
&lt;br /&gt;
  if (dialogName == &amp;#039;table&amp;#039;) {&lt;br /&gt;
    var info = dialogDefinition.getContents(&amp;#039;info&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtWidth&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtHeight&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtBorder&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellPad&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtSummary&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellSpace&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;cmbAlign&amp;#039;);&lt;br /&gt;
    var advanced = dialogDefinition.getContents(&amp;#039;advanced&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advStyles&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advId&amp;#039;); //Id attribute&lt;br /&gt;
    advanced.remove(&amp;#039;advLangDir&amp;#039;); // writing direction&lt;br /&gt;
    advanced.get(&amp;#039;advCSSClasses&amp;#039;)[&amp;#039;default&amp;#039;] = &amp;#039;uk-table&amp;#039;; //set default class for table&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put this code inside your custom config.js&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26204</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26204"/>
		<updated>2022-09-04T10:26:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Snippets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Tipp - effektives Anpassen ==&lt;br /&gt;
Mit der Erweiterung AdminOnSteroids kann man die Anpassungen vereinfachen, da man nicht in jedes Feld muss. Todo - kleineres Modul als Alternative finden.&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
=== Tabellenmodul anpassen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 Here is another snippet that I use to get rid of unwanted table properties:&lt;br /&gt;
&lt;br /&gt;
// Remove unwanted attributes from tables&lt;br /&gt;
CKEDITOR.on(&amp;#039;dialogDefinition&amp;#039;, function(ev) {&lt;br /&gt;
  var dialogName = ev.data.name;&lt;br /&gt;
  var dialogDefinition = ev.data.definition;&lt;br /&gt;
&lt;br /&gt;
  if (dialogName == &amp;#039;table&amp;#039;) {&lt;br /&gt;
    var info = dialogDefinition.getContents(&amp;#039;info&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtWidth&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtHeight&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtBorder&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellPad&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtSummary&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellSpace&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;cmbAlign&amp;#039;);&lt;br /&gt;
    var advanced = dialogDefinition.getContents(&amp;#039;advanced&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advStyles&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advId&amp;#039;); //Id attribute&lt;br /&gt;
    advanced.remove(&amp;#039;advLangDir&amp;#039;); // writing direction&lt;br /&gt;
    advanced.get(&amp;#039;advCSSClasses&amp;#039;)[&amp;#039;default&amp;#039;] = &amp;#039;uk-table&amp;#039;; //set default class for table&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put this code inside your custom config.js&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26203</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26203"/>
		<updated>2022-09-04T10:26:40Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Tabellenmodul anpassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Tipp - effektives Anpassen ==&lt;br /&gt;
Mit der Erweiterung AdminOnSteroids kann man die Anpassungen vereinfachen, da man nicht in jedes Feld muss. Todo - kleineres Modul als Alternative finden.&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26202</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26202"/>
		<updated>2022-09-04T10:26:01Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Tipp - effektives Anpassen ==&lt;br /&gt;
Mit der Erweiterung AdminOnSteroids kann man die Anpassungen vereinfachen, da man nicht in jedes Feld muss. Todo - kleineres Modul als Alternative finden.&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tabellenmodul anpassen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 Here is another snippet that I use to get rid of unwanted table properties:&lt;br /&gt;
&lt;br /&gt;
// Remove unwanted attributes from tables&lt;br /&gt;
CKEDITOR.on(&amp;#039;dialogDefinition&amp;#039;, function(ev) {&lt;br /&gt;
  var dialogName = ev.data.name;&lt;br /&gt;
  var dialogDefinition = ev.data.definition;&lt;br /&gt;
&lt;br /&gt;
  if (dialogName == &amp;#039;table&amp;#039;) {&lt;br /&gt;
    var info = dialogDefinition.getContents(&amp;#039;info&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtWidth&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtHeight&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtBorder&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellPad&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtSummary&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;txtCellSpace&amp;#039;);&lt;br /&gt;
    info.remove(&amp;#039;cmbAlign&amp;#039;);&lt;br /&gt;
    var advanced = dialogDefinition.getContents(&amp;#039;advanced&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advStyles&amp;#039;);&lt;br /&gt;
    advanced.remove(&amp;#039;advId&amp;#039;); //Id attribute&lt;br /&gt;
    advanced.remove(&amp;#039;advLangDir&amp;#039;); // writing direction&lt;br /&gt;
    advanced.get(&amp;#039;advCSSClasses&amp;#039;)[&amp;#039;default&amp;#039;] = &amp;#039;uk-table&amp;#039;; //set default class for table&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put this code inside your custom config.js &lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26201</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26201"/>
		<updated>2022-09-04T09:31:09Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Tipp - effektives Anpassen ==&lt;br /&gt;
Mit der Erweiterung AdminOnSteroids kann man die Anpassungen vereinfachen, da man nicht in jedes Feld muss. Todo - kleineres Modul als Alternative finden.&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26200</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26200"/>
		<updated>2022-09-04T09:29:06Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Eigene Stildefinitionen in der Styles Datei */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
// Auch Code ist möglich:&lt;br /&gt;
// add inline font-size from 12px to 48px&lt;br /&gt;
for(var i = 12; i &amp;lt;= 48; i++) {&lt;br /&gt;
    myStyles.push({name: &amp;#039;text &amp;#039; + i, element: &amp;#039;span&amp;#039;, attributes: {&amp;#039;style&amp;#039;: &amp;#039;font-size: &amp;#039; + i + &amp;#039;px;&amp;#039;}});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26199</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26199"/>
		<updated>2022-09-04T09:28:33Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Buttons erlauaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== ExtraAllowedContent Beispiel: Buttons erlauben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26198</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26198"/>
		<updated>2022-09-04T09:27:50Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Styles Dropdown verbessern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== Buttons erlauaben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
==== 1. Styles im Dropdown verbessern ====&lt;br /&gt;
&lt;br /&gt;
Standardmäßig nutzt das Style Dropdown die Styles für den Content. Das ist z.B. bei großen Schriftn nicht immer sinnvoll. Das läßt sich aber in den Customstyles überschreiben.&lt;br /&gt;
&lt;br /&gt;
templates/modules/CKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Styles to load in CKEditor for better usabilty */&lt;br /&gt;
&lt;br /&gt;
.cke_panel_grouptitle {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 99;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container {&lt;br /&gt;
    scroll-behavior: auto;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  html.cke_panel_container .cke_panel_listItem &amp;gt; a * {&lt;br /&gt;
      margin: 0 !important;&lt;br /&gt;
      font-size: 0.97rem !important;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style] li {&lt;br /&gt;
    margin-bottom: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;decimal-leading-zero&amp;quot;] {&lt;br /&gt;
    list-style-type: decimal-leading-zero;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;upper-roman&amp;quot;] {&lt;br /&gt;
    list-style-type: upper-roman;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] {&lt;br /&gt;
    color: inherit;&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    padding-left: 1.25rem;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li {&lt;br /&gt;
    position: relative;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  [data-list-style=&amp;quot;checkmark&amp;quot;] li::before {&lt;br /&gt;
    content: &amp;#039;\2714&amp;#039;;&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -1.1rem;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26197</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=26197"/>
		<updated>2022-09-04T08:48:43Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* CKEditor allgemeines Wissen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;HINWEIS: Bei Änderungen an den Styles unbedingt Modul-Cache löschen (Module &amp;gt; Aktualisieren)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/talk/topic/3023-module-ckeditor/&lt;br /&gt;
 https://processwire.com/talk/topic/14601-solved-ckeditor-custom-stylesclasses/&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
 &lt;br /&gt;
 [[CKEditor - Snippets]]&lt;br /&gt;
&lt;br /&gt;
CHECKEN:&lt;br /&gt;
 https://processwire.com/talk/topic/23437-ckeditor-global-custom-config-frontend-styles-in-the-editor/&lt;br /&gt;
Automatische Konfiguration für alle CKEditor Felder&lt;br /&gt;
&lt;br /&gt;
== Der CKEditor in ProcessWire ==&lt;br /&gt;
Ist der Standard Editor in PW. Es gibt auch Module mit denen man Ihn ersetzen kann. Im Prinzip aber ein mächtiges Werkzeug.&lt;br /&gt;
&lt;br /&gt;
Hinweis: In neueren Versionen von PW (mindestens ab V3) Sind einige der Angaben unten überholt. Zum Teil funktionieren Sie aber ncoh. Als Referenz bleiben Die Tutorials auf dieser Seite unten erhalten&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
&lt;br /&gt;
=== Buttons ===&lt;br /&gt;
Im Backend anpassen&lt;br /&gt;
&lt;br /&gt;
=== Format Stile ===&lt;br /&gt;
In der Feldkonfiguration unter&lt;br /&gt;
 Input &amp;gt; Format Tags&lt;br /&gt;
 &lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Im Styles Dropdown kann man eigene Stile inklusive Klassen definieren.&lt;br /&gt;
&lt;br /&gt;
==== Styles Dropdown Feld im Editor aktivieren ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;1. Styles Dropdown aktivieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Feldkonfiguration unter CK Editor Toolbar&lt;br /&gt;
 Styles&lt;br /&gt;
hinzufügen (am besten hinter Format)&lt;br /&gt;
&lt;br /&gt;
==== Eigene Stildefinitionen in der Styles Datei ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; 2.Styles Datei hinzufügen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Datei unter Eigenes JS Styles Set angeben...&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
und Datei anlegen. Die sieht z.B. so aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: &amp;#039;&amp;#039;&amp;#039;Nicht mystyles:&amp;#039;&amp;#039;&amp;#039;/site/... Verwenden das führt zu Problemen im Backend. Mal sind die Stile da mal nicht. Also z.B. &amp;#039;&amp;#039;&amp;#039;customstyles in der Pfadangabe UND in der Datei verwenden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Ausführliches Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra Allowed Content ===&lt;br /&gt;
Manche Tags werden ausgefiltert. Eigentlich sollte man im Backend CKEditor Extra Allowed Content Regeln anlegen können. Aber Vorsicht: Der &amp;#039;&amp;#039;&amp;#039;HTML Purifier filtert&amp;#039;&amp;#039;&amp;#039; zusätzlich Tags aus. (z.B. Button Tags) Also im Zweifel mal diesen ausschalten. &lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyle.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;p(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== i Tag erlauben (Möglichkeit 2)====&lt;br /&gt;
Siehe oben und erlaube&lt;br /&gt;
 // ALLOW &amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
 config.protectedSource.push(/&amp;lt;i[^&amp;gt;]*&amp;gt;&amp;lt;\/i&amp;gt;/g);&lt;br /&gt;
&lt;br /&gt;
==== Buttons erlauaben ====&lt;br /&gt;
Dieses Beispiel ist nur mittelmäßig nützlich. Oft ist es besser einen Style für ein a Tag zu basteln. Da im Editor Buttons ohnehin normalerweise irgendwo hin linken.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
config.allowedContent = true;&lt;br /&gt;
config.extraAllowedContent = &amp;#039;button(*)[*]{*};div(*)[*]{*};li(*)[*]{*};ul(*)[*]{*}&amp;#039;;&lt;br /&gt;
CKEDITOR.dtd.$removeEmpty.i = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aussehen des Editors anpassen ==&lt;br /&gt;
Außer den Styles die man dem User anbietet, kann man auch den Editor selbst anpassen und die Usability verbessern:&lt;br /&gt;
&lt;br /&gt;
=== Styles Dropdown verbessern ===&lt;br /&gt;
 https://processwire.com/talk/topic/19465-ckeditor-styles-dropdown-tips/&lt;br /&gt;
&lt;br /&gt;
== CKEditor allgemeines Wissen ==&lt;br /&gt;
Ein paar Infos zu CKEditor ohne PW. Viele Dinge sind ähnlich.&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
==== Toolbar ====&lt;br /&gt;
http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Toolbar&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Plugins ===&lt;br /&gt;
Werden normalerweise mit einem Builder implementiert. Das geht bei PW nicht. Aber es gelten zum Teil die Regeln für Manuelle Installation. Manche Schritte z.B. aktivieren der Plugins macht man in PW aber wahlweise über die Feldkonfiguration.&lt;br /&gt;
&lt;br /&gt;
Beispiel Widget Plugin:&lt;br /&gt;
&lt;br /&gt;
If you want to add the plugin manually, you will need to:&lt;br /&gt;
* Extract the downloaded plugin .zip into the plugins folder of your CKEditor installation. Example:&lt;br /&gt;
 http://example.com/ckeditor/plugins/widget&lt;br /&gt;
* Enable the plugin by using the extraPlugins configuration setting. Example:&lt;br /&gt;
 config.extraPlugins = &amp;#039;widget&amp;#039;; &lt;br /&gt;
* Download and configure all its &amp;#039;&amp;#039;&amp;#039;dependencies&amp;#039;&amp;#039;&amp;#039;, too.&lt;br /&gt;
In PW&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
&lt;br /&gt;
=== Praktisches Beispiel 1===&lt;br /&gt;
&lt;br /&gt;
Im Tab Eingabe des Editor Felds kann man verschiedene Dinge Einstellen. Die meisten Felder sind auch recht gut erklärt:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Editor Toolbar einstellen&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Interessant ist hier der &amp;#039;&amp;#039;&amp;#039;Eintrag Styles&amp;#039;&amp;#039;&amp;#039;. Das Formatdialogfeld formatiert einzelne Blockstile wie h1 oder p. Im Styles Dropdown kann man auch Umgebende Blockelemente wie z.B. Divs mit speziellen Klassen nutzen. &lt;br /&gt;
&lt;br /&gt;
Guter Standard mit Tabellen und Styles Dropdown&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tags formatieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Hier kann man festlegen welche &amp;#039;&amp;#039;&amp;#039;Tags im Format Dropdown&amp;#039;&amp;#039;&amp;#039; ausgewählt werden können. Hier ein Beispiel bei dem wir h1 weglassen. H1 wird oft über das Template selbst ausgegeben und sollte nur einmal pro Seite auftauchen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
p;h2;h3;h4;h5;h6;pre;address;div&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Styles festlegen &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Um die oben erwähnten Styles anzupassen wir eine kleine JavaScript Datei. Wo diese liegt legen wir im Abschnitt &amp;#039;&amp;#039;&amp;#039;Eigenes Editor-JS-Style-Set&amp;#039;&amp;#039;&amp;#039; fest. Wir nutzen NICHT den bereits vorgeschlagenen Pfad, sonst wäre bei einem Update alles weg. Besser in /site/templates/modules speichern:&lt;br /&gt;
 customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&lt;br /&gt;
UIkit Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/* v1.2 */&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
&lt;br /&gt;
/* Objektstile */&lt;br /&gt;
{ name: &amp;#039;Bild: Rund&amp;#039;, element: &amp;#039;img&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-border-circle&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
/* Blockstyles */&lt;br /&gt;
{ name: &amp;#039;Lead&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lead&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Zweispalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Dreipalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-3@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Vierspalter&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-column-1-2@s uk-column-1-4@m&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H2 Extra Bold&amp;#039;, element: &amp;#039;h2&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;extra-bold&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Trennlinie&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-divider&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 mit Linie dahinter&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;line-behind&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;H3 kein Abstand unten&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-margin-remove-adjacent uk-margin-remove-bottom&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kein Randabstand&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;no-padding no-margin&amp;#039; } },&lt;br /&gt;
/*{ name: &amp;#039;Heading Line&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-line&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Heading Bullet&amp;#039;, element: &amp;#039;h3&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-heading-bullet&amp;#039; } },*/&lt;br /&gt;
{ name: &amp;#039;Dropcap&amp;#039;, element: &amp;#039;div&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dropcap&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Liste (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-bullet&amp;#039;}},&lt;br /&gt;
{ name: &amp;#039;Liste gestreift (UIkit)&amp;#039;, element: &amp;#039;ul&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-list uk-list-striped&amp;#039;}},&lt;br /&gt;
&lt;br /&gt;
/* Inline Styles */&lt;br /&gt;
{ name: &amp;#039;Link-Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-text&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Primary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Secondary Button (UIkit)&amp;#039;, element: &amp;#039;a&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-button uk-button-secondary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-small&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Groß (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-large&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kleinbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-lowercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Großbuchstaben (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-uppercase&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Kapitälchen (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-capitalize&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Hell (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-light&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Dunkel (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-dark&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Muted (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-muted&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Primär (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-primary&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Erfolg (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-success&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Warnung (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-warning&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Farbe: Gefahr (UIkit)&amp;#039;, element: &amp;#039;span&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;uk-text-danger&amp;#039; } },&lt;br /&gt;
{ name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Gel&amp;amp;ouml;scht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
{ name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hinweis: Span Elemente sind oft p Elementen vorzuziehen, da sie Inline angewendet werden können. So ist es möglich einen Muted Text innerhalb eines Absatzes einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Einfaches Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.stylesSet.add( &amp;#039;customstyles&amp;#039;, [&lt;br /&gt;
 { name: &amp;#039;Mein Spezialabsatz&amp;#039;, element: &amp;#039;p&amp;#039;, attributes: { &amp;#039;class&amp;#039;: &amp;#039;myParagraphStyle&amp;#039; } },&lt;br /&gt;
 { name: &amp;#039;Klein&amp;#039;, element: &amp;#039;small&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Gelöscht&amp;#039;, element: &amp;#039;del&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Eingefügt&amp;#039;, element: &amp;#039;ins&amp;#039; },&lt;br /&gt;
 { name: &amp;#039;Zitat&amp;#039;, element: &amp;#039;cite&amp;#039; }&lt;br /&gt;
]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Stile im Editor einbinden &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== DIV-Stile ===&lt;br /&gt;
Mit dem CreateDiv Plugin kann man Stile auch auf Blockelemente statt nur auf Inline Elemente anwenden. Praktisch z.B. für Kästchen etc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, CreateDiv, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote, PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord, -, Undo, Redo, -, Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weiter Forum Beispiele ==&lt;br /&gt;
https://processwire.com/talk/topic/9606-how-to-configure-ckeditortextarea-field-to-enable-color-toolbar/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Konfiguration CKEditor in PW (alt)==&lt;br /&gt;
&lt;br /&gt;
 /sites &lt;br /&gt;
ausgelagert und somit auch Updatefähig. Abschauen kann man im original Modul in &lt;br /&gt;
 wire/site/modules/InputfieldCKEditor/&lt;br /&gt;
Dort gibe es diverse Dateien. Allerdings ist nicht alles möglich, was in der CKEditor Doku steht. In PW können scheinbar manche Einstellungen nicht über die Dateien geregelt werden.&lt;br /&gt;
&lt;br /&gt;
=== Wo stellt man was ein ? ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; Nicht alles was hier steht funktioniert auch so. Am besten im Backend in der Feldkonfiguration schauen und dort die Pfade anpassen.&lt;br /&gt;
Ordner:&lt;br /&gt;
 site/modules/InputfieldCKEditor/&lt;br /&gt;
Konfiguration gültig &amp;#039;&amp;#039;&amp;#039;für alle Felder im Backend&amp;#039;&amp;#039;&amp;#039; (hat bei mir bisher nicht ohne die Backendkonfiguration für das Feld funktioniert)&lt;br /&gt;
 config.js&lt;br /&gt;
Konfiguration für ein bestimmtes Feld falls vorhanden&lt;br /&gt;
 config.[fieldname.]js &lt;br /&gt;
 mystyles.js -&amp;gt; ein selbstbenanntes Feld kann im Backend bei der Konfiguration des CKEditor Feldes angegeben werden.&lt;br /&gt;
&lt;br /&gt;
Allgemeine Konfiguration. Z.B. Styles hinzufügen, removeFormatTags, &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alles was der Editor beim Eingeben mit &amp;#039;&amp;#039;&amp;#039;JavaScript&amp;#039;&amp;#039;&amp;#039; bearbeitet. Außerdem &amp;#039;&amp;#039;&amp;#039;Style Auswahl anpassen&amp;#039;&amp;#039;&amp;#039; alle Optionen die mit &amp;#039;&amp;#039;&amp;#039;CKEDITOR.&amp;#039;&amp;#039;&amp;#039; anfangen&lt;br /&gt;
 content.css&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile die der Editor bei der Eingabe benutzt. Also quasi die Vorschau für den Benutzer.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 contents-inline.css&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stile für die Vorschau beim Inline Editor&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 Feldkonfiguration im Admin Bereich PW&lt;br /&gt;
&lt;br /&gt;
Hier muß die &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039; eingestellt werden. Über Konfig hat es bisher nicht geklappt. Hier muss auch die &amp;#039;&amp;#039;&amp;#039;CSS Datei für die Inline Styles&amp;#039;&amp;#039;&amp;#039; angegeben werden. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Überschreiben in der config.js&amp;#039;&amp;#039;&amp;#039; hat bei mir nicht funktioniert - in aktueller Version 3.062 klappt es..&lt;br /&gt;
&lt;br /&gt;
 Auch &amp;#039;&amp;#039;&amp;#039;Plugins&amp;#039;&amp;#039;&amp;#039; müssen hier ausgewählt werden, damit sie eingebunden werden. Dies funktioniert also alles nur auf Feld-Ebene und nicht global.&lt;br /&gt;
=== CKEditor Buttons anpassen===&lt;br /&gt;
Wenn man ein Textarea Feld definiert, kann man auch für dieses Feld den CKEditor anpassen. Das geht im Backend in der &amp;#039;&amp;#039;&amp;#039;Feldkonfiguration unter dem Reiter Eingabe.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Beispiel: Hier werden &amp;#039;&amp;#039;&amp;#039;Buttons für die Textausrichtung hinzugefügt.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic,Superscript, -,JustifyLeft,JustifyCenter,JustifyRight,-, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
PWLink, Unlink, Anchor&lt;br /&gt;
&lt;br /&gt;
PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Default Einstellungen ===&lt;br /&gt;
Todo: TESTEN ob das wirklich funktioniert&lt;br /&gt;
Kann man im Modulverzeichnis unter site/modules hinterlegen. Achtung nicht im Modulverzeichnis unter wire überschreiben. Das ist beim nächsten Update weg.&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.js -&amp;gt; überschreibt oder ergänzt die Default Einstellung&lt;br /&gt;
 /site/modules/InputfieldCKEditor/config.body.js -&amp;gt; überschreibt oder ergänzt das body Feld&lt;br /&gt;
Beispiele:&lt;br /&gt;
 config.startupOutlineBlocks = true;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
	config.justifyClasses = [ &amp;#039;left&amp;#039;, &amp;#039;center&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;justify&amp;#039; ];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leider funktionieren viele Einstellungen hier nicht, die im original CKEditor möglich sind.&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles ===&lt;br /&gt;
Eigene Stile zur Auswahl im &amp;#039;&amp;#039;&amp;#039;Styles&amp;#039;&amp;#039;&amp;#039; Dropdown&lt;br /&gt;
 site-&amp;gt;modules-&amp;gt;InputfieldCKEditor-&amp;gt;mystyles.js&lt;br /&gt;
anpassen.&lt;br /&gt;
Im Backend den Pfad hinzufügen (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Konfigurationsbeispiele ===&lt;br /&gt;
Im Adminbereich im content_main Feld:&lt;br /&gt;
&lt;br /&gt;
==== CKEditor Toolbar ====&lt;br /&gt;
Added justify buttons...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Superscript, -,JustifyLeft ,JustifyCenter ,JustifyRight , -, RemoveFormat&lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar&lt;br /&gt;
PasteText, PasteFromWord,-,Undo,Redo&lt;br /&gt;
Scayt, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blöcke anzeigen, Smileys&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Format, Styles, -, Bold, Italic, Underline, Strike, Superscript, Subscript,&lt;br /&gt;
JustifyLeft ,JustifyCenter ,JustifyRight , -,  &lt;br /&gt;
NumberedList, BulletedList, -, Blockquote&lt;br /&gt;
&lt;br /&gt;
PWLink, Unlink, Anchor, PWImage, Table, HorizontalRule, SpecialChar, Smiley, ShowBlocks, RemoveFormat,&lt;br /&gt;
PasteText, PasteFromWord,-, Undo, Redo, -, Sourcedialog&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor CSS File ====&lt;br /&gt;
Für die &amp;#039;&amp;#039;&amp;#039;im Editor angezeigten Stile&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 site/modules/InputfieldCKEditor/contents.css&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/fa/css/font-awesome.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/vendors/bootstrap/css/bootstrap.min.css&amp;#039;);&lt;br /&gt;
@import url(&amp;#039;../../templates/css/main.css&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
.cke_editable {&lt;br /&gt;
	font-size: 14px;&lt;br /&gt;
	line-height: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_ltr blockquote {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
	padding-right: 8px;&lt;br /&gt;
	border-left-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cke_contents_rtl blockquote {&lt;br /&gt;
	padding-left: 8px;&lt;br /&gt;
	padding-right: 20px;&lt;br /&gt;
	border-right-width: 5px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Custom Editor JS File ====&lt;br /&gt;
&lt;br /&gt;
Für die Auswahlfelder in der &amp;#039;&amp;#039;&amp;#039;Toolbar&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 customstyles:/site/modules/InputfieldCKEditor/mystyles.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
  CKEDITOR.stylesSet.add( &amp;#039;mystyles&amp;#039;, [&lt;br /&gt;
   { name: &amp;#039;Home Icon&amp;#039;, element: &amp;#039;i&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;fa fa-home fa-2x&amp;#039;}},&lt;br /&gt;
   { name: &amp;#039;Panel Title&amp;#039;, element: &amp;#039;h4&amp;#039;, attributes: {&amp;#039;class&amp;#039;: &amp;#039;panel-title&amp;#039;} },&lt;br /&gt;
  ]);&lt;br /&gt;
  CKEDITOR.dtd.$removeEmpty[&amp;#039;i&amp;#039;] = false; // leere i Tags erlauben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== config.js ====&lt;br /&gt;
In /site/modules/InputfieldCKEditor/config.js (oder config.feldname.js)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
CKEDITOR.editorConfig = function( config ) {&lt;br /&gt;
  config.uiColor = &amp;#039;#AADC6E&amp;#039;;&lt;br /&gt;
  config.coreStyles_italic = { element : &amp;#039;i&amp;#039;, overrides : &amp;#039;em&amp;#039; }; // i nicht durch em überschreiben (für font awesome)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Plugins hinzufügen ==&lt;br /&gt;
 https://weekly.pw/issue/13/#1-2 -&amp;gt; Plugins für CK Editor etc.&lt;br /&gt;
 Readme im Plugins Ordner&lt;br /&gt;
=== Beispiel DIV Plugin ===&lt;br /&gt;
Wenn man mehrere Absätze auswählt und im Styles Menü einen Block-Style auswählt umschließt der CKEditor jeden Absatz mit dem Style. &lt;br /&gt;
Das Div Plugin ermöglicht es auch mehrere Blöcke mit einem einzigen Div zu umschließen. So kann man z.B. Kästchen über mehrere Absätze erzeugen.&lt;br /&gt;
&lt;br /&gt;
# Plugin herungerladen und entpacken https://ckeditor.com/cke4/addon/div&lt;br /&gt;
# Ordner in site/modules/InputfieldCKEditor/plugins kopieren&lt;br /&gt;
# Modul in den Field Settings aktivieren (evtl. geht auch &amp;#039;&amp;#039;config.extraPlugins = &amp;#039;div&amp;#039;;&amp;#039;&amp;#039; in der config.js hinzuzufügen - nicht getestet.&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Bilder - width Attribut beschränkt auf max. 1200px ===&lt;br /&gt;
 https://processwire.com/talk/topic/9615-skip-width-attributes-on-img/&lt;br /&gt;
Der HTML Purifier ist hier das eigentliche Problem. Er beschränkt den Wert auf max 1200. Entweder den HTML Purifier abschalten (in der Feldkonfiguration) oder &lt;br /&gt;
 wire/modules/Markup/MarkupHTMLPurifier/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser&lt;br /&gt;
There look for this bit... &amp;quot;HTML.MaxImgLength&amp;quot;;i:1200&lt;br /&gt;
Change 1200 to your desired maximum value.&lt;br /&gt;
&lt;br /&gt;
=== Cursor springt an den Anfang zurück ===&lt;br /&gt;
&lt;br /&gt;
=== Eigene Styles funktionieren nicht ===&lt;br /&gt;
* customstyles statt mystyles als Bezeichner (ganz vorne in der Config) und in der myStyles.js &lt;br /&gt;
* Ich hatte Probleme wenn die Datei in site/templates/InputfieldCKEditor lag besser in site/modules/InputfieldCKEditor/&lt;br /&gt;
&lt;br /&gt;
=== Editor wird nicht mehr im Backend angezeigt ===&lt;br /&gt;
Hat meistens mit der Konfiguration der myStyles.js zu tun (falscher Pfad o.ä.)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26196</id>
		<title>JavaScript - Webfont loaded?</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26196"/>
		<updated>2022-09-03T11:19:16Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit den document ready events kommt man bei css fonts nicht weiter. Diese werden oft später zugeordnet. Daher kann es nachträglich noch zu Größenänderungen kommen, je nachdem wie eine Schrift gestaltet ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten das zu checken. Allerdings sind nicht alle - je nach Situation - geeignet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 Dynamische Schriftgröße - dynamic fontsize&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/ready&lt;br /&gt;
 https://portalzine.de/dev/options-to-detect-when-a-font-face-has-been-loaded/&lt;br /&gt;
 https://stackoverflow.com/questions/5680013/how-to-be-notified-once-a-web-font-has-loaded&lt;br /&gt;
 &lt;br /&gt;
== jQuery / fontSpy ==&lt;br /&gt;
Der Klassiker&lt;br /&gt;
&lt;br /&gt;
If your project uses jQuery, you could also use jQuery-FontSpy which also works in IE because it determines the font being loaded by watching for an element&amp;#039;s dimensions to change. Example usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fontSpy(&amp;#039;Open Sans&amp;#039;, {&lt;br /&gt;
  success: function() {&lt;br /&gt;
    alert(&amp;#039;Font has been loaded&amp;#039;);&lt;br /&gt;
  },&lt;br /&gt;
  failure: function() {&lt;br /&gt;
    alert(&amp;#039;Font failed to load&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== document.fonts ==&lt;br /&gt;
Dieses Objekt steht eigentlich in allen Post IE Browsern zur Verfügung. Für IE gibt es Polyfills (nicht getestet)&lt;br /&gt;
&lt;br /&gt;
Vorsicht mit dem load Event. Dieser wird nicht immer ausgeführt. Keine Ahnung warum in manchen Fällen nicht (evtl. wg. Cache Vorgängen?)&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
  // no promise support (&amp;lt;=IE11)&lt;br /&gt;
  if (!(&amp;#039;Promise&amp;#039; in window)) {&lt;br /&gt;
      return;&lt;br /&gt;
  }&lt;br /&gt;
  async function fontsReady() {&lt;br /&gt;
    let ready = await document.fonts.ready; // wait for the promise object&lt;br /&gt;
    console.log(ready); // show the promise object&lt;br /&gt;
    fitty(&amp;#039;.fitty&amp;#039;); // i.e. use fitty to scale text with class .fitty&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  fontsReady();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Snippets&amp;diff=26195</id>
		<title>JavaScript - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Snippets&amp;diff=26195"/>
		<updated>2022-09-03T11:16:56Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Must Know - Wichtige JavaScript Snippets und Konzepte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Siehe auch&lt;br /&gt;
&lt;br /&gt;
 [[JavaScript - Plugins]]&lt;br /&gt;
 [[JavaScripts - Basics]]&lt;br /&gt;
 [[JavaScript - DOM Manipulation]]&lt;br /&gt;
 [[jQuery - Snippets]]&lt;br /&gt;
 [[Browser Fallbacks]]&lt;br /&gt;
 https://wiki.stephanschlegel.de/index.php?title=JQuery_vs_Vanilla_JavaScript&lt;br /&gt;
&lt;br /&gt;
== Sonderzeichen in Alert-Meldungen ==&lt;br /&gt;
&lt;br /&gt;
Oft sieht man im Web sehr hässliche alert-Meldungen , in denen die Umlaute nicht korrekt dargestellt sind. Das liegt auch daran, dass unterschiedliche Betriebssystem Zeichen unterschiedlich kodieren. Damit so etwas möglichst vermieden wird, sollte man solche Meldungen mit alert(unescape(&amp;quot;...&amp;quot;)) anzeigen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: &lt;br /&gt;
 alert(unescape(&amp;quot;So was d%E4mliches%21&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
Zeichen	so verschlüsseln:&lt;br /&gt;
\	\\&lt;br /&gt;
&amp;quot;	\&amp;quot;&lt;br /&gt;
&amp;#039;	\&amp;#039;&lt;br /&gt;
Zeilenumbruch	\n&lt;br /&gt;
Wagenrücklauf	\r&lt;br /&gt;
(Den Unterschied zum Zeilenumbruch habe ich auch noch nicht begriffen.)&lt;br /&gt;
Tabulator	\t&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Zeichen	so:&lt;br /&gt;
Ä	%C4&lt;br /&gt;
Ö	%D6&lt;br /&gt;
Ü	%DC&lt;br /&gt;
ä	%E4&lt;br /&gt;
ö	%F6&lt;br /&gt;
ü	%FC&lt;br /&gt;
ß	%DF&lt;br /&gt;
€	%u20AC&lt;br /&gt;
$	%24&lt;br /&gt;
%	%25&lt;br /&gt;
&lt;br /&gt;
Generier Tool:&lt;br /&gt;
http://www.salesianer.de/util/alert-umlaute.html&lt;br /&gt;
&lt;br /&gt;
== Teil einer Seite drucken ==&lt;br /&gt;
Old School JavaScript, sollte sich  aber relativ einfach auf jQuery übertragen lassen.&lt;br /&gt;
&lt;br /&gt;
Quelle: http://www.webstool.de/de/tipps_down_druck3.html Zugriff: 10/2011&lt;br /&gt;
&lt;br /&gt;
Mit einem einfachen JavaScript lässt sich mit relativ wenig Aufwand eine druckerfreundliche Version einer Webseite bei Bedarf erzeugen.&lt;br /&gt;
&lt;br /&gt;
Das JavaScript wird nachstehend vorgestellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function ausgabe()&lt;br /&gt;
{&lt;br /&gt;
var ref = document.getElementById(&amp;quot;auswahl&amp;quot;);&lt;br /&gt;
var ausgabe;&lt;br /&gt;
// nächste Zeile öffnet ein Fenster der Größe 800 x 600 Pixel&lt;br /&gt;
ausgabe=window.open(&amp;quot;#&amp;quot;,&amp;quot;fenster&amp;quot;,&amp;quot;width=800,height=600,resizable=yes,menubar=yes,left=50,top=50&amp;quot;);&lt;br /&gt;
ausgabe.document.open();&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;Druckversion&amp;lt;/title&amp;gt;\n&amp;#039;);&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-1&amp;quot;&amp;gt;\n&amp;#039;);&lt;br /&gt;
// in der nächsten Zeile an das eigene Stylesheet anpassen&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;../css/design1.css&amp;quot;&amp;gt;\n&amp;lt;/head&amp;gt;\n&amp;#039;);&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;body&amp;gt;\n&amp;lt;h1 align=&amp;quot;center&amp;quot;&amp;gt;&amp;amp;copy; web s tool - Partner f&amp;amp;uuml;r Ihren Internetauftritt&amp;lt;/h1&amp;gt;\n&amp;#039;);&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;div&amp;gt;\n&amp;#039;);&lt;br /&gt;
// Ausgabe aller Inhalte mit der id = auswahl&lt;br /&gt;
while (ref!=null)&lt;br /&gt;
{&lt;br /&gt;
ausgabe.document.write(ref.innerHTML + &amp;#039;\n&amp;#039;);&lt;br /&gt;
ref = ref.nextSibling;&lt;br /&gt;
}&lt;br /&gt;
ausgabe.document.write(&amp;#039;&amp;lt;/div&amp;gt;\n&amp;lt;p align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;javascript:window.print()&amp;quot;&amp;gt;drucken&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n&amp;#039;);&lt;br /&gt;
ausgabe.document.close();&lt;br /&gt;
ausgabe.focus();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die externe Einbindung des JavaScripts erfolgt dabei z.B. im head-Bereich der Webseite über&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script language=&amp;quot;JavaScript&amp;quot; src=&amp;quot;../scripts/ausgabe4print.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Von entscheidender Bedeutung ist, dass auf der Seite das auszuwählende Objekt mit der id = &amp;quot;auswahl&amp;quot; (bitte bei Bedarf anpassen) versehen ist. Das auszuwählende Objekt kann dabei eine Tabelle oder ein div-Container sein.&lt;br /&gt;
&lt;br /&gt;
Der Aufruf erfolgt z.B. durch den Link &amp;lt;a href=&amp;quot;javascript:ausgabe();&amp;quot;&amp;gt; Druckversion&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fehler Behandlung ==&lt;br /&gt;
=== Prüfen ob ein Element existiert (normales JavaScript)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function isElement(obj) {&lt;br /&gt;
  try {&lt;br /&gt;
    //Using W3 DOM2 (works for FF, Opera and Chrom)&lt;br /&gt;
    return obj instanceof HTMLElement;&lt;br /&gt;
  }&lt;br /&gt;
  catch(e){&lt;br /&gt;
    return (typeof obj===&amp;quot;object&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
      (obj.nodeType===1) &amp;amp;&amp;amp; (typeof obj.style === &amp;quot;object&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
      (typeof obj.ownerDocument ===&amp;quot;object&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prüfen ob ein Element in einem Objekt-Literal existiert und nicht null ist ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var data = {&lt;br /&gt;
    &amp;quot;key1&amp;quot; : val,&lt;br /&gt;
    &amp;quot;key2&amp;quot; : val,&lt;br /&gt;
    &amp;quot;key3&amp;quot; : val&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if( &amp;quot;key2&amp;quot; in data &amp;amp;&amp;amp; data.key2 != null){&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eingaben Validieren ==&lt;br /&gt;
=== Handynummer validieren (normales JavaScript) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function phone_is_valid(nr){&lt;br /&gt;
	var reg2 = /^([0-9]{4,6})+\/([0-9]{6,11})$/;&lt;br /&gt;
	return reg2.test(nr);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datum validieren (normales JavaScript) ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function date_is_valid(myDate){&lt;br /&gt;
	var isValid = false;&lt;br /&gt;
	var today = new Date();&lt;br /&gt;
	if (!myDate) return false;&lt;br /&gt;
	myDate=myDate.toString();&lt;br /&gt;
	arrDate=myDate.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
	if (arrDate.length!=3) return false;&lt;br /&gt;
	arrDate[0]=parseInt(arrDate[0],10);&lt;br /&gt;
	arrDate[1]=parseInt(arrDate[1],10)-1;&lt;br /&gt;
	if (arrDate[2].length==2) arrDate[2]=&amp;quot;20&amp;quot;+arrDate[2]&lt;br /&gt;
	var kontrolldatum=new Date(arrDate[2],arrDate[1],arrDate[0]);&lt;br /&gt;
	// Datum gültig ?&lt;br /&gt;
	if (kontrolldatum.getDate()==arrDate[0] &amp;amp;&amp;amp; kontrolldatum.getMonth()==arrDate[1] &amp;amp;&amp;amp; kontrolldatum.getFullYear()==arrDate[2])&lt;br /&gt;
	{&lt;br /&gt;
		// in der Zukunft&lt;br /&gt;
		if (kontrolldatum.getTime()-today.getTime()+(24*60*60*1000) &amp;gt; 0)&lt;br /&gt;
			return true; 		&lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Maus ==&lt;br /&gt;
[[JavaScript - Maus]]&lt;br /&gt;
== Timer ==&lt;br /&gt;
Quelle: http://blog.agrafix.net/2011/10/javascript-timers-mit-jquery/&lt;br /&gt;
&lt;br /&gt;
Benötigte Funktionen sind window.setTimeout und window.setInterval&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// funktion verzögert aufrufen&lt;br /&gt;
function machWas() {&lt;br /&gt;
   alert(&amp;#039;alert() mit 1000ms verzögerung!&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
window.setTimeout(machWas, 1000);&lt;br /&gt;
 &lt;br /&gt;
// funktion alle X Millisekunden aufruden&lt;br /&gt;
function machWasOft() {&lt;br /&gt;
   alert(&amp;#039;alle 1000ms ein alert()&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.setInterval(machWasOft, 1000);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doch was ist, wenn ich jetzt einen solchen Timer ändern oder abbrechen möchte? Das ist eigentlich auch nicht schwer – die Funktionen setTimeout/setInterval geben ein Objekt zurück über das sie sich wieder beenden lassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
var x = 0;&lt;br /&gt;
function machWasAbbrechbarOft() {&lt;br /&gt;
    x += 1;&lt;br /&gt;
    if (x &amp;gt; 200) {&lt;br /&gt;
        window.clearInterval(running); // beende das &amp;quot;Interval&amp;quot; nach 201 Ausführungen&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
var running = window.setInterval(machWasAbbrechbarOft, 1000);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer mit jQuery ===&lt;br /&gt;
Für größere Projekte gibt es ein komfortableres jQuery Plugin&lt;br /&gt;
&lt;br /&gt;
Mit diesem Plugin geht das “Interval” setzen dann wie folgt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document).everyTime(1000, &amp;quot;machWasOftAbbrechbar&amp;quot;, function(i) { // alle 1000ms&lt;br /&gt;
  alert(&amp;#039;Hallo ich bin der &amp;#039; + i + &amp;#039;te Aufruf!&amp;#039;); // machWasOftAbbrechbar, hier die funktion die aufgerufen werden soll&lt;br /&gt;
}, 200); // 200 mal ausführen&lt;br /&gt;
Der zweite Parameter, machWasOftAbbrechbar, stellt hierbei ein sogenanntes “label” dar, über das man den gestarten Timer dann wieder abbrechen kann:&lt;br /&gt;
&lt;br /&gt;
$(document).stopTime(&amp;quot;machWasOftAbbrechbar&amp;quot;); // stoppe machWasOftAbbrechbar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viel mehr gibt’s eigentlich nicht dazu zu sagen – die Dokumentation dazu findet man, genau wie das Plugin selbst, unter http://plugins.jquery.com/project/timers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Arrays ==&lt;br /&gt;
=== Elemente hinzufügen / entfernen ===&lt;br /&gt;
Gegeben ist ein Array items in der Art &lt;br /&gt;
 [{id: 1, name: Anton, isFavourite: true}, {id: 2, name: Berta},...]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// add to end of array&lt;br /&gt;
this.friends.push(newFriend)&lt;br /&gt;
&lt;br /&gt;
// add to start of array&lt;br /&gt;
this.friends.unshift(newFriend)&lt;br /&gt;
&lt;br /&gt;
// delete item from array via id - v1 -&amp;gt; override complete array&lt;br /&gt;
deleteItem(id){&lt;br /&gt;
  this.items = this.items.filter( item =&amp;gt; item.id !== sarchId)&lt;br /&gt;
  // filter( filterFunction ) uses filterFunction for every item in items.&lt;br /&gt;
  // If filterFunction returns true the item is kept. item.id !== id returns true for every&lt;br /&gt;
  // item which has NOT the id&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// v2 - change array&lt;br /&gt;
deleteItem(id){&lt;br /&gt;
  const itemIndex = this.items.findIndex(item =&amp;gt; item.id === id)&lt;br /&gt;
  this.items.splice(resIndex, 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finden und Suchen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// find in array and change prop&lt;br /&gt;
const identifiedItem = this.items.find(&lt;br /&gt;
  (item) =&amp;gt; item.id === searchId // the same as function(friend){return friend.id...}&lt;br /&gt;
)&lt;br /&gt;
// filter(callback) - callback is executed on every array (array item) first item match is returned&lt;br /&gt;
identifiedItem.isFavourite = !identifiedItem.isFavourite&lt;br /&gt;
// identifiedItem is a proxy connected to the original items array.&lt;br /&gt;
// thus why we can modify identifiedItems and items will be altered too&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaScript - Objekte ==&lt;br /&gt;
[[JavaScript - Objektorientierte Programmierung]]&lt;br /&gt;
&lt;br /&gt;
=== Objekte löschen ===&lt;br /&gt;
 for (prop in allOverlays) { if (allOverlays.hasOwnProperty(prop)) { delete allOverlays[prop]; } } //ie 6 gc problems&lt;br /&gt;
 //allOverlays = {};&lt;br /&gt;
&lt;br /&gt;
== JavaScript - Strings ==&lt;br /&gt;
[[JavaScript - Strings]]&lt;br /&gt;
&lt;br /&gt;
== JavaScript - Numbers ==&lt;br /&gt;
 const x = &amp;#039;1&amp;#039;&lt;br /&gt;
 const y = +x // y is a number now&lt;br /&gt;
 const y = x.parseInt()&lt;br /&gt;
&lt;br /&gt;
== Viewport / Offset / Scrolling ==&lt;br /&gt;
=== Element sichtbar im Viewport ===&lt;br /&gt;
==== Kommt in den Viewport mit Self-Destroy ====&lt;br /&gt;
Wird nur einmal ausgeführt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
document.body.onscroll = function() {&lt;br /&gt;
	if (document.getElementById(&amp;quot;viewElement&amp;quot;).getBoundingClientRect().bottom &amp;lt;= window.innerHeight) {&lt;br /&gt;
		document.body.onscroll = &amp;quot;&amp;quot;;&lt;br /&gt;
		alert(&amp;quot;The tag just came into view&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Komplett im Viewport ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function isInViewport(el) {&lt;br /&gt;
    const rect = el.getBoundingClientRect();&lt;br /&gt;
    return (&lt;br /&gt;
        rect.top &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
        rect.left &amp;gt;= 0 &amp;amp;&amp;amp;&lt;br /&gt;
        rect.bottom &amp;lt;= (window.innerHeight || document.documentElement.clientHeight) &amp;amp;&amp;amp;&lt;br /&gt;
        rect.right &amp;lt;= (window.innerWidth || document.documentElement.clientWidth)&lt;br /&gt;
&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
const box = document.querySelector(&amp;#039;.box&amp;#039;);&lt;br /&gt;
const message = document.querySelector(&amp;#039;#message&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
document.addEventListener(&amp;#039;scroll&amp;#039;, function () {&lt;br /&gt;
    const messageText = isInViewport(box) ?&lt;br /&gt;
        &amp;#039;The box is visible in the viewport&amp;#039; :&lt;br /&gt;
        &amp;#039;The box is not visible in the viewport&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    message.textContent = messageText;&lt;br /&gt;
&lt;br /&gt;
}, {&lt;br /&gt;
    passive: true&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Teil im Viewport ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * checks if any part of the element is in viewport&lt;br /&gt;
 */&lt;br /&gt;
function isInViewport(el){&lt;br /&gt;
  h = el.height();&lt;br /&gt;
  hVp = $(window).height();&lt;br /&gt;
  posY = el.offset().top - $(window).scrollTop();&lt;br /&gt;
  dh = posY+h;&lt;br /&gt;
  // dh &amp;lt; 0 -&amp;gt; oben raus&lt;br /&gt;
  // posY &amp;gt; hVp -&amp;gt; unten raus&lt;br /&gt;
  if ( dh &amp;lt; 0 || posY &amp;gt; hVp ) return false;&lt;br /&gt;
  else return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Funktion mit GSAP ScrollTrigger starten ===&lt;br /&gt;
Counter Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function count(){&lt;br /&gt;
  $(&amp;#039;.counter&amp;#039;).each(function() {&lt;br /&gt;
    var $this = $(this), countTo = $this.attr(&amp;#039;data-count&amp;#039;);&lt;br /&gt;
    $({ countNum: $this.text()}).animate({&lt;br /&gt;
      countNum: countTo&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      duration: 5000,&lt;br /&gt;
      easing:&amp;#039;linear&amp;#039;,&lt;br /&gt;
      step: function() {&lt;br /&gt;
        $this.text(Math.floor(this.countNum));&lt;br /&gt;
      },&lt;br /&gt;
      complete: function() {&lt;br /&gt;
        $this.text(this.countNum);&lt;br /&gt;
        //alert(&amp;#039;finished&amp;#039;);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ScrollTrigger.create({&lt;br /&gt;
  trigger: &amp;#039;#counterTrigger&amp;#039;,&lt;br /&gt;
  onEnter: ()=&amp;gt;{&lt;br /&gt;
    console.log(&amp;#039;count&amp;#039;)&lt;br /&gt;
    count()&lt;br /&gt;
  },&lt;br /&gt;
&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== JavaScript - HTML5 Audio ==&lt;br /&gt;
[[JavaScript - HTML5 Audio]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
[[JavaScript - Tricks mit Links]]&lt;br /&gt;
&lt;br /&gt;
== JavaScript - Verschiedenes ==&lt;br /&gt;
=== Enter 2 Tabs ===&lt;br /&gt;
JQuery&lt;br /&gt;
&lt;br /&gt;
Wenn der User in einem Formular die Eingabetaste drückt wird in vielen Browsxern das Formular abgesendet. Stattdessen, kann man den Tastendruck in einen Tab verwandeln, dann kommt der User stattdessen ins nächste Eingabefeld. In diesem Beispiel wird der Cursor zu Beginn gleich ins erste Feld gesetzt (eingesetzt bei Mietlager XL Rechner).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// enter2tab for textboxes&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
	$(&amp;#039;input:text:first&amp;#039;).focus();&lt;br /&gt;
	$(&amp;#039;input:text&amp;#039;).bind(&amp;#039;keydown&amp;#039;, function(e) {&lt;br /&gt;
		if (e.keyCode == 13) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			var nextIndex = $(&amp;#039;input:text&amp;#039;).index(this) + 1;&lt;br /&gt;
			var maxIndex = $(&amp;#039;input:text&amp;#039;).length;&lt;br /&gt;
			if (nextIndex &amp;lt; maxIndex) {&lt;br /&gt;
				$(&amp;#039;input:text:eq(&amp;#039; + nextIndex+&amp;#039;)&amp;#039;).focus();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Animation ===&lt;br /&gt;
Siehe [[Animation im Web]]&lt;br /&gt;
&lt;br /&gt;
=== Sortieren ===&lt;br /&gt;
http://www.javascriptkit.com/javatutors/arraysort.shtml&lt;br /&gt;
&lt;br /&gt;
=== Scrolling ===&lt;br /&gt;
==== Smooth Scroll &amp;amp; Sticky - Fixed Navbar ====&lt;br /&gt;
jQuery&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
  var stickyNavTop = $(&amp;#039;.nav&amp;#039;).offset().top;&lt;br /&gt;
  var stickyNav = function(){&lt;br /&gt;
    var scrollTop = $(window).scrollTop();  &lt;br /&gt;
    if (scrollTop &amp;gt; stickyNavTop) { &lt;br /&gt;
      $(&amp;#039;.nav&amp;#039;).addClass(&amp;#039;sticky&amp;#039;);&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&amp;#039;.nav&amp;#039;).removeClass(&amp;#039;sticky&amp;#039;); &lt;br /&gt;
    }&lt;br /&gt;
  };&lt;br /&gt;
  stickyNav();&lt;br /&gt;
  $(window).scroll(function() {&lt;br /&gt;
    stickyNav();&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CSS - wichtig vor allem fixed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
.sticky {&lt;br /&gt;
  position: fixed;&lt;br /&gt;
  width: 100%;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  z-index: 100;&lt;br /&gt;
  border-top: 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Smooth Scroll für Anchor Tags oder toTop Links ====&lt;br /&gt;
 https://stackoverflow.com/questions/7717527/smooth-scrolling-when-clicking-an-anchor-link&lt;br /&gt;
noch ein Beispiel (Vanilla)&lt;br /&gt;
 https://perishablepress.com/vanilla-javascript-scroll-anchor/&lt;br /&gt;
&lt;br /&gt;
===== Beispiel ab 2018 =====&lt;br /&gt;
Nutzt das CSS Verhalten (kann man auch direkt als CSS nutzen. Manchmal funktioniert es (Stand 2020) nicht ganz sauber. Safari und Edge funktionieren nicht mit dem CSS Behaviour&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
document.querySelectorAll(&amp;#039;a[href^=&amp;quot;#&amp;quot;]&amp;#039;).forEach(anchor =&amp;gt; {&lt;br /&gt;
    anchor.addEventListener(&amp;#039;click&amp;#039;, function (e) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
&lt;br /&gt;
        document.querySelector(this.getAttribute(&amp;#039;href&amp;#039;)).scrollIntoView({&lt;br /&gt;
            behavior: &amp;#039;smooth&amp;#039;&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For older browser support, you can use this jQuery technique:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(document).on(&amp;#039;click&amp;#039;, &amp;#039;a[href^=&amp;quot;#&amp;quot;]&amp;#039;, function (event) {&lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
    $(&amp;#039;html, body&amp;#039;).animate({&lt;br /&gt;
        scrollTop: $($.attr(this, &amp;#039;href&amp;#039;)).offset().top&lt;br /&gt;
    }, 500);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And here&amp;#039;s the fiddle: http://jsfiddle.net/9SDLw/&lt;br /&gt;
&lt;br /&gt;
If your target element does not have an ID, and you&amp;#039;re linking to it by its name, use this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;a[href^=&amp;quot;#&amp;quot;]&amp;#039;).click(function () {&lt;br /&gt;
    $(&amp;#039;html, body&amp;#039;).animate({&lt;br /&gt;
        scrollTop: $(&amp;#039;[name=&amp;quot;&amp;#039; + $.attr(this, &amp;#039;href&amp;#039;).substr(1) + &amp;#039;&amp;quot;]&amp;#039;).offset().top&lt;br /&gt;
    }, 500);&lt;br /&gt;
&lt;br /&gt;
    return false;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Beispiel 1 (jQuery)  =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$(&amp;#039;a[href*=#]:not([href=#])&amp;#039;).click(function() {&lt;br /&gt;
    if (location.pathname.replace(/^\//,&amp;#039;&amp;#039;) == this.pathname.replace(/^\//,&amp;#039;&amp;#039;) &lt;br /&gt;
        || location.hostname == this.hostname) {&lt;br /&gt;
&lt;br /&gt;
        var target = $(this.hash);&lt;br /&gt;
        target = target.length ? target : $(&amp;#039;[name=&amp;#039; + this.hash.slice(1) +&amp;#039;]&amp;#039;);&lt;br /&gt;
           if (target.length) {&lt;br /&gt;
             $(&amp;#039;html,body&amp;#039;).animate({&lt;br /&gt;
                 scrollTop: target.offset().top&lt;br /&gt;
            }, 1000);&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Beispiel 2 (jQuery) mit Offset =====&lt;br /&gt;
statt &lt;br /&gt;
 .top&lt;br /&gt;
einfach&lt;br /&gt;
 .top-100&lt;br /&gt;
http://1stwebmagazine.com/jquery-scroll-to-anchor-point&lt;br /&gt;
&lt;br /&gt;
==== Smooth Scrolling mit Vanilla JS ====&lt;br /&gt;
 [[JavaScript - Smooth Scrolling]]&lt;br /&gt;
&lt;br /&gt;
===== Beispiel 3 Materialize Pushpin ToTop =====&lt;br /&gt;
jQuery Plugin enthalten in MaterializeCSS http://materializecss.com/pushpin.html&lt;br /&gt;
&lt;br /&gt;
Kann für ToTop Navigation oder Fixed Navigations etc. eingesetzt werden. Liegt im Verzeichnis js/pushpin geht aber nicht ohne weiteres Standalone&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//PUSHPIN TOTOP&lt;br /&gt;
$( document ).ready(function(){&lt;br /&gt;
  $(&amp;#039;.totop&amp;#039;).pushpin({&lt;br /&gt;
    top: 500,// distance where pin becomes fixed (class)- default 0&lt;br /&gt;
    bottom: &amp;#039;infinity&amp;#039;, // distance when pin stops being fixed - default infinity&lt;br /&gt;
    offset: 24 // style=&amp;quot;top:[offset]&amp;quot;&amp;quot;&amp;quot; - default 0&lt;br /&gt;
  })&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//You can remove pushpin and pushpin classes&lt;br /&gt;
$(&amp;#039;.tabs-wrapper .row&amp;#039;).pushpin(&amp;#039;remove&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
CSS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Class for when element is above threshold */&lt;br /&gt;
.pin-top {&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
/* Class for when element is below threshold*/&lt;br /&gt;
.pin-bottom {&lt;br /&gt;
  position: relative;&lt;br /&gt;
}&lt;br /&gt;
/* Class for when element is pinned */&lt;br /&gt;
.pinned {&lt;br /&gt;
  position: fixed !important;&lt;br /&gt;
  right: 24px;&lt;br /&gt;
  bottom: 24px;&lt;br /&gt;
  z-index: 9;&lt;br /&gt;
}&lt;br /&gt;
/* Only necessary for window height sized blocks. */&lt;br /&gt;
  html, body, .block {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Beispiel Markup für ToTop Navigation =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;a class=&amp;quot;anchor&amp;quot; name=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;!-- totop --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;totop&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;fa fa-angle-double-up fa-2x&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
  $(&amp;#039;.totop&amp;#039;).hide();&lt;br /&gt;
  $(window).scroll(function(){&lt;br /&gt;
    var value = 200; // Toplink beim vertikalen scrollen ab einem Wert von XXX &amp;#039;px&amp;#039; anzeigen&lt;br /&gt;
    var scrolling = $(window).scrollTop();&lt;br /&gt;
    if (scrolling &amp;gt; value) {&lt;br /&gt;
      $(&amp;#039;.totop&amp;#039;).fadeIn();&lt;br /&gt;
    } else {&lt;br /&gt;
      $(&amp;#039;.totop&amp;#039;).fadeOut();&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  $(&amp;#039;.totop&amp;#039;).click(function(){&lt;br /&gt;
    $(&amp;#039;html, body&amp;#039;).animate({scrollTop:&amp;#039;0px&amp;#039;}, 400);&lt;br /&gt;
    return false;&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Toggle ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;javascript:void(0);&amp;quot; class=&amp;quot;icon&amp;quot; onclick=&amp;quot;myFunction()&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;i class=&amp;quot;fa fa-bars&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
oder registrieren&lt;br /&gt;
&lt;br /&gt;
element.addEventListener(&amp;#039;click&amp;#039;, myFunctionReference , false);&lt;br /&gt;
&lt;br /&gt;
function toggleNavigation() {&lt;br /&gt;
  var x = document.getElementById(&amp;quot;#mobileNavigationPanel&amp;quot;);&lt;br /&gt;
  if (x.style.display === &amp;quot;block&amp;quot;) {&lt;br /&gt;
    x.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
  } else {&lt;br /&gt;
    x.style.display = &amp;quot;block&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zwischenablage (Clipboard) modifizieren ===&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/API/Element/copy_event&lt;br /&gt;
Mit dem Copy Event kann man die Zwischenablage modifizieren wenn der User etwas hineinkopiert. Z.B. könnte das ein Copyright Hinweis sein, den man anhängt.&lt;br /&gt;
&lt;br /&gt;
==== Beispiel - Uppercase ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;source&amp;quot; contenteditable=&amp;quot;true&amp;quot;&amp;gt;Try copying text from this box...&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;target&amp;quot; contenteditable=&amp;quot;true&amp;quot;&amp;gt;...and pasting it into this one&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
const source = document.querySelector(&amp;#039;div.source&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
source.addEventListener(&amp;#039;copy&amp;#039;, (event) =&amp;gt; {&lt;br /&gt;
    const selection = document.getSelection();&lt;br /&gt;
    event.clipboardData.setData(&amp;#039;text/plain&amp;#039;, selection.toString().toUpperCase());&lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel - Copyright Hinweis hinzufügen ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;box source&amp;quot; contenteditable=&amp;quot;true&amp;quot;&amp;gt;Kopiere Text aus dieser Box...&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;box target&amp;quot; contenteditable=&amp;quot;true&amp;quot;&amp;gt;...in diese Box!&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
    const source = document.querySelector(&amp;#039;div.source&amp;#039;);&lt;br /&gt;
    var today = new Date();&lt;br /&gt;
    var dd = String(today.getDate()).padStart(2, &amp;#039;0&amp;#039;);&lt;br /&gt;
    var mm = String(today.getMonth() + 1).padStart(2, &amp;#039;0&amp;#039;); //January is 0!&lt;br /&gt;
    var yyyy = today.getFullYear();&lt;br /&gt;
    copyDate = dd + &amp;#039;.&amp;#039; + mm + &amp;#039;.&amp;#039; + yyyy; &lt;br /&gt;
    copyHint = &amp;#039;\nQuelle: &amp;#039; + window.location.href + &amp;#039; (Zugriff am: &amp;#039; + copyDate + &amp;#039;)&amp;#039;; //href, hostname or pathname is possible&lt;br /&gt;
    source.addEventListener(&amp;#039;copy&amp;#039;, (event) =&amp;gt; {&lt;br /&gt;
        const selection = document.getSelection();&lt;br /&gt;
        event.clipboardData.setData(&amp;#039;text/plain&amp;#039;, selection.toString() + copyHint);&lt;br /&gt;
        event.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Must Know - Wichtige JavaScript Snippets und Konzepte ==&lt;br /&gt;
=== Seite geladen? ===&lt;br /&gt;
 https://www.mediaevent.de/javascript/onload.html&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 window.onload = function () {&lt;br /&gt;
        console.log(&amp;#039;Dokument geladen&amp;#039;);&lt;br /&gt;
        function init();&lt;br /&gt;
        function machwas();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seite und Bilder geladen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
window.addEventListener(&amp;#039;load&amp;#039;, function () {&lt;br /&gt;
  alert(&amp;quot;It&amp;#039;s loaded!&amp;quot;)&lt;br /&gt;
})&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 https://www.mediaevent.de/javascript/onload.html&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
let img = new Image;&lt;br /&gt;
&lt;br /&gt;
img.onload = function() {&lt;br /&gt;
   console.log (&amp;quot;Bild geladen&amp;quot;);&lt;br /&gt;
   elem.appendChild (img);&lt;br /&gt;
}&lt;br /&gt;
img.src = &amp;quot;little-snail.png&amp;quot;;  // erst nach dem Event Listener!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schriften geladen UND angewendet? ===&lt;br /&gt;
Siehe&lt;br /&gt;
 [[JavaScript - Webfont loaded?]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
fontsReady();&lt;br /&gt;
=== Seite verlassen ===&lt;br /&gt;
 https://www.mediaevent.de/javascript/onload.html&lt;br /&gt;
&lt;br /&gt;
=== Feature Detection ===&lt;br /&gt;
Herausfinden was ein Browser unterstützt und darauf reagieren.&lt;br /&gt;
 [[JavaScript - Feature Detection]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Dynamische_Schriftgr%C3%B6%C3%9Fe_-_dynamic_fontsize&amp;diff=26194</id>
		<title>Dynamische Schriftgröße - dynamic fontsize</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Dynamische_Schriftgr%C3%B6%C3%9Fe_-_dynamic_fontsize&amp;diff=26194"/>
		<updated>2022-09-03T11:16:45Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Dynamic font-size mit JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://css-tricks.com/fitting-text-to-a-container/&lt;br /&gt;
 https://codepen.io/chriscoyier/pen/mKXbwB&lt;br /&gt;
 https://github.com/rikschennink/fitty&lt;br /&gt;
== Only CSS ==&lt;br /&gt;
&lt;br /&gt;
== Dynamic font-size mit JavaScript ==&lt;br /&gt;
Z.b. mit fitty.js - fitty zieht eine Schrift auf die zur verfügung stehende Breite des Parent Containers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
async function fontsReady() {&lt;br /&gt;
  let ready = await document.fonts.ready; // promice&lt;br /&gt;
  console.log(&amp;#039;fonts ready&amp;#039; + ready);&lt;br /&gt;
  fitty(&amp;#039;.fitty&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fontsReady();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schöne Lösung für fitty. Alte Browser werden ohne Fallback ausgeschlossen. Das Basis CSS sollte also wenigstens ordentlich ausschauen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
  // no promise support (&amp;lt;=IE11)&lt;br /&gt;
  if (!(&amp;#039;Promise&amp;#039; in window)) {&lt;br /&gt;
      return;&lt;br /&gt;
  }&lt;br /&gt;
  async function fontsReady() {&lt;br /&gt;
    let ready = await document.fonts.ready; // promice&lt;br /&gt;
    console.log(&amp;#039;fonts ready&amp;#039; + ready);&lt;br /&gt;
    fitty(&amp;#039;.fitty&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  fontsReady();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder mit Fallback über FontFaceObserver (würde ich heute nicht mehr Anwenden für die paar veralteten Browser und wenn dann auf alle Fälle den FFO nicht über CDN laden.&lt;br /&gt;
Besser über CSS vernünftiges Styling, dass auch ohne JS ordentlich ausschaut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    /* Only set the custom font if it&amp;#039;s loaded and ready */&lt;br /&gt;
    .fonts-loaded .fit {&lt;br /&gt;
        font-family: &amp;#039;Oswald&amp;#039;, serif;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        // no promise support (&amp;lt;=IE11)&lt;br /&gt;
        if (!(&amp;#039;Promise&amp;#039; in window)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // called when all fonts loaded&lt;br /&gt;
        function redrawFitty() {&lt;br /&gt;
            document.documentElement.classList.add(&amp;#039;fonts-loaded&amp;#039;);&lt;br /&gt;
            fitty.fitAll();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // CSS Font Loading API&lt;br /&gt;
        function native() {&lt;br /&gt;
            // load our custom Oswald font&lt;br /&gt;
            var fontOswald = new FontFace(&amp;#039;Oswald&amp;#039;, &amp;#039;url(assets/oswald.woff2)&amp;#039;, {&lt;br /&gt;
                style: &amp;#039;normal&amp;#039;,&lt;br /&gt;
                weight: &amp;#039;400&amp;#039;,&lt;br /&gt;
            });&lt;br /&gt;
            document.fonts.add(fontOswald);&lt;br /&gt;
            fontOswald.load();&lt;br /&gt;
&lt;br /&gt;
            // if all fonts loaded redraw fitty&lt;br /&gt;
            document.fonts.ready.then(redrawFitty);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // FontFaceObserver&lt;br /&gt;
        function fallback() {&lt;br /&gt;
            var style = document.createElement(&amp;#039;style&amp;#039;);&lt;br /&gt;
            style.textContent =&lt;br /&gt;
                &amp;#039;@font-face { font-family: Oswald; src: url(assets/oswald.woff2) format(&amp;quot;woff2&amp;quot;);}&amp;#039;;&lt;br /&gt;
            document.head.appendChild(style);&lt;br /&gt;
&lt;br /&gt;
            var s = document.createElement(&amp;#039;script&amp;#039;);&lt;br /&gt;
            s.src =&lt;br /&gt;
                &amp;#039;https://cdnjs.cloudflare.com/ajax/libs/fontfaceobserver/2.0.13/fontfaceobserver.standalone.js&amp;#039;;&lt;br /&gt;
            s.onload = function () {&lt;br /&gt;
                new FontFaceObserver(&amp;#039;Oswald&amp;#039;).load().then(redrawFitty);&lt;br /&gt;
            };&lt;br /&gt;
            document.body.appendChild(s);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Does the current browser support the CSS Font Loading API?&lt;br /&gt;
        if (&amp;#039;fonts&amp;#039; in document) {&lt;br /&gt;
            native();&lt;br /&gt;
        } else {&lt;br /&gt;
            fallback();&lt;br /&gt;
        }&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Dynamische_Schriftgr%C3%B6%C3%9Fe_-_dynamic_fontsize&amp;diff=26193</id>
		<title>Dynamische Schriftgröße - dynamic fontsize</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Dynamische_Schriftgr%C3%B6%C3%9Fe_-_dynamic_fontsize&amp;diff=26193"/>
		<updated>2022-09-03T11:15:44Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „== Links ==  https://css-tricks.com/fitting-text-to-a-container/  https://codepen.io/chriscoyier/pen/mKXbwB  https://github.com/rikschennink/fitty == Only CSS…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://css-tricks.com/fitting-text-to-a-container/&lt;br /&gt;
 https://codepen.io/chriscoyier/pen/mKXbwB&lt;br /&gt;
 https://github.com/rikschennink/fitty&lt;br /&gt;
== Only CSS ==&lt;br /&gt;
&lt;br /&gt;
== Dynamic font-size mit JavaScript ==&lt;br /&gt;
Z.b. mit fitty.js - fitty zieht eine Schrift auf die zur verfügung stehende Breite des Parent Containers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
async function fontsReady() {&lt;br /&gt;
  let ready = await document.fonts.ready; // promice&lt;br /&gt;
  console.log(&amp;#039;fonts ready&amp;#039; + ready);&lt;br /&gt;
  fitty(&amp;#039;.fitty&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fontsReady();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder mit Ausschluss älterer Browser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
(function () {&lt;br /&gt;
  // no promise support (&amp;lt;=IE11)&lt;br /&gt;
  if (!(&amp;#039;Promise&amp;#039; in window)) {&lt;br /&gt;
      return;&lt;br /&gt;
  }&lt;br /&gt;
  async function fontsReady() {&lt;br /&gt;
    let ready = await document.fonts.ready; // promice&lt;br /&gt;
    console.log(&amp;#039;fonts ready&amp;#039; + ready);&lt;br /&gt;
    fitty(&amp;#039;.fitty&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  fontsReady();&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder mit Fallback über FontFaceObserver (würde ich heute nicht mehr Anwenden für die paar veralteten Browser und wenn dann auf alle Fälle den FFO nicht über CDN laden.&lt;br /&gt;
Besser über CSS vernünftiges Styling, dass auch ohne JS ordentlich ausschaut.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
    /* Only set the custom font if it&amp;#039;s loaded and ready */&lt;br /&gt;
    .fonts-loaded .fit {&lt;br /&gt;
        font-family: &amp;#039;Oswald&amp;#039;, serif;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    (function () {&lt;br /&gt;
        // no promise support (&amp;lt;=IE11)&lt;br /&gt;
        if (!(&amp;#039;Promise&amp;#039; in window)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // called when all fonts loaded&lt;br /&gt;
        function redrawFitty() {&lt;br /&gt;
            document.documentElement.classList.add(&amp;#039;fonts-loaded&amp;#039;);&lt;br /&gt;
            fitty.fitAll();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // CSS Font Loading API&lt;br /&gt;
        function native() {&lt;br /&gt;
            // load our custom Oswald font&lt;br /&gt;
            var fontOswald = new FontFace(&amp;#039;Oswald&amp;#039;, &amp;#039;url(assets/oswald.woff2)&amp;#039;, {&lt;br /&gt;
                style: &amp;#039;normal&amp;#039;,&lt;br /&gt;
                weight: &amp;#039;400&amp;#039;,&lt;br /&gt;
            });&lt;br /&gt;
            document.fonts.add(fontOswald);&lt;br /&gt;
            fontOswald.load();&lt;br /&gt;
&lt;br /&gt;
            // if all fonts loaded redraw fitty&lt;br /&gt;
            document.fonts.ready.then(redrawFitty);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // FontFaceObserver&lt;br /&gt;
        function fallback() {&lt;br /&gt;
            var style = document.createElement(&amp;#039;style&amp;#039;);&lt;br /&gt;
            style.textContent =&lt;br /&gt;
                &amp;#039;@font-face { font-family: Oswald; src: url(assets/oswald.woff2) format(&amp;quot;woff2&amp;quot;);}&amp;#039;;&lt;br /&gt;
            document.head.appendChild(style);&lt;br /&gt;
&lt;br /&gt;
            var s = document.createElement(&amp;#039;script&amp;#039;);&lt;br /&gt;
            s.src =&lt;br /&gt;
                &amp;#039;https://cdnjs.cloudflare.com/ajax/libs/fontfaceobserver/2.0.13/fontfaceobserver.standalone.js&amp;#039;;&lt;br /&gt;
            s.onload = function () {&lt;br /&gt;
                new FontFaceObserver(&amp;#039;Oswald&amp;#039;).load().then(redrawFitty);&lt;br /&gt;
            };&lt;br /&gt;
            document.body.appendChild(s);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Does the current browser support the CSS Font Loading API?&lt;br /&gt;
        if (&amp;#039;fonts&amp;#039; in document) {&lt;br /&gt;
            native();&lt;br /&gt;
        } else {&lt;br /&gt;
            fallback();&lt;br /&gt;
        }&lt;br /&gt;
    })();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26192</id>
		<title>JavaScript - Webfont loaded?</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26192"/>
		<updated>2022-09-03T10:58:14Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit den document ready events kommt man bei css fonts nicht weiter. Diese werden oft später zugeordnet. Daher kann es nachträglich noch zu Größenänderungen kommen, je nachdem wie eine Schrift gestaltet ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten das zu checken. Allerdings sind nicht alle - je nach Situation - geeignet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/ready&lt;br /&gt;
 https://portalzine.de/dev/options-to-detect-when-a-font-face-has-been-loaded/&lt;br /&gt;
 https://stackoverflow.com/questions/5680013/how-to-be-notified-once-a-web-font-has-loaded&lt;br /&gt;
 &lt;br /&gt;
== jQuery / fontSpy ==&lt;br /&gt;
Der Klassiker&lt;br /&gt;
&lt;br /&gt;
If your project uses jQuery, you could also use jQuery-FontSpy which also works in IE because it determines the font being loaded by watching for an element&amp;#039;s dimensions to change. Example usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
fontSpy(&amp;#039;Open Sans&amp;#039;, {&lt;br /&gt;
  success: function() {&lt;br /&gt;
    alert(&amp;#039;Font has been loaded&amp;#039;);&lt;br /&gt;
  },&lt;br /&gt;
  failure: function() {&lt;br /&gt;
    alert(&amp;#039;Font failed to load&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== document.fonts ==&lt;br /&gt;
Dieses Objekt steht eigentlich in allen Post IE Browsern zur Verfügung. Für IE gibt es Polyfills (nicht getestet)&lt;br /&gt;
&lt;br /&gt;
Vorsicht mit dem load Event. Dieser wird nicht immer ausgeführt. Keine Ahnung warum in manchen Fällen nicht (evtl. wg. Cache Vorgängen?)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26191</id>
		<title>JavaScript - Webfont loaded?</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JavaScript_-_Webfont_loaded%3F&amp;diff=26191"/>
		<updated>2022-09-03T10:56:56Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „Mit den document ready events kommt man bei css fonts nicht weiter. Diese werden oft später zugeordnet. Daher kann es nachträglich noch zu Größenänderunge…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mit den document ready events kommt man bei css fonts nicht weiter. Diese werden oft später zugeordnet. Daher kann es nachträglich noch zu Größenänderungen kommen, je nachdem wie eine Schrift gestaltet ist.&lt;br /&gt;
&lt;br /&gt;
Es gibt mehrere Möglichkeiten das zu checken. Allerdings sind nicht alle - je nach Situation - geeignet.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/ready&lt;br /&gt;
 https://portalzine.de/dev/options-to-detect-when-a-font-face-has-been-loaded/&lt;br /&gt;
 https://stackoverflow.com/questions/5680013/how-to-be-notified-once-a-web-font-has-loaded&lt;br /&gt;
 &lt;br /&gt;
== jQuery / fontSpy ==&lt;br /&gt;
Der Klassiker&lt;br /&gt;
&lt;br /&gt;
If your project uses jQuery, you could also use jQuery-FontSpy which also works in IE because it determines the font being loaded by watching for an element&amp;#039;s dimensions to change. Example usage:&lt;br /&gt;
&lt;br /&gt;
fontSpy(&amp;#039;Open Sans&amp;#039;, {&lt;br /&gt;
  success: function() {&lt;br /&gt;
    alert(&amp;#039;Font has been loaded&amp;#039;);&lt;br /&gt;
  },&lt;br /&gt;
  failure: function() {&lt;br /&gt;
    alert(&amp;#039;Font failed to load&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
== document.fonts ==&lt;br /&gt;
Dieses Objekt steht eigentlich in allen Post IE Browsern zur Verfügung. Für IE gibt es Polyfills (nicht getestet)&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=26190</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=26190"/>
		<updated>2022-09-03T08:43:19Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Der Beginn */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
&lt;br /&gt;
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery&lt;br /&gt;
&lt;br /&gt;
Gut durchlesen, hier werden die meisten Basics angesprochen.&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[jQuery or Vanilla JS]]&lt;br /&gt;
Elemente auswählen: http://docs.jquery.com/DOM/Traversing/Selectors&lt;br /&gt;
&lt;br /&gt;
Ereignisse: http://docs.jquery.com/Events&lt;br /&gt;
&lt;br /&gt;
Gute Tools out of the Box:&lt;br /&gt;
Erste Wahl mit allem was man so braucht sind die jQuery Tools:&lt;br /&gt;
&lt;br /&gt;
http://flowplayer.org/tools/index.html &lt;br /&gt;
&lt;br /&gt;
Oder in Kurzform hier: [[JQuery Tools (flowplayer.org)]]&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
Validierung mit jQuery: [[Validate (jQuery Plugin)]]&lt;br /&gt;
&lt;br /&gt;
==Einbinden==&lt;br /&gt;
Es gibt die Core Datei und einige nützliche Erweiterungen die man sich passend zusammestellen kann um die Download Größe klein zu halten. Außerdem gibt es gepackte Versionen.&lt;br /&gt;
&lt;br /&gt;
===Über Google===&lt;br /&gt;
&lt;br /&gt;
Hinweis: Google gibt an man solle zuerst den API Code übergeben damit es funktioniert (Obsolet). Der direkte Zugriff funktioniert aber auch ohne. Vielleicht geht es nicht wenn man die google. load Funktion nutzt (hier nicht weiter behandelt) .&lt;br /&gt;
&lt;br /&gt;
Beispiel API Code Übergabe:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi?key=INSERT-YOUR-KEY&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ui steht für User Interface (Plugins)&lt;br /&gt;
&lt;br /&gt;
=== Über jQuery Server ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Libary auf eigenem Server ===&lt;br /&gt;
==== Geo-bit webmynet ====&lt;br /&gt;
ToDo -&amp;gt; Idee ist verschiedene libs auf tools.webmynet.de vorzuhalten ähnlich wie sie auf dem Google Server liegen.&lt;br /&gt;
Zweck: einfache Einbindung, Statistik, Testing&lt;br /&gt;
&lt;br /&gt;
=== Typo3 ===&lt;br /&gt;
siehe JavaScript Frameworks nutzen&lt;br /&gt;
&lt;br /&gt;
== Der Beginn ==&lt;br /&gt;
In der Regel soll es losgehen, sobald das Dokument geladen ist (weil dies für manche Manipulationen notwendig ist) Deshalb beginnt man i.d.R. mit einem Onload Event:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder Abgekürzt&lt;br /&gt;
&lt;br /&gt;
 $(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Stiftet manchmal Verwirrung. Es gibt einige Möglichkeiten in der Syntax für den ready handler:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $( handler )&lt;br /&gt;
    $( document ).ready( handler )&lt;br /&gt;
    $( &amp;quot;document&amp;quot; ).ready( handler )&lt;br /&gt;
    $( &amp;quot;img&amp;quot; ).ready( handler )&lt;br /&gt;
    $().ready( handler )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Document ready oder window ready ? ===&lt;br /&gt;
$(document).ready... wartet bis alle Elemente im HTML soweit geladen sind und startet mit der Ausführung der Skripte. Bilder etc. werden im Laufe der Zeit nachgeladen. Soll die Ausführung auf die Bilder warten geht das anders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
  // wait til DOM is ready and do s.th.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(window).on(&amp;quot;load&amp;quot;, function() {&lt;br /&gt;
    // wait till everything (inkl. Images) is loaded and do s.th.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reagieren auf Klick ==&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).click(function() {&lt;br /&gt;
     alert(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  $(&amp;quot;a&amp;quot;)&lt;br /&gt;
bedeutet Das was jetzt kommt gilt für alle Links &lt;br /&gt;
 .click()&lt;br /&gt;
es soll bei Klick etwas passieren&lt;br /&gt;
&lt;br /&gt;
Früher hat man das so gelöst:&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;quot; onclick=&amp;quot;alert(&amp;#039;Hello world&amp;#039;)&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&lt;br /&gt;
Das funktioniert, allerdings muß man hier bei jedem Link den Schnipsel einfügen.&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf Elemente ==&lt;br /&gt;
Old School:&lt;br /&gt;
 document.getElementById(&amp;quot;orderedlist&amp;quot;)&lt;br /&gt;
Mit JQuery analog zu obigem Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).addClass(&amp;quot;red&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird noch eine Klasse eingebaut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $(&amp;quot;#orderedlist &amp;gt; li&amp;quot;)&lt;br /&gt;
Alle Listenelemente unterhalb #orderedlist&lt;br /&gt;
 #orderedlist li:last&lt;br /&gt;
Hier ist nur das letzte Listenelement gemeint.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist li:last&amp;quot;).hover(function() {&lt;br /&gt;
     $(this).addClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).removeClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Hoverfunktion kann zwei Funktionen als Parameter aufnehmen.&lt;br /&gt;
&lt;br /&gt;
== Elemente manipulieren, hinzufügen, entfernen ==&lt;br /&gt;
=== jQuery - Animation ===&lt;br /&gt;
[[jQuery - Animation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
 find()&lt;br /&gt;
 addClass()&lt;br /&gt;
 removeClass()&lt;br /&gt;
 hover()&lt;br /&gt;
 each()&lt;br /&gt;
 append()&lt;br /&gt;
&lt;br /&gt;
== Ereignisse ==&lt;br /&gt;
[[jQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
== AJAX ==&lt;br /&gt;
[[jQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
== Funktionen in jQuery definieren (5 Wege) ==&lt;br /&gt;
[[Funktionen in jQuery]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Find some li s and append Text&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).find(&amp;quot;li&amp;quot;).each(function(i) {&lt;br /&gt;
     $(this).append( &amp;quot; BAM! &amp;quot; + i );&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;a[href*=/content/gallery]&amp;quot;).click(function() {&lt;br /&gt;
     // do something with all links that point somewhere to /content/gallery&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset a single form&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;)[0].reset();&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset several forms at once&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;).each(function() {&lt;br /&gt;
       this.reset();&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find li elements that does NOT have a parent ul&lt;br /&gt;
   $(document).ready(function() {&lt;br /&gt;
     $(&amp;quot;li&amp;quot;).not(&amp;quot;:has(ul)&amp;quot;).css(&amp;quot;border&amp;quot;, &amp;quot;1px solid black&amp;quot;); &lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find elements with a name attribute&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
      $(&amp;quot;a[name]&amp;quot;).css(&amp;quot;background&amp;quot;, &amp;quot;#eee&amp;quot; );&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
   // Grab the parent&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).hover(function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).addClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).removeClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testen ob jQuery geladen ist ===&lt;br /&gt;
Testen ob geladen, wenn nicht von google holen, wenn nicht verfügbar lokale Version nehmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuerySrc = &amp;#039;fileadmin/js/jquery-min.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// only load jQuery if not present&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;)  {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// if Google is down&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;&amp;quot; + jQuerySrc + &amp;quot;\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Probleme Lösen ==&lt;br /&gt;
[[jQuery - Probleme lösen (Troubleshooting)]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=26189</id>
		<title>JQuery</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery&amp;diff=26189"/>
		<updated>2022-09-03T08:42:35Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Der Beginn */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Quickstart==&lt;br /&gt;
&lt;br /&gt;
http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery&lt;br /&gt;
&lt;br /&gt;
Gut durchlesen, hier werden die meisten Basics angesprochen.&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
 [[jQuery or Vanilla JS]]&lt;br /&gt;
Elemente auswählen: http://docs.jquery.com/DOM/Traversing/Selectors&lt;br /&gt;
&lt;br /&gt;
Ereignisse: http://docs.jquery.com/Events&lt;br /&gt;
&lt;br /&gt;
Gute Tools out of the Box:&lt;br /&gt;
Erste Wahl mit allem was man so braucht sind die jQuery Tools:&lt;br /&gt;
&lt;br /&gt;
http://flowplayer.org/tools/index.html &lt;br /&gt;
&lt;br /&gt;
Oder in Kurzform hier: [[JQuery Tools (flowplayer.org)]]&lt;br /&gt;
&lt;br /&gt;
[[jQuery - Snippets]]&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
Validierung mit jQuery: [[Validate (jQuery Plugin)]]&lt;br /&gt;
&lt;br /&gt;
==Einbinden==&lt;br /&gt;
Es gibt die Core Datei und einige nützliche Erweiterungen die man sich passend zusammestellen kann um die Download Größe klein zu halten. Außerdem gibt es gepackte Versionen.&lt;br /&gt;
&lt;br /&gt;
===Über Google===&lt;br /&gt;
&lt;br /&gt;
Hinweis: Google gibt an man solle zuerst den API Code übergeben damit es funktioniert (Obsolet). Der direkte Zugriff funktioniert aber auch ohne. Vielleicht geht es nicht wenn man die google. load Funktion nutzt (hier nicht weiter behandelt) .&lt;br /&gt;
&lt;br /&gt;
Beispiel API Code Übergabe:&lt;br /&gt;
 &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://www.google.com/jsapi?key=INSERT-YOUR-KEY&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ui steht für User Interface (Plugins)&lt;br /&gt;
&lt;br /&gt;
=== Über jQuery Server ===&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;script src=&amp;quot;http://code.jquery.com/jquery-latest.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Libary auf eigenem Server ===&lt;br /&gt;
==== Geo-bit webmynet ====&lt;br /&gt;
ToDo -&amp;gt; Idee ist verschiedene libs auf tools.webmynet.de vorzuhalten ähnlich wie sie auf dem Google Server liegen.&lt;br /&gt;
Zweck: einfache Einbindung, Statistik, Testing&lt;br /&gt;
&lt;br /&gt;
=== Typo3 ===&lt;br /&gt;
siehe JavaScript Frameworks nutzen&lt;br /&gt;
&lt;br /&gt;
== Der Beginn ==&lt;br /&gt;
In der Regel soll es losgehen, sobald das Dokument geladen ist (weil dies für manche Manipulationen notwendig ist) Deshalb beginnt man i.d.R. mit einem Onload Event:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder Abgekürzt&lt;br /&gt;
&lt;br /&gt;
 $(function() {&lt;br /&gt;
   // do stuff when DOM is ready&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Stiftet manchmal Verwirrung. Es gibt einige Möglichkeiten in der Syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    $( handler )&lt;br /&gt;
    $( document ).ready( handler )&lt;br /&gt;
    $( &amp;quot;document&amp;quot; ).ready( handler )&lt;br /&gt;
    $( &amp;quot;img&amp;quot; ).ready( handler )&lt;br /&gt;
    $().ready( handler )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Document ready oder window ready ? ===&lt;br /&gt;
$(document).ready... wartet bis alle Elemente im HTML soweit geladen sind und startet mit der Ausführung der Skripte. Bilder etc. werden im Laufe der Zeit nachgeladen. Soll die Ausführung auf die Bilder warten geht das anders:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function() {&lt;br /&gt;
  // wait til DOM is ready and do s.th.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(window).on(&amp;quot;load&amp;quot;, function() {&lt;br /&gt;
    // wait till everything (inkl. Images) is loaded and do s.th.&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reagieren auf Klick ==&lt;br /&gt;
Siehe auch:&lt;br /&gt;
&lt;br /&gt;
[[JQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).click(function() {&lt;br /&gt;
     alert(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
  $(&amp;quot;a&amp;quot;)&lt;br /&gt;
bedeutet Das was jetzt kommt gilt für alle Links &lt;br /&gt;
 .click()&lt;br /&gt;
es soll bei Klick etwas passieren&lt;br /&gt;
&lt;br /&gt;
Früher hat man das so gelöst:&lt;br /&gt;
  &amp;lt;a href=&amp;quot;&amp;quot; onclick=&amp;quot;alert(&amp;#039;Hello world&amp;#039;)&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&lt;br /&gt;
Das funktioniert, allerdings muß man hier bei jedem Link den Schnipsel einfügen.&lt;br /&gt;
&lt;br /&gt;
== Zugriff auf Elemente ==&lt;br /&gt;
Old School:&lt;br /&gt;
 document.getElementById(&amp;quot;orderedlist&amp;quot;)&lt;br /&gt;
Mit JQuery analog zu obigem Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).addClass(&amp;quot;red&amp;quot;);&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird noch eine Klasse eingebaut&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Weitere Beispiele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
  $(&amp;quot;#orderedlist &amp;gt; li&amp;quot;)&lt;br /&gt;
Alle Listenelemente unterhalb #orderedlist&lt;br /&gt;
 #orderedlist li:last&lt;br /&gt;
Hier ist nur das letzte Listenelement gemeint.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(document).ready(function() {&lt;br /&gt;
   $(&amp;quot;#orderedlist li:last&amp;quot;).hover(function() {&lt;br /&gt;
     $(this).addClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).removeClass(&amp;quot;green&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
 });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Die Hoverfunktion kann zwei Funktionen als Parameter aufnehmen.&lt;br /&gt;
&lt;br /&gt;
== Elemente manipulieren, hinzufügen, entfernen ==&lt;br /&gt;
=== jQuery - Animation ===&lt;br /&gt;
[[jQuery - Animation]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
 find()&lt;br /&gt;
 addClass()&lt;br /&gt;
 removeClass()&lt;br /&gt;
 hover()&lt;br /&gt;
 each()&lt;br /&gt;
 append()&lt;br /&gt;
&lt;br /&gt;
== Ereignisse ==&lt;br /&gt;
[[jQuery - Events]]&lt;br /&gt;
&lt;br /&gt;
== AJAX ==&lt;br /&gt;
[[jQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
== Funktionen in jQuery definieren (5 Wege) ==&lt;br /&gt;
[[Funktionen in jQuery]]&lt;br /&gt;
&lt;br /&gt;
== Weitere Beispiele ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   // Find some li s and append Text&lt;br /&gt;
   $(&amp;quot;#orderedlist&amp;quot;).find(&amp;quot;li&amp;quot;).each(function(i) {&lt;br /&gt;
     $(this).append( &amp;quot; BAM! &amp;quot; + i );&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   $(&amp;quot;a[href*=/content/gallery]&amp;quot;).click(function() {&lt;br /&gt;
     // do something with all links that point somewhere to /content/gallery&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset a single form&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;)[0].reset();&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   // use this to reset several forms at once&lt;br /&gt;
   $(&amp;quot;#reset&amp;quot;).click(function() {&lt;br /&gt;
     $(&amp;quot;form&amp;quot;).each(function() {&lt;br /&gt;
       this.reset();&lt;br /&gt;
     });&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find li elements that does NOT have a parent ul&lt;br /&gt;
   $(document).ready(function() {&lt;br /&gt;
     $(&amp;quot;li&amp;quot;).not(&amp;quot;:has(ul)&amp;quot;).css(&amp;quot;border&amp;quot;, &amp;quot;1px solid black&amp;quot;); &lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
   // Find elements with a name attribute&lt;br /&gt;
    $(document).ready(function() {&lt;br /&gt;
      $(&amp;quot;a[name]&amp;quot;).css(&amp;quot;background&amp;quot;, &amp;quot;#eee&amp;quot; );&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
   // Grab the parent&lt;br /&gt;
   $(&amp;quot;a&amp;quot;).hover(function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).addClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   },function(){&lt;br /&gt;
     $(this).parents(&amp;quot;p&amp;quot;).removeClass(&amp;quot;highlight&amp;quot;);&lt;br /&gt;
   });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testen ob jQuery geladen ist ===&lt;br /&gt;
Testen ob geladen, wenn nicht von google holen, wenn nicht verfügbar lokale Version nehmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jQuerySrc = &amp;#039;fileadmin/js/jquery-min.js&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// only load jQuery if not present&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;)  {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// if Google is down&lt;br /&gt;
if (typeof jQuery == &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script type=\&amp;quot;text/javascript\&amp;quot; src=\&amp;quot;&amp;quot; + jQuerySrc + &amp;quot;\&amp;quot;&amp;gt;&amp;lt;/&amp;quot;+&amp;quot;script&amp;gt;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting - Probleme Lösen ==&lt;br /&gt;
[[jQuery - Probleme lösen (Troubleshooting)]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=26188</id>
		<title>ProcessWire - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=26188"/>
		<updated>2022-09-02T08:28:47Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* $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;
== 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;
== $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;
== ProcessWire - Debugging Snippets ==&lt;br /&gt;
[[ProcessWire - Debugging Snippets]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26187</id>
		<title>E-Mail Probleme beheben</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26187"/>
		<updated>2022-08-29T13:03:01Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 [[TYPO3 - E-Mail]]&lt;br /&gt;
 https://it-stack.de/30/05/2018/anti-spam-basics-fuer-versender-spf-dkim-dmarc-mehr/&lt;br /&gt;
== Testtools ==&lt;br /&gt;
 https://mxtoolbox.com/SuperTool.aspx&lt;br /&gt;
&lt;br /&gt;
== Spam Codes ==&lt;br /&gt;
 https://www.futurequest.net/docs/SA/ (Spam Assasin Liste mit Scorewerten)&lt;br /&gt;
Codes die den Spam Level verändern können&lt;br /&gt;
 FREEMAIL_FORGED_REPLYTO -&amp;gt; Freemail in Reply-To, aber nicht in From&lt;br /&gt;
 HEADER_FROM_DIFFERENT_DOMAINS&lt;br /&gt;
 HTML_MESSAGE&lt;br /&gt;
 RCVD_IN_DNSWL_NONE&lt;br /&gt;
 RDNS_NONE - hoher Score: Delivered to internal network by a host with no rDNS&lt;br /&gt;
 SPF_HELO_NONE - kein spf eintrag nicht so schlimm&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
Make sure you have SPF, DMARC, DKIM, and sign up for their JMRP and SDNS they will tell you.&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/kas/tools/dns-werkzeuge/spf_482.html&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SPF, Sender Policy Framework&amp;#039;&amp;#039;&amp;#039;, ist ein Standard zur Überprüfung des Absenders einer E-Mail und &amp;#039;&amp;#039;&amp;#039;vermutlich der wichtigste Anti-Spam-Indikator&amp;#039;&amp;#039;&amp;#039;. SPF ist ein TXT-Eintrag im DNS der Absender-Domain und leicht zu setzen. &lt;br /&gt;
&lt;br /&gt;
Etwas mehr Wissen erfordert unter Umständen das &amp;#039;&amp;#039;&amp;#039;Generieren des TXT Eintrags&amp;#039;&amp;#039;&amp;#039;. Hier muss beachtet werden, welche Mailserver und Maildienste für das Versenden der Mails benutzt werden. Wenn ich den Mailserver meines Webhosters nutze, jedoch Mails über die Googlemail Weboberfläche schicke (E-Mail über SMTP eingebunden), muss ich das im SPF-Eintrag beachten. Hierzu gibt es von fast allen Anbietern entsprechende Infos/Hilfeseiten, etwas googeln hilft hier schnell.&lt;br /&gt;
&lt;br /&gt;
Ein beispielhafter SPF-Eintrag, der Google als Relay inkludiert, könnte so aussehen:&lt;br /&gt;
 v=spf1 a mx include:_spf.google.com ~all&lt;br /&gt;
* Kein ptr im SPF eintragen, wenn MX gesetzt ist, auch wenn das viele Generatoren immernoch machen. &lt;br /&gt;
* Überprüfung mit SPF Check der MXToolBox. Weitere Infos findet ihr bestimmt in der Hilfe eures Maildienstleisters/Hosters mit der Suche nach „SPF“.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
Erklärungen zur Syntax von SPF:&lt;br /&gt;
&lt;br /&gt;
Am Anfang des SPF Records wird mit v= die SPF-Version festgelegt. Bislang gibt es nur spf1. Danach werden üblicherweise Direktiven angegeben. Diese bestehen aus einem optionalen Qualifikator und einem Mechanismus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Qualifikatoren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 + Pass - autorisierte Sender, daher Annahme der E-Mail; Standard, wenn kein Qualifikator explizit angegeben wird&lt;br /&gt;
 - Fail - nicht autorisierte Sender, daher Abweisung der E-Mail&lt;br /&gt;
 ~ SoftFail - nicht autorisierte Sender, E-Mail wird trotzdem angenommen, kann jedoch z.b. als Spam markiert werden&lt;br /&gt;
 ? Neutral - Sender, über deren Gültigkeit nichts gesagt werden kann und die akzeptiert werden müssen, daher Annahme der E-Mail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gängige Mechanismen (=Befehle):&lt;br /&gt;
&lt;br /&gt;
 a               A-/AAAA-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 mx              MX-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ptr             PTR-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ip4             IPv4-Adresse oder IPv4-Subnetz&lt;br /&gt;
 ip6             IPv6-Adresse oder IPv6-Subnetz&lt;br /&gt;
 include         SPF-Abfrage der angegebenen Domain, diese sollte einen gültigen SPF-Record besitzen&lt;br /&gt;
 all             immer&lt;br /&gt;
&lt;br /&gt;
Sofern für einen Mechanismus ein Argument übergeben werden soll, dann trennen Sie dies mit einem Doppelpunkt.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Beispiel für einen sehr gängigen Eintrag&lt;br /&gt;
 v=spf1 mx a -all&lt;br /&gt;
Dieser bedeutet, dass für alle E-Mails, die von Sendern kommen, die sich nicht aus dem A- bzw. MX-Record des DNS ergeben, ein negatives Ergebnis zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
 v=spf1 a:mail.example.org -all&lt;br /&gt;
Mails erlaubt, wenn sie aus den DNS Einträgen der Hauptdomain hervorgehen (-all) oder wenn es vom Server mit dem A-Record zu mail.example.org gehört.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Server im SPF Eintrag ==&lt;br /&gt;
Möchten Sie die &amp;#039;&amp;#039;&amp;#039;IP eines E-Mail-Server&amp;#039;&amp;#039;&amp;#039; in einen SPF-Eintrag aufnehmen, geben Sie vor dem Argument ~all die IP-Adresse des Servers ein. Verwenden Sie das &amp;#039;&amp;#039;&amp;#039;Format ip4:Adresse oder ip6:Adresse&amp;#039;&amp;#039;&amp;#039;, wie in diesem Beispiel:&lt;br /&gt;
 v=spf1 ip4:172.16.254.1 include:_spf.google.com ~all&lt;br /&gt;
Soll die &amp;#039;&amp;#039;&amp;#039;Domain eines E-Mail-Servers&amp;#039;&amp;#039;&amp;#039; hinzugefügt werden, verwenden Sie für jede Domain eine &amp;quot;&amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;&amp;quot;-Anweisung. Beispiel:&lt;br /&gt;
 v=spf1 include:serverdomain.com include:_spf.google.com ~all&lt;br /&gt;
&lt;br /&gt;
=== SPF-Beispiele ===&lt;br /&gt;
 https://stackoverflow.com/questions/14261214/too-many-dns-lookups-in-an-spf-record?rq=1&lt;br /&gt;
==== Amazon SES ====&lt;br /&gt;
Here are the TXT records we currently use successfully for Amazon SES as per Authenticating Your Email Address and (it&amp;#039;s indeed unfortunate that their documentation doesn&amp;#039;t address the quoting needs):&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;v=spf1 include:amazonses.com ~all&amp;quot;&lt;br /&gt;
 &amp;quot;spf2.0/pra include:amazonses.com ~all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== DKIM ==&lt;br /&gt;
DKIM Signiert die Mails, so kann der Empfänger kontrollieren, ob der Inhalt unverändert ankommt. Also erstmal kein Spam Tool.&lt;br /&gt;
&lt;br /&gt;
DKIM, DomainKeys Identified Mail (Standard, Wikipedia), ist wie SPF ebenfalls ein Protokoll zur Überprüfung von eingehenden Mails und deren unverändertem Inhalt.&lt;br /&gt;
DKIM nutzt zur Überprüfung eine asymmetrische Verschlüsselungstechnik mit zwei Schlüsseln – einem privaten Schlüssel, der Mails unsichtbar angehängt wird und einem öffentlichen Schlüssel, abgelegt im DNS des Absenders. &lt;br /&gt;
&lt;br /&gt;
Somit kann der Empfänger-Mailserver die Schlüssel aus dem Absender DNS und der Mail-Signatur gegeneinander prüfen und validieren. Das Hinzufügen des privaten Schlüssels in den Mailserver, damit dieser unsichtbar alle ausgehenden Mails damit signiert, erfordert eine fortgeschrittene Anpassung des Mailservers bzw. Konfiguration des Mailers und übersteigt den Rahmen dieses Artikels. Für GMail-Nutzer hilft die Google DKIM Step-by-Step-Anleitung, ansonsten wieder beim Anbieter/Hoster in der Hilfe schauen bzw. Support fragen.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil besteht aus einem TXT DNS Record, der zuvor generiert werden muss. Benötigt wird dafür die Domain und ein „Selektor“; eine beliebige Zeichenkette, z.B. „meindkim1“. Der Record sollte immer mit v=DKIM1;k=rsa;p= anfangen! Selbst wenn die Generatoren gerne einen der Parameter v oder k weglassen, oder diese als optional angeben, sollten beide gesetzt sein. Info: Beide Überprüfungs-Tools (MxToolBox und GSuite MX-Check) bestätigen einen validen DKIM übrigens nur mit Parametern v UND k, Warnungen falls einer fehlt. Die Überprüfung von DKIM erfordert dann ebenfalls Domain und Selektor und sollte anschließend positiv ausfallen.&lt;br /&gt;
&lt;br /&gt;
Aber Achtung: Ausschließlich den DKIM DNS Eintrag zu setzen, ohne die Mails zu signieren, hat keine weiteren positiven Auswirkungen (meistens aber auch keine negativen) und ist daher nicht zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
=== DKIM bei all-inkl aktivieren ===&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/providerwechsel/einrichtung/dns/dkim-bei-versand-ueber-unsere-mailserver_541.html&lt;br /&gt;
* In den Domaineinstellungen DKIM aktivieren. &lt;br /&gt;
* Der passende DNS Eintrag wird automatisch ergänzt und sieht ungefähr so aus:&lt;br /&gt;
 Name: kas202005201235._domainkey.meineDomain.de&lt;br /&gt;
 Typ: TXT&lt;br /&gt;
 Eintrag: v=DKIM1; k=rsa; p=MIIB[MEHR SCHLÜSSELINHALT]QAB&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
 https://elasticemail.com/dmarc (Generator für DMARC Einträge)&lt;br /&gt;
&lt;br /&gt;
DMARC, Domain-based Message Authentication, Reporting, and Conformance (Standard, Wikipedia)&lt;br /&gt;
&lt;br /&gt;
Technologie zur Erweiterung von SPF und DKIM. Geliefert werden zusätzliche Informationen, wie der Empfängerserver mit geprüften Mails umgehen soll sowie die Möglichkeit von Reports der Überprüfungen. &lt;br /&gt;
&lt;br /&gt;
Auch hier ein DNS TXT Eintrag, der die Infos liefert. Zwei grundlegende Fragen müsst ihr euch stellen:&lt;br /&gt;
# Wie sollen Mails behandelt werden, deren SPF/DKIM-Überprüfung fehlschlägt? Ignorieren / Spam / Abweisen.&lt;br /&gt;
# Sollen Daten und fehlgeschlagene Überprüfungen als Reports verschickt werden und an welche Mail-Adresse?&lt;br /&gt;
&lt;br /&gt;
Solltet ihr mit „Ignorieren“ dem Empfangsserver kein Verhalten vorschreiben wollen und auch keinerlei Reporting wünschen (v=DMARC1;p=none;), erfüllt DMARC keinen Zweck und hat auch keine weiteren Effekte auf den Mailempfang, kann also ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
Restriktiveres Verhalten oder Reporting gewünscht? Dann wird einer der vielen existierenden Generatoren aus den gewählten Optionen einen einfachen bis recht komplexen TXT Record erstellen:&lt;br /&gt;
 v=DMARC1; p=none; rua=mailto:admin@it-stack.de; ruf=mailto:admin@it-stack.de; fo=1;&lt;br /&gt;
Dieser Eintrag schickt Reportings an mich, wenn SPF oder DKIM fehlschlägt sowie generelle Reports, der Mailserver soll die Fehlschläge jedoch wie gewohnt behandeln, ich gebe kein strikteres Vorgehen vor.&lt;br /&gt;
&lt;br /&gt;
== Blacklists ==&lt;br /&gt;
Es gibt eine Vielzahl von professionell betriebenen Anti-Spam-Listen, also Blacklists, die von Mailservern zur weiteren Überprüfung abgefragt werden können. Ob mein Mailserver auf einer Blacklist steht, kann ich beispielsweise mit der MxToolBox Blacklist Suche herausfinden. Gebt hier eure Domain ein und eine Auswertung von über 100 Blackslists wird eventuelle Funde aufzeigen. Solltet euer Mailserver nicht die IP eurer Domain teilen oder weitere in das Mailing involvierten MX-Server-IPs bekannt sein, diese am besten auch noch testen.&lt;br /&gt;
Eure Domain/IP ist in einer Blacklist gefunden worden? Das ist unpraktisch, kann aber mal passieren. Geblacklistet werden für gewöhnlich ganze Server. Auf einem Shared Server, wie das bei Webhosting fast immer der Fall ist, sind, je nach Vertrag, 20 bis 100 weitere Kunden untergebracht. Die Chance, dass ein anderer Kunde für das Blacklisting verantwortlich ist, ist hoch.&lt;br /&gt;
Was tun? Auf der Betreiberseite der Blacklist gibt es meistens Suchen/Informationsportale, in denen Blacklist-Kandidaten, teilweise mit mehr Details und Begründung, gesucht werden können. Ich empfehle zwei Recherchen: Suche nach der Domain und nach der/den IPs.&lt;br /&gt;
So kann es sein, dass die IP-Adresse des Servers in mehreren Einträgen gefunden wird (Reportfunde bei Spamhaus ZEN: Link1, Link2, in welchen wiederum eure Domain nicht erwähnt wird), für die Domain jedoch kein Eintrag vorhanden ist. Das sind weitere Hinweise darauf, dass nicht ihr, sondern ein anderer Kunde des Servers Schuld hat.&lt;br /&gt;
Unabhängig von diesen Recherchen könnt ihr vermutlich wenig gegen das Blacklisting tun. Manche Betreiber bieten Unblock Formulare an, andere nicht. Informiert auf jeden Fall euren Webhoster/Mailing-Anbieter mit allen herausgefundenen Informationen über das Blacklisting – dieser hat für gewöhnlich andere Optionen und kann direkt selbst in die Behandlung der Problemursache, also gegen entsprechende Kunden, vorgehen.&lt;br /&gt;
&lt;br /&gt;
== User Trust ==&lt;br /&gt;
Desweiteren hilft es, sich zusätzlich Trust über den User/Empfänger zu holen – beispielsweise durch das Hinzufügen eurer Absenderadresse zu den Kontakten, das Markieren der Nachrichten als „Wichtig“ oder Versehen mit Sternchen/Markern (je nach Client heißt das anders), den Absender „Nie als Spam markieren“ (ebenfalls je Client anders) und mehr. Alles, was man mit einer Mail oder einem Absender bei dem jeweiligen Anbieter des Empfängers tun kann, dass letztlich einen positiven Effekt hat. Die Anbieter speichern solche Informationen (wie oft wurde eine Mail mit Inhalt X positiv behandelt, wie oft der Absender usw.) und behandeln Mails dieses Absenders zukünftig besser. Diese Maßnahme kann man bis zu einer gewissen Anzahl mit den eigenen Mitarbeitern starten – Mails an ihre private Mailadresse schicken, bestenfalls bei unterschiedlichen Anbietern, und die Mails von ihnen „positiv behandeln“ lassen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26186</id>
		<title>E-Mail Probleme beheben</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=E-Mail_Probleme_beheben&amp;diff=26186"/>
		<updated>2022-08-29T13:01:44Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* SPF */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 [[TYPO3 - E-Mail]]&lt;br /&gt;
 https://it-stack.de/30/05/2018/anti-spam-basics-fuer-versender-spf-dkim-dmarc-mehr/&lt;br /&gt;
== Testtools ==&lt;br /&gt;
 https://mxtoolbox.com/SuperTool.aspx&lt;br /&gt;
&lt;br /&gt;
== Spam Codes ==&lt;br /&gt;
 https://www.futurequest.net/docs/SA/ (Spam Assasin Liste mit Scorewerten)&lt;br /&gt;
Codes die den Spam Level verändern können&lt;br /&gt;
 FREEMAIL_FORGED_REPLYTO -&amp;gt; Freemail in Reply-To, aber nicht in From&lt;br /&gt;
 HEADER_FROM_DIFFERENT_DOMAINS&lt;br /&gt;
 HTML_MESSAGE&lt;br /&gt;
 RCVD_IN_DNSWL_NONE&lt;br /&gt;
 RDNS_NONE - hoher Score: Delivered to internal network by a host with no rDNS&lt;br /&gt;
 SPF_HELO_NONE - kein spf eintrag nicht so schlimm&lt;br /&gt;
&lt;br /&gt;
== Diverses ==&lt;br /&gt;
Make sure you have SPF, DMARC, DKIM, and sign up for their JMRP and SDNS they will tell you.&lt;br /&gt;
&lt;br /&gt;
== SPF ==&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/kas/tools/dns-werkzeuge/spf_482.html&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SPF, Sender Policy Framework&amp;#039;&amp;#039;&amp;#039;, ist ein Standard zur Überprüfung des Absenders einer E-Mail und &amp;#039;&amp;#039;&amp;#039;vermutlich der wichtigste Anti-Spam-Indikator&amp;#039;&amp;#039;&amp;#039;. SPF ist ein TXT-Eintrag im DNS der Absender-Domain und leicht zu setzen. &lt;br /&gt;
&lt;br /&gt;
Etwas mehr Wissen erfordert unter Umständen das &amp;#039;&amp;#039;&amp;#039;Generieren des TXT Eintrags&amp;#039;&amp;#039;&amp;#039;. Hier muss beachtet werden, welche Mailserver und Maildienste für das Versenden der Mails benutzt werden. Wenn ich den Mailserver meines Webhosters nutze, jedoch Mails über die Googlemail Weboberfläche schicke (E-Mail über SMTP eingebunden), muss ich das im SPF-Eintrag beachten. Hierzu gibt es von fast allen Anbietern entsprechende Infos/Hilfeseiten, etwas googeln hilft hier schnell.&lt;br /&gt;
&lt;br /&gt;
Ein beispielhafter SPF-Eintrag, der Google als Relay inkludiert, könnte so aussehen:&lt;br /&gt;
 v=spf1 a mx include:_spf.google.com ~all&lt;br /&gt;
* Kein ptr im SPF eintragen, wenn MX gesetzt ist, auch wenn das viele Generatoren immernoch machen. &lt;br /&gt;
* Überprüfung mit SPF Check der MXToolBox. Weitere Infos findet ihr bestimmt in der Hilfe eures Maildienstleisters/Hosters mit der Suche nach „SPF“.&lt;br /&gt;
&lt;br /&gt;
=== Syntax ===&lt;br /&gt;
Erklärungen zur Syntax von SPF:&lt;br /&gt;
&lt;br /&gt;
Am Anfang des SPF Records wird mit v= die SPF-Version festgelegt. Bislang gibt es nur spf1. Danach werden üblicherweise Direktiven angegeben. Diese bestehen aus einem optionalen Qualifikator und einem Mechanismus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Qualifikatoren:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 + Pass - autorisierte Sender, daher Annahme der E-Mail; Standard, wenn kein Qualifikator explizit angegeben wird&lt;br /&gt;
 - Fail - nicht autorisierte Sender, daher Abweisung der E-Mail&lt;br /&gt;
 ~ SoftFail - nicht autorisierte Sender, E-Mail wird trotzdem angenommen, kann jedoch z.b. als Spam markiert werden&lt;br /&gt;
 ? Neutral - Sender, über deren Gültigkeit nichts gesagt werden kann und die akzeptiert werden müssen, daher Annahme der E-Mail&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
gängige Mechanismen (=Befehle):&lt;br /&gt;
&lt;br /&gt;
 a               A-/AAAA-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 mx              MX-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ptr             PTR-Record der abgefragten oder explizit angegebenen Domain&lt;br /&gt;
 ip4             IPv4-Adresse oder IPv4-Subnetz&lt;br /&gt;
 ip6             IPv6-Adresse oder IPv6-Subnetz&lt;br /&gt;
 include         SPF-Abfrage der angegebenen Domain, diese sollte einen gültigen SPF-Record besitzen&lt;br /&gt;
 all             immer&lt;br /&gt;
&lt;br /&gt;
Sofern für einen Mechanismus ein Argument übergeben werden soll, dann trennen Sie dies mit einem Doppelpunkt.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 v=spf1 mx a -all&lt;br /&gt;
Dieser bedeutet, dass für alle E-Mails, die von Sendern kommen, die sich nicht aus dem A- bzw. MX-Record des DNS ergeben, ein negatives Ergebnis zurückgegeben wird.&lt;br /&gt;
&lt;br /&gt;
 v=spf1 a:mail.example.org -all&lt;br /&gt;
Mails erlaubt, wenn sie aus den DNS Einträgen der Hauptdomain hervorgehen (-all) oder wenn es vom Server mit dem A-Record zu mail.example.org gehört.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Server im SPF Eintrag ==&lt;br /&gt;
Möchten Sie die &amp;#039;&amp;#039;&amp;#039;IP eines E-Mail-Server&amp;#039;&amp;#039;&amp;#039; in einen SPF-Eintrag aufnehmen, geben Sie vor dem Argument ~all die IP-Adresse des Servers ein. Verwenden Sie das &amp;#039;&amp;#039;&amp;#039;Format ip4:Adresse oder ip6:Adresse&amp;#039;&amp;#039;&amp;#039;, wie in diesem Beispiel:&lt;br /&gt;
 v=spf1 ip4:172.16.254.1 include:_spf.google.com ~all&lt;br /&gt;
Soll die &amp;#039;&amp;#039;&amp;#039;Domain eines E-Mail-Servers&amp;#039;&amp;#039;&amp;#039; hinzugefügt werden, verwenden Sie für jede Domain eine &amp;quot;&amp;#039;&amp;#039;&amp;#039;include&amp;#039;&amp;#039;&amp;#039;&amp;quot;-Anweisung. Beispiel:&lt;br /&gt;
 v=spf1 include:serverdomain.com include:_spf.google.com ~all&lt;br /&gt;
&lt;br /&gt;
=== SPF-Beispiele ===&lt;br /&gt;
 https://stackoverflow.com/questions/14261214/too-many-dns-lookups-in-an-spf-record?rq=1&lt;br /&gt;
==== Amazon SES ====&lt;br /&gt;
Here are the TXT records we currently use successfully for Amazon SES as per Authenticating Your Email Address and (it&amp;#039;s indeed unfortunate that their documentation doesn&amp;#039;t address the quoting needs):&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;v=spf1 include:amazonses.com ~all&amp;quot;&lt;br /&gt;
 &amp;quot;spf2.0/pra include:amazonses.com ~all&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== DKIM ==&lt;br /&gt;
DKIM Signiert die Mails, so kann der Empfänger kontrollieren, ob der Inhalt unverändert ankommt. Also erstmal kein Spam Tool.&lt;br /&gt;
&lt;br /&gt;
DKIM, DomainKeys Identified Mail (Standard, Wikipedia), ist wie SPF ebenfalls ein Protokoll zur Überprüfung von eingehenden Mails und deren unverändertem Inhalt.&lt;br /&gt;
DKIM nutzt zur Überprüfung eine asymmetrische Verschlüsselungstechnik mit zwei Schlüsseln – einem privaten Schlüssel, der Mails unsichtbar angehängt wird und einem öffentlichen Schlüssel, abgelegt im DNS des Absenders. &lt;br /&gt;
&lt;br /&gt;
Somit kann der Empfänger-Mailserver die Schlüssel aus dem Absender DNS und der Mail-Signatur gegeneinander prüfen und validieren. Das Hinzufügen des privaten Schlüssels in den Mailserver, damit dieser unsichtbar alle ausgehenden Mails damit signiert, erfordert eine fortgeschrittene Anpassung des Mailservers bzw. Konfiguration des Mailers und übersteigt den Rahmen dieses Artikels. Für GMail-Nutzer hilft die Google DKIM Step-by-Step-Anleitung, ansonsten wieder beim Anbieter/Hoster in der Hilfe schauen bzw. Support fragen.&lt;br /&gt;
&lt;br /&gt;
Der zweite Teil besteht aus einem TXT DNS Record, der zuvor generiert werden muss. Benötigt wird dafür die Domain und ein „Selektor“; eine beliebige Zeichenkette, z.B. „meindkim1“. Der Record sollte immer mit v=DKIM1;k=rsa;p= anfangen! Selbst wenn die Generatoren gerne einen der Parameter v oder k weglassen, oder diese als optional angeben, sollten beide gesetzt sein. Info: Beide Überprüfungs-Tools (MxToolBox und GSuite MX-Check) bestätigen einen validen DKIM übrigens nur mit Parametern v UND k, Warnungen falls einer fehlt. Die Überprüfung von DKIM erfordert dann ebenfalls Domain und Selektor und sollte anschließend positiv ausfallen.&lt;br /&gt;
&lt;br /&gt;
Aber Achtung: Ausschließlich den DKIM DNS Eintrag zu setzen, ohne die Mails zu signieren, hat keine weiteren positiven Auswirkungen (meistens aber auch keine negativen) und ist daher nicht zu empfehlen.&lt;br /&gt;
&lt;br /&gt;
=== DKIM bei all-inkl aktivieren ===&lt;br /&gt;
 https://all-inkl.com/wichtig/anleitungen/providerwechsel/einrichtung/dns/dkim-bei-versand-ueber-unsere-mailserver_541.html&lt;br /&gt;
* In den Domaineinstellungen DKIM aktivieren. &lt;br /&gt;
* Der passende DNS Eintrag wird automatisch ergänzt und sieht ungefähr so aus:&lt;br /&gt;
 Name: kas202005201235._domainkey.meineDomain.de&lt;br /&gt;
 Typ: TXT&lt;br /&gt;
 Eintrag: v=DKIM1; k=rsa; p=MIIB[MEHR SCHLÜSSELINHALT]QAB&lt;br /&gt;
&lt;br /&gt;
== DMARC ==&lt;br /&gt;
 https://elasticemail.com/dmarc (Generator für DMARC Einträge)&lt;br /&gt;
&lt;br /&gt;
DMARC, Domain-based Message Authentication, Reporting, and Conformance (Standard, Wikipedia)&lt;br /&gt;
&lt;br /&gt;
Technologie zur Erweiterung von SPF und DKIM. Geliefert werden zusätzliche Informationen, wie der Empfängerserver mit geprüften Mails umgehen soll sowie die Möglichkeit von Reports der Überprüfungen. &lt;br /&gt;
&lt;br /&gt;
Auch hier ein DNS TXT Eintrag, der die Infos liefert. Zwei grundlegende Fragen müsst ihr euch stellen:&lt;br /&gt;
# Wie sollen Mails behandelt werden, deren SPF/DKIM-Überprüfung fehlschlägt? Ignorieren / Spam / Abweisen.&lt;br /&gt;
# Sollen Daten und fehlgeschlagene Überprüfungen als Reports verschickt werden und an welche Mail-Adresse?&lt;br /&gt;
&lt;br /&gt;
Solltet ihr mit „Ignorieren“ dem Empfangsserver kein Verhalten vorschreiben wollen und auch keinerlei Reporting wünschen (v=DMARC1;p=none;), erfüllt DMARC keinen Zweck und hat auch keine weiteren Effekte auf den Mailempfang, kann also ausgelassen werden.&lt;br /&gt;
&lt;br /&gt;
Restriktiveres Verhalten oder Reporting gewünscht? Dann wird einer der vielen existierenden Generatoren aus den gewählten Optionen einen einfachen bis recht komplexen TXT Record erstellen:&lt;br /&gt;
 v=DMARC1; p=none; rua=mailto:admin@it-stack.de; ruf=mailto:admin@it-stack.de; fo=1;&lt;br /&gt;
Dieser Eintrag schickt Reportings an mich, wenn SPF oder DKIM fehlschlägt sowie generelle Reports, der Mailserver soll die Fehlschläge jedoch wie gewohnt behandeln, ich gebe kein strikteres Vorgehen vor.&lt;br /&gt;
&lt;br /&gt;
== Blacklists ==&lt;br /&gt;
Es gibt eine Vielzahl von professionell betriebenen Anti-Spam-Listen, also Blacklists, die von Mailservern zur weiteren Überprüfung abgefragt werden können. Ob mein Mailserver auf einer Blacklist steht, kann ich beispielsweise mit der MxToolBox Blacklist Suche herausfinden. Gebt hier eure Domain ein und eine Auswertung von über 100 Blackslists wird eventuelle Funde aufzeigen. Solltet euer Mailserver nicht die IP eurer Domain teilen oder weitere in das Mailing involvierten MX-Server-IPs bekannt sein, diese am besten auch noch testen.&lt;br /&gt;
Eure Domain/IP ist in einer Blacklist gefunden worden? Das ist unpraktisch, kann aber mal passieren. Geblacklistet werden für gewöhnlich ganze Server. Auf einem Shared Server, wie das bei Webhosting fast immer der Fall ist, sind, je nach Vertrag, 20 bis 100 weitere Kunden untergebracht. Die Chance, dass ein anderer Kunde für das Blacklisting verantwortlich ist, ist hoch.&lt;br /&gt;
Was tun? Auf der Betreiberseite der Blacklist gibt es meistens Suchen/Informationsportale, in denen Blacklist-Kandidaten, teilweise mit mehr Details und Begründung, gesucht werden können. Ich empfehle zwei Recherchen: Suche nach der Domain und nach der/den IPs.&lt;br /&gt;
So kann es sein, dass die IP-Adresse des Servers in mehreren Einträgen gefunden wird (Reportfunde bei Spamhaus ZEN: Link1, Link2, in welchen wiederum eure Domain nicht erwähnt wird), für die Domain jedoch kein Eintrag vorhanden ist. Das sind weitere Hinweise darauf, dass nicht ihr, sondern ein anderer Kunde des Servers Schuld hat.&lt;br /&gt;
Unabhängig von diesen Recherchen könnt ihr vermutlich wenig gegen das Blacklisting tun. Manche Betreiber bieten Unblock Formulare an, andere nicht. Informiert auf jeden Fall euren Webhoster/Mailing-Anbieter mit allen herausgefundenen Informationen über das Blacklisting – dieser hat für gewöhnlich andere Optionen und kann direkt selbst in die Behandlung der Problemursache, also gegen entsprechende Kunden, vorgehen.&lt;br /&gt;
&lt;br /&gt;
== User Trust ==&lt;br /&gt;
Desweiteren hilft es, sich zusätzlich Trust über den User/Empfänger zu holen – beispielsweise durch das Hinzufügen eurer Absenderadresse zu den Kontakten, das Markieren der Nachrichten als „Wichtig“ oder Versehen mit Sternchen/Markern (je nach Client heißt das anders), den Absender „Nie als Spam markieren“ (ebenfalls je Client anders) und mehr. Alles, was man mit einer Mail oder einem Absender bei dem jeweiligen Anbieter des Empfängers tun kann, dass letztlich einen positiven Effekt hat. Die Anbieter speichern solche Informationen (wie oft wurde eine Mail mit Inhalt X positiv behandelt, wie oft der Absender usw.) und behandeln Mails dieses Absenders zukünftig besser. Diese Maßnahme kann man bis zu einer gewissen Anzahl mit den eigenen Mitarbeitern starten – Mails an ihre private Mailadresse schicken, bestenfalls bei unterschiedlichen Anbietern, und die Mails von ihnen „positiv behandeln“ lassen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26185</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26185"/>
		<updated>2022-08-28T17:04:19Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Datum Planes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns, Mirrors, Paths ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
Das Multitransform Tool erlaubt die anderen Transformtools mehrstufig anzuwenden. So kann man hier z.b. auch zweimal Mirror anwenden.&lt;br /&gt;
&lt;br /&gt;
=== Draft Mode und PathArray ===&lt;br /&gt;
Mit Path Arrays kann man auch Objekte an Pfaden ausrichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Löcher an Pfad:&lt;br /&gt;
# Im &amp;#039;&amp;#039;&amp;#039;Draft Mode&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
# Path erstellen und Circle erstellen&lt;br /&gt;
# Im Combo Panel zuerst Kreis, dann Pfad anwählen und mit Path Array verteilen.&lt;br /&gt;
# Path Array in Sketch umwandeln&lt;br /&gt;
# Sketch in entsprechendes Objekt ziehen&lt;br /&gt;
# Pockets oder was auch immer aus dem Sketch erstellen&lt;br /&gt;
# Überflüssige Objekte können gelöscht oder ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Planes auf Objekten?&amp;#039;&amp;#039;&amp;#039; - Das geht, aber hier wird öfter abgeraten, es gäbe Namenskonflikte. Außerdem ist die Positionierung des Mittelpunkts der Plane Ebene manchmal seltsam.&lt;br /&gt;
&lt;br /&gt;
Besser Plane auf Grundebenen und dann Offset und Winkel.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann man auch Sketches direkt auf Objektfaces setzen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26184</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26184"/>
		<updated>2022-08-28T17:04:04Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Datum Planes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns, Mirrors, Paths ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
Das Multitransform Tool erlaubt die anderen Transformtools mehrstufig anzuwenden. So kann man hier z.b. auch zweimal Mirror anwenden.&lt;br /&gt;
&lt;br /&gt;
=== Draft Mode und PathArray ===&lt;br /&gt;
Mit Path Arrays kann man auch Objekte an Pfaden ausrichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Löcher an Pfad:&lt;br /&gt;
# Im &amp;#039;&amp;#039;&amp;#039;Draft Mode&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
# Path erstellen und Circle erstellen&lt;br /&gt;
# Im Combo Panel zuerst Kreis, dann Pfad anwählen und mit Path Array verteilen.&lt;br /&gt;
# Path Array in Sketch umwandeln&lt;br /&gt;
# Sketch in entsprechendes Objekt ziehen&lt;br /&gt;
# Pockets oder was auch immer aus dem Sketch erstellen&lt;br /&gt;
# Überflüssige Objekte können gelöscht oder ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Planes auf Objekten?&amp;#039;&amp;#039;&amp;#039; - Das geht, aber hier wird öfter abgeraten, es gäbe Namenskonflikte. Außerdem ist die Positionierung des Mittelpunkts der Plane Ebene manchmal seltsam.&lt;br /&gt;
&lt;br /&gt;
Besser Plane auf Grundebenen und dann Offset und Winkel.&lt;br /&gt;
&lt;br /&gt;
Außerdem kann man auch Sketches direkt auf Ebenen setzen.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26183</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26183"/>
		<updated>2022-08-28T09:58:31Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Draft Mode und PathArray */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns, Mirrors, Paths ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
Das Multitransform Tool erlaubt die anderen Transformtools mehrstufig anzuwenden. So kann man hier z.b. auch zweimal Mirror anwenden.&lt;br /&gt;
&lt;br /&gt;
=== Draft Mode und PathArray ===&lt;br /&gt;
Mit Path Arrays kann man auch Objekte an Pfaden ausrichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Löcher an Pfad:&lt;br /&gt;
# Im &amp;#039;&amp;#039;&amp;#039;Draft Mode&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
# Path erstellen und Circle erstellen&lt;br /&gt;
# Im Combo Panel zuerst Kreis, dann Pfad anwählen und mit Path Array verteilen.&lt;br /&gt;
# Path Array in Sketch umwandeln&lt;br /&gt;
# Sketch in entsprechendes Objekt ziehen&lt;br /&gt;
# Pockets oder was auch immer aus dem Sketch erstellen&lt;br /&gt;
# Überflüssige Objekte können gelöscht oder ausgeblendet werden.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&lt;br /&gt;
Testen: Plane auf Objekt setzen - geht das?&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26182</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26182"/>
		<updated>2022-08-28T09:58:04Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Patterns &amp;amp; Mirror */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns, Mirrors, Paths ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
Das Multitransform Tool erlaubt die anderen Transformtools mehrstufig anzuwenden. So kann man hier z.b. auch zweimal Mirror anwenden.&lt;br /&gt;
&lt;br /&gt;
=== Draft Mode und PathArray ===&lt;br /&gt;
Mit Path Arrays kann man auch Objekte an Pfaden ausrichen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Löcher an Pfad:&lt;br /&gt;
# Im &amp;#039;&amp;#039;&amp;#039;Draft Mode&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
# Path erstellen und Circle erstellen&lt;br /&gt;
# Im Combo Panel zuerst Kreis, dann Pfad anwählen und mit Path Array verteilen.&lt;br /&gt;
# Path Array in Sketch umwandeln&lt;br /&gt;
# Sketch in entsprechendes Objekt ziehen&lt;br /&gt;
# Pockets oder was auch immer aus dem Sketch erstellen&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&lt;br /&gt;
Testen: Plane auf Objekt setzen - geht das?&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26181</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26181"/>
		<updated>2022-08-28T09:06:49Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Multitransform Tool */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns &amp;amp; Mirror ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
Das Multitransform Tool erlaubt die anderen Transformtools mehrstufig anzuwenden. So kann man hier z.b. auch zweimal Mirror anwenden.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&lt;br /&gt;
Testen: Plane auf Objekt setzen - geht das?&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26180</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26180"/>
		<updated>2022-08-28T08:58:27Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Patterns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns &amp;amp; Mirror ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
=== Mirror Tool ===&lt;br /&gt;
Kann an den globelen oder lokalen Ebenen vertikal oder horizontal spiegeln.&lt;br /&gt;
&lt;br /&gt;
Nützlich ist das Spiegeln an einem Datum Plane. So ist man flexibler bezügl. Position und Winkel.&lt;br /&gt;
&lt;br /&gt;
Limitation: Du kannst nicht einen Mirror erneut spiegeln. Wenn man also vertikal und horizontal spiegeln will kann man das &amp;#039;&amp;#039;&amp;#039;Multitransform Tool&amp;#039;&amp;#039;&amp;#039; nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Multitransform Tool ===&lt;br /&gt;
todo&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&lt;br /&gt;
Testen: Plane auf Objekt setzen - geht das?&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26179</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26179"/>
		<updated>2022-08-28T08:40:23Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;br /&gt;
&lt;br /&gt;
== Datum Planes ==&lt;br /&gt;
Wenn man mehrere Objekte (z.B.Löcher) auf einer Objektkante setzen möchte kann man mit Datum Planes arbeiten. &lt;br /&gt;
Man erstellt ein Datum Plane z.B. auf der xz-Ebene und setzt einen passenden Offset. Die neue Plane (Ebene) kann man nutzen wie die Standard-Ebenen.&lt;br /&gt;
&lt;br /&gt;
Testen: Plane auf Objekt setzen - geht das?&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26178</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26178"/>
		<updated>2022-08-28T08:24:03Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Bezug auf andere Objekte oder Sketches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
=== External Geometry tool ===&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das &amp;#039;&amp;#039;&amp;#039;external Geometry&amp;#039;&amp;#039;&amp;#039; Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26177</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26177"/>
		<updated>2022-08-28T08:23:37Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Externe Geometrie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
&lt;br /&gt;
== Bezug auf andere Objekte oder Sketches ==&lt;br /&gt;
Für Constraint zu anderen Objekten importiert man sich z.B. Edges aus anderen Objekten in das Sketch. Dazu gibt es das external Geometry Tool in der Sketch Workbench. Vorsicht - funktioniert nicht mit Faces oder ganzen Objekten.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26176</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26176"/>
		<updated>2022-08-28T08:16:55Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;br /&gt;
&lt;br /&gt;
== Externe Geometrie ==&lt;br /&gt;
Bezug zu anderem Sketch herstellen:&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26175</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26175"/>
		<updated>2022-08-28T08:10:55Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Linear Pattern */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Linear auf einer Achse oder Bezugsachse ausrichten Z.B. Lochreihen&lt;br /&gt;
* Angabe von Länge der Reihe, Richtung (Achse) und Anzahl der Löcher&lt;br /&gt;
=== Polar Pattern ===&lt;br /&gt;
* Ausrichten auf einer Kreislinie&lt;br /&gt;
* wichtig ist der Startpunkt (z.b. erstes Loch). Von diesem wird mit oder gegen den Uhrzeigersinn gestartet.&lt;br /&gt;
* Angabe von Winkel und Anzahl. Mittelpunkt der Kreisbahn ist Ursprung im aktuellen Koordinatensystem.&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26174</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26174"/>
		<updated>2022-08-28T07:45:57Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Patterns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;br /&gt;
=== Linear Pattern ===&lt;br /&gt;
* Z.B. Lochreihen&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26173</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26173"/>
		<updated>2022-08-28T07:37:30Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;br /&gt;
&lt;br /&gt;
== Patterns ==&lt;br /&gt;
* Ein Pattern benötigt ein eigenes Sketch&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26172</id>
		<title>FreeCAD</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCAD&amp;diff=26172"/>
		<updated>2022-08-27T17:32:26Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „== Links ==  https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen. == Basics == Oft g…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.youtube.com/playlist?list=PL_28gc6LBA1ve8Aamf1izQjNlqgtBWoLS - Super Einstieg, Playlist mit allen wichtigen Themen.&lt;br /&gt;
== Basics ==&lt;br /&gt;
Oft genutzter Design Prozess.&lt;br /&gt;
* PartDesign Workbench nutzen&lt;br /&gt;
* Part erstellen&lt;br /&gt;
* Body erstellen&lt;br /&gt;
* Sketch erstellen&lt;br /&gt;
* Sketch Padding oder Revolve&lt;br /&gt;
&lt;br /&gt;
== Workbench ==&lt;br /&gt;
Für verschiedene Aufgaben gibt es verschiedene Arbeitsbereiche, genannt Workbench.&lt;br /&gt;
&lt;br /&gt;
Wichtige Workbenches:&lt;br /&gt;
&lt;br /&gt;
PartDesign - Erstellen von Teilen. Hier verbringt man am meisten Zeit.&lt;br /&gt;
&lt;br /&gt;
Spreadsheet - Wichtig für Parametrisierte Entwürfe. Hier legt man seine Variablen an.&lt;br /&gt;
&lt;br /&gt;
=== Spreadsheet ===&lt;br /&gt;
Gutes Makro: EasyAlias&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=FreeCad&amp;diff=26171</id>
		<title>FreeCad</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=FreeCad&amp;diff=26171"/>
		<updated>2022-08-27T17:27:12Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „FreeCAD“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FreeCAD]]&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video_Snippets&amp;diff=26170</id>
		<title>HTML5 - Video Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video_Snippets&amp;diff=26170"/>
		<updated>2022-08-26T07:09:25Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* GSAP - Slider für Videostart */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Komplette Beispielskripte ==&lt;br /&gt;
=== GSAP - Slider für Videostart ===&lt;br /&gt;
Videos mit Ton werden erst nach einer Userinteraktion wie ein Klick auf Play gespielt (Safari, Firefox). Ein Slider Drag funktioniert nicht. Aber man kann den Klick bei der ersten Sliderberührung simulieren und das Video sofort wieder stoppen. Ab diesem Moment können wir den Player auch selbst steuern. Z.B. wenn der Slider komplett gezogen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
  //init&lt;br /&gt;
  const myVideo = document.getElementById(&amp;#039;myVideo&amp;#039;)&lt;br /&gt;
  //const myAudio = document.getElementById(&amp;#039;myAudio&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  tl=gsap.timeline({paused:true});&lt;br /&gt;
  tl.to(&amp;#039;#intro&amp;#039;,{backgroundColor:&amp;#039;#28282D&amp;#039;, color:&amp;#039;#6E6E75&amp;#039;})&lt;br /&gt;
      .fromTo(&amp;#039;#myVideo&amp;#039;,{opacity:0},{opacity:1})&lt;br /&gt;
      .to(&amp;#039;#video-overlay&amp;#039;,{backgroundColor:&amp;#039;transparent&amp;#039;, backgroundImage:&amp;#039;none&amp;#039;},&amp;#039;&amp;lt;&amp;#039;)&lt;br /&gt;
      .to(&amp;#039;#intro-slider&amp;#039;,{opacity:0,display:&amp;quot;none&amp;quot;})&lt;br /&gt;
      .fromTo(&amp;#039;#btn-skip&amp;#039;,{opacity:0},{opacity:1})&lt;br /&gt;
  var initClick = false;&lt;br /&gt;
  $(&amp;#039;#slider-plate&amp;#039;).on(&amp;#039;mousedown&amp;#039;, function(){&lt;br /&gt;
      //myAudio.play();&lt;br /&gt;
    if(!initClick){&lt;br /&gt;
      console.log(&amp;quot;initial click to prevent autoplay-blocking&amp;quot;)&lt;br /&gt;
      //myVideo.play();&lt;br /&gt;
      //myVideo.pause();&lt;br /&gt;
      initClick=true;&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  // gsap&lt;br /&gt;
  gsap.registerPlugin(InertiaPlugin)&lt;br /&gt;
  Draggable.create(&amp;quot;#slider-plate&amp;quot;,{&lt;br /&gt;
    type: &amp;quot;x&amp;quot;,&lt;br /&gt;
    bounds: &amp;quot;#slider-bounds&amp;quot;,&lt;br /&gt;
    inertia:true,&lt;br /&gt;
    edgeResistance: 1,&lt;br /&gt;
    dragResistance:0,&lt;br /&gt;
    duration: {min:0.3, max: 0.5},&lt;br /&gt;
    snap: {&lt;br /&gt;
      x: function(xPos) {&lt;br /&gt;
        if(xPos &amp;lt; this.maxX){return 0}&lt;br /&gt;
        else{return xPos}&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
    onThrowComplete: function(){ &lt;br /&gt;
      //console.log(&amp;quot;intertia flick complete ended at &amp;quot; + this.x + &amp;quot; out of &amp;quot; + this.maxX);&lt;br /&gt;
      if(this.x == this.maxX){&lt;br /&gt;
        tl.play()&lt;br /&gt;
        console.log(&amp;quot;play video&amp;quot;)&lt;br /&gt;
        var promise = myVideo.play()&lt;br /&gt;
        if (promise !== undefined) {&lt;br /&gt;
          promise.catch(error =&amp;gt; {&lt;br /&gt;
            console.log(&amp;quot;autoplay prevented by browser&amp;quot;)&lt;br /&gt;
            console.log(error)&lt;br /&gt;
            // show video controls&lt;br /&gt;
            video = document.getElementById(&amp;#039;myVideo&amp;#039;)&lt;br /&gt;
            video.setAttribute(&amp;quot;controls&amp;quot;,&amp;quot;controls&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
          }).then(() =&amp;gt; {&lt;br /&gt;
            console.log(&amp;quot;player started&amp;quot;)&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      }else {&lt;br /&gt;
        myVideo.pause();&lt;br /&gt;
        //myAudio.pause();&lt;br /&gt;
        console.log(&amp;quot;pause video&amp;quot;)&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    onDragStart: function(){&lt;br /&gt;
      // stop autosliding&lt;br /&gt;
      //tl.progress(0);&lt;br /&gt;
      tlSimDrag.pause();&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // toggle controls&lt;br /&gt;
  function toggleControls() {&lt;br /&gt;
    if (video.hasAttribute(&amp;quot;controls&amp;quot;)) {&lt;br /&gt;
        video.removeAttribute(&amp;quot;controls&amp;quot;)   &lt;br /&gt;
    } else {&lt;br /&gt;
        video.setAttribute(&amp;quot;controls&amp;quot;,&amp;quot;controls&amp;quot;)   &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // simulate a drag to notice the user&lt;br /&gt;
  tlSimDrag = new gsap.timeline({ &lt;br /&gt;
    defaults:{ease: &amp;quot;power2.out&amp;quot;},&lt;br /&gt;
    repeat: -1, &lt;br /&gt;
    delay: 1,&lt;br /&gt;
    repeatDelay:3,&lt;br /&gt;
  });&lt;br /&gt;
  &lt;br /&gt;
  tlSimDrag.to(&amp;#039;#slider-plate&amp;#039;,0.7,{x:100}).to(&amp;#039;#slider-plate&amp;#039;,1.5,{&lt;br /&gt;
    x:0,&lt;br /&gt;
    delay: 0.1&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video_Snippets&amp;diff=26169</id>
		<title>HTML5 - Video Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video_Snippets&amp;diff=26169"/>
		<updated>2022-08-26T07:08:57Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: Die Seite wurde neu angelegt: „== Komplette Beispielskripte == === GSAP - Slider für Videostart === Videos mit Ton werden erst nach einer Userinteraktion wie ein Klick auf Play gespielt (Sa…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Komplette Beispielskripte ==&lt;br /&gt;
=== GSAP - Slider für Videostart ===&lt;br /&gt;
Videos mit Ton werden erst nach einer Userinteraktion wie ein Klick auf Play gespielt (Safari, Firefox). Ein Slider Drag funktioniert nicht. Aber man kann den Klick bei der ersten Sliderberührung simulieren und das Video sofort wieder stoppen. Ab diesem Moment können wir den Player auch selbst steuern. Z.B. wenn der Slider komplett gezogen ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(document).ready(function(){&lt;br /&gt;
&lt;br /&gt;
  //init&lt;br /&gt;
  const myVideo = document.getElementById(&amp;#039;myVideo&amp;#039;)&lt;br /&gt;
  //const myAudio = document.getElementById(&amp;#039;myAudio&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  tl=gsap.timeline({paused:true});&lt;br /&gt;
  tl.to(&amp;#039;#intro&amp;#039;,{backgroundColor:&amp;#039;#28282D&amp;#039;, color:&amp;#039;#6E6E75&amp;#039;})&lt;br /&gt;
      .fromTo(&amp;#039;#myVideo&amp;#039;,{opacity:0},{opacity:1})&lt;br /&gt;
      .to(&amp;#039;#video-overlay&amp;#039;,{backgroundColor:&amp;#039;transparent&amp;#039;, backgroundImage:&amp;#039;none&amp;#039;},&amp;#039;&amp;lt;&amp;#039;)&lt;br /&gt;
      .to(&amp;#039;#intro-slider&amp;#039;,{opacity:0,display:&amp;quot;none&amp;quot;})&lt;br /&gt;
      .fromTo(&amp;#039;#btn-skip&amp;#039;,{opacity:0},{opacity:1})&lt;br /&gt;
  var initClick = false;&lt;br /&gt;
  $(&amp;#039;#slider-plate&amp;#039;).on(&amp;#039;mousedown&amp;#039;, function(){&lt;br /&gt;
      //myAudio.play();&lt;br /&gt;
    if(!initClick){&lt;br /&gt;
      console.log(&amp;quot;initial click to prevent autoplay-blocking&amp;quot;)&lt;br /&gt;
      //myVideo.play();&lt;br /&gt;
      //myVideo.pause();&lt;br /&gt;
      initClick=true;&lt;br /&gt;
    }&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
  // gsap&lt;br /&gt;
  gsap.registerPlugin(InertiaPlugin)&lt;br /&gt;
  Draggable.create(&amp;quot;#slider-plate&amp;quot;,{&lt;br /&gt;
    type: &amp;quot;x&amp;quot;,&lt;br /&gt;
    bounds: &amp;quot;#slider-bounds&amp;quot;,&lt;br /&gt;
    inertia:true,&lt;br /&gt;
    edgeResistance: 1,&lt;br /&gt;
    dragResistance:0,&lt;br /&gt;
    duration: {min:0.3, max: 0.5},&lt;br /&gt;
    snap: {&lt;br /&gt;
      x: function(xPos) {&lt;br /&gt;
        if(xPos &amp;lt; this.maxX){return 0}&lt;br /&gt;
        else{return xPos}&lt;br /&gt;
      },&lt;br /&gt;
    },&lt;br /&gt;
    onThrowComplete: function(){ &lt;br /&gt;
      //console.log(&amp;quot;intertia flick complete ended at &amp;quot; + this.x + &amp;quot; out of &amp;quot; + this.maxX);&lt;br /&gt;
      if(this.x == this.maxX){&lt;br /&gt;
        tl.play()&lt;br /&gt;
        console.log(&amp;quot;play video&amp;quot;)&lt;br /&gt;
        var promise = myVideo.play()&lt;br /&gt;
        if (promise !== undefined) {&lt;br /&gt;
          promise.catch(error =&amp;gt; {&lt;br /&gt;
            console.log(&amp;quot;autoplay prevented by browser&amp;quot;)&lt;br /&gt;
            console.log(error)&lt;br /&gt;
            // show video controls&lt;br /&gt;
            video = document.getElementById(&amp;#039;myVideo&amp;#039;)&lt;br /&gt;
            video.setAttribute(&amp;quot;controls&amp;quot;,&amp;quot;controls&amp;quot;) &lt;br /&gt;
&lt;br /&gt;
          }).then(() =&amp;gt; {&lt;br /&gt;
            console.log(&amp;quot;player started&amp;quot;)&lt;br /&gt;
          });&lt;br /&gt;
        }&lt;br /&gt;
      }else {&lt;br /&gt;
        myVideo.pause();&lt;br /&gt;
        //myAudio.pause();&lt;br /&gt;
        console.log(&amp;quot;pause video&amp;quot;)&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    onDragStart: function(){&lt;br /&gt;
      // stop autosliding&lt;br /&gt;
      //tl.progress(0);&lt;br /&gt;
      tlSimDrag.pause();&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // toggle controls&lt;br /&gt;
  function toggleControls() {&lt;br /&gt;
    if (video.hasAttribute(&amp;quot;controls&amp;quot;)) {&lt;br /&gt;
        video.removeAttribute(&amp;quot;controls&amp;quot;)   &lt;br /&gt;
    } else {&lt;br /&gt;
        video.setAttribute(&amp;quot;controls&amp;quot;,&amp;quot;controls&amp;quot;)   &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  // simulate a drag to notice the user&lt;br /&gt;
  tlSimDrag = new gsap.timeline({ &lt;br /&gt;
    defaults:{ease: &amp;quot;power2.out&amp;quot;},&lt;br /&gt;
    repeat: -1, &lt;br /&gt;
    delay: 1,&lt;br /&gt;
    repeatDelay:3,&lt;br /&gt;
  });&lt;br /&gt;
  &lt;br /&gt;
  tlSimDrag.to(&amp;#039;#slider-plate&amp;#039;,0.7,{x:100}).to(&amp;#039;#slider-plate&amp;#039;,1.5,{&lt;br /&gt;
    x:0,&lt;br /&gt;
    delay: 0.1&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/javascript&amp;gt;&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video&amp;diff=26168</id>
		<title>HTML5 - Video</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Video&amp;diff=26168"/>
		<updated>2022-08-26T07:05:59Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://www.html5rocks.com/de/tutorials/video/basics//&lt;br /&gt;
 [[HTML5 - Video Snippets]]&lt;br /&gt;
&lt;br /&gt;
== Custom Controls ==&lt;br /&gt;
=== Hide Controls ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//For Firefox we have to handle it in JavaScript &lt;br /&gt;
var vids = $(&amp;quot;video&amp;quot;); &lt;br /&gt;
$.each(vids, function(){&lt;br /&gt;
       this.controls = false; &lt;br /&gt;
}); &lt;br /&gt;
//Loop though all Video tags and set Controls as false&lt;br /&gt;
&lt;br /&gt;
$(&amp;quot;video&amp;quot;).click(function() {&lt;br /&gt;
  //console.log(this); &lt;br /&gt;
  if (this.paused) {&lt;br /&gt;
    this.play();&lt;br /&gt;
  } else {&lt;br /&gt;
    this.pause();&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
video::-webkit-media-controls {&lt;br /&gt;
  display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Could Use thise as well for Individual Controls */&lt;br /&gt;
video::-webkit-media-controls-play-button {}&lt;br /&gt;
video::-webkit-media-controls-volume-slider {}&lt;br /&gt;
video::-webkit-media-controls-mute-button {}&lt;br /&gt;
video::-webkit-media-controls-timeline {}&lt;br /&gt;
video::-webkit-media-controls-current-time-display {}&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;!-- Hiding HTML5 Video Controls using CSS Pseudo selectors --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;video width=&amp;quot;800&amp;quot; autoplay controls=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;source src=&amp;quot;http://clips.vorwaerts-gmbh.de/VfE_html5.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Helfer ==&lt;br /&gt;
 fitvids.js von Chris Coyer responsive videos für YouTube etc. (braucht man heute evtl. nicht mehr)&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Autoplay Policy ===&lt;br /&gt;
Oft hängen Probleme mit Sicherheitsfeatures bei den Browsern zusammen. Z.B. spielen Safari und Firefox nicht den Ton mit Autoplay ab.&lt;br /&gt;
 https://stackoverflow.com/questions/50279454/video-autoplay-doesnt-work-without-hard-refresh&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Klick&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;mousedown events funktionieren&amp;#039;&amp;#039;&amp;#039; - man kann bei der &amp;#039;&amp;#039;&amp;#039;ersten Userinteraktion über mousedown das Video starten und sofort wieder pausieren&amp;#039;&amp;#039;&amp;#039;. Danach läßt sich der Player auch mit anderen events interaktiv steuern. Evtl. funktioniert das auch wenn zuvor ein anderes Element gesteuert wurde.&lt;br /&gt;
==== Safari Play Button funktioniert nicht ====&lt;br /&gt;
==== Ton-Probleme ====&lt;br /&gt;
Autoplay spielt Ton in einigen Browsern nur mit Usererlaubnis (nicht default). Also entweder autoplay ohne Ton oder manuell starten. &lt;br /&gt;
&lt;br /&gt;
Auch die Interaktion über einen custom event wird teilweise (z.B. Safari) als autoplay interpretiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server liefert nicht den richtigen Mime Type ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;httpd.conf&amp;quot; genügt es, diese Zeilen hinzuzufügen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AddType video/ogg .ogv&lt;br /&gt;
AddType video/mp4 .mp4&lt;br /&gt;
AddType video/webm .webm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Safari mobile &amp;amp; Background Video ===&lt;br /&gt;
Apple ändert immer wieder die Autoplay Policy. Autoplay funktioniert Stand 2022 nur wenn&lt;br /&gt;
- autoplay und playsinline Attribute aktiv&lt;br /&gt;
- kein LowPower Mode (evtl. funktionieren Videos unter 3MB -&amp;gt; Testen)&lt;br /&gt;
- Videogröße kann eine Rolle spielen (s.o.)&lt;br /&gt;
- evtl. spielen noch andere Faktoren wie umgebende Divs etc. eine Rolle.&lt;br /&gt;
==== Workarounds ====&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Videokodierung_-_Best_Practice&amp;diff=26167</id>
		<title>Videokodierung - Best Practice</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Videokodierung_-_Best_Practice&amp;diff=26167"/>
		<updated>2022-08-26T07:01:53Z</updated>

		<summary type="html">&lt;p&gt;134.3.84.225: /* Background Video */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
* https://app.zencoder.com/docs/guides/encoding-settings/html5&lt;br /&gt;
 [[Video]]&lt;br /&gt;
&lt;br /&gt;
== Video im Web ==&lt;br /&gt;
 Todo aktualisieren mit webm etc.&lt;br /&gt;
* Beste Kompatibilität (Anfang 2017) mp4 mit mp3 und h264&lt;br /&gt;
* Beste Kompatibilität (2022) mp4 + webm evtl. auch nur mp4&lt;br /&gt;
* Ab neueren Edge Versionen auch webm Unterstützung&lt;br /&gt;
* ogv - fraglich ob man das noch benötigt&lt;br /&gt;
* YouTube / Vimeo... nicht vergessen&lt;br /&gt;
* mov - immer noch Standard auf Mac, wenn man mit Quicktime konvertiert. Im Prinzip (Stand Anfang 2018) auch h264)&lt;br /&gt;
&lt;br /&gt;
== Datenraten ==&lt;br /&gt;
=== h264 ===&lt;br /&gt;
Was macht der Quicktime Exporter (Anfang 2018 laut Apple):&lt;br /&gt;
 1080p: MPEG video 10 Mbit/s H.264, up to 1920 x 1080 resolution.&lt;br /&gt;
 720p: MPEG video 7.5 Mbit/s H.264, up to 1280 x 720 resolution.&lt;br /&gt;
 480p: MPEG video 3 Mbit/s H.264, up to 640 x 480 resolution.&lt;br /&gt;
Das sieht ganz ordentlich aus.&lt;br /&gt;
=== Background Video ===&lt;br /&gt;
Stark reduzieren, dann spielt es vlt. auch auf Mobilgeräten. Evtl. mit Skripten nachhelfen (siehe auch [[HTML5 - Video]])&lt;br /&gt;
* 720p&lt;br /&gt;
* bitrate under 700kb/s ( preferably 500kb/s )&lt;br /&gt;
* overlay drüber damit Unsauberkeiten kaschiert werden&lt;br /&gt;
&lt;br /&gt;
== Vorschlag von zencoder ==&lt;br /&gt;
=== Overview ===&lt;br /&gt;
Minimum Formate:&lt;br /&gt;
* MP4 + H.264, with AAC or MP3. MP4 video plays natively in Safari, Chrome, and IE9 (Vista/Windows 7). It is also your best option for a Flash video fallback, and plays natively on many devices (iOS, Android, Blackberry, PSP, Xbox, PS3, etc.). &lt;br /&gt;
* Use H.264 &amp;#039;&amp;#039;&amp;#039;High Profile for the best quality&amp;#039;&amp;#039;&amp;#039;, or &amp;#039;&amp;#039;&amp;#039;Baseline profile if you want the same video to be playable on mobile devices.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Beyond that, use either WebM + VP8 or Ogg + Theora with Vorbis audio for other browsers.&lt;br /&gt;
&lt;br /&gt;
Recommendation: Minimally, MP4 + either WebM or Ogg, or maybe both.&lt;br /&gt;
&lt;br /&gt;
=== Mobile Devices ===&lt;br /&gt;
1. Most modern mobile devices support MP4/H.264. This includes the whole iOS series (iPhone, iPod, iPad, Apple TV, etc.), most Android devices, modern Blackberry phones, etc. For most of these, be sure to use the H.264 Baseline profile. Use 640x480 or smaller for iOS and Android, and 480x360 or smaller for Blackberry support.&lt;br /&gt;
&lt;br /&gt;
Note that the same file that plays on an iPhone can play on the web, via HTML5 (some browsers) or Flash. So if you want to reduce versions, use the same one. But you&amp;#039;re stuck with Baseline profile for most mobile devices, and Main/High makes a big difference, so using separate output versions is a good idea if you want the best quality for each device.&lt;br /&gt;
&lt;br /&gt;
2. Use 3GP/MPEG4 for older mobile devices. Most Blackberrys and some Androids also support 3GP, and 3GP generally even plays on iPhone/iPod too (since iOS plays MP4/MPEG-4 and 3GP is just a subset of MP4).&lt;br /&gt;
&lt;br /&gt;
Recommendation: Minimally, MP4, 640x480 or 480x360. Maximally, three MP4 versions (480x360, 640x480, 720p + Main profile) plus one or two 3GP versions (320x240 and maybe 176x144). See our earlier post for specific encoding settings.&lt;br /&gt;
&lt;br /&gt;
====1. Get it working ====&lt;br /&gt;
&lt;br /&gt;
 HTML5, Flash, Mobile: MP4/H.264, Baseline profile, 480x360 or 640x480&lt;br /&gt;
 HTML5: WebM or Ogg&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;input&amp;quot;: &amp;quot;s3://bucket-name/file-name.avi&amp;quot;,&lt;br /&gt;
  &amp;quot;outputs&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name.mp4&amp;quot;,&lt;br /&gt;
      &amp;quot;size&amp;quot;: &amp;quot;640x480&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name.webm&amp;quot;,&lt;br /&gt;
      &amp;quot;size&amp;quot;: &amp;quot;640x480&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====2. Round it out====&lt;br /&gt;
&lt;br /&gt;
* HTML5, Flash: MP4/H.264, High profile&lt;br /&gt;
* HTML5: WebM&lt;br /&gt;
* HTML5: Ogg&lt;br /&gt;
* Mobile: MP4/H.264, Baseline profile, 480x360 or 640x480&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;input&amp;quot;: &amp;quot;s3://bucket-name/file-name.avi&amp;quot;,&lt;br /&gt;
  &amp;quot;outputs&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name.mp4&amp;quot;,&lt;br /&gt;
      &amp;quot;h264_profile&amp;quot;: &amp;quot;high&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name.webm&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name.ogg&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;url&amp;quot;: &amp;quot;s3://output-bucket/output-file-name-mobile.mp4&amp;quot;,&lt;br /&gt;
      &amp;quot;size&amp;quot;: &amp;quot;640x480&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
JSONXML&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
====3. Support everything====&lt;br /&gt;
&lt;br /&gt;
* HTML5, Flash: MP4/H.264, High profile&lt;br /&gt;
* HTML5: WebM&lt;br /&gt;
* HTML5: Ogg&lt;br /&gt;
* Mobile: MP4/H.264, Baseline profile, 480x360, for wide compatibility&lt;br /&gt;
* Mobile: MP4/H.264, Main profile, 1280x720, for newer iOS devices (iPhone 4, iPad, Apple TV)&lt;br /&gt;
* Mobile: 3GP/MPEG4, 320x240 and/or 177x144, for non-smartphones*&lt;/div&gt;</summary>
		<author><name>134.3.84.225</name></author>
	</entry>
</feed>