<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.193.152.88</id>
	<title>Wikizone - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stephanschlegel.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.193.152.88"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/109.193.152.88"/>
	<updated>2026-05-06T14:37:27Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33112</id>
		<title>ProcessWire - RSS Feed</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33112"/>
		<updated>2026-01-15T16:04:35Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man einen RSS Feed benötigt gibt es im Core von ProcessWire bereits ein Modul. &lt;br /&gt;
 MarkupRSS&lt;br /&gt;
Es kann bei den Core Modulen aktiviert werden. &lt;br /&gt;
&lt;br /&gt;
Im Template kann an es so z.B. nutzen:&lt;br /&gt;
&lt;br /&gt;
Beispiel TV Altötting&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;
$departmentName = strstr($page-&amp;gt;template-&amp;gt;name,&amp;#039;-&amp;#039;,true);&lt;br /&gt;
$limit = 10; // default limit&lt;br /&gt;
$sort = &amp;#039;-modified&amp;#039;; // default sort&lt;br /&gt;
&lt;br /&gt;
// feed on?&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;opt_1){&lt;br /&gt;
  echo(&amp;#039;Der Feed ist für diese Seite nicht aktiv. Du kannst ihn in den Seiteneinstellungen aktivieren&amp;#039;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
// feed count&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;feed_count) $limit = $page-&amp;gt;fp_feed-&amp;gt;feed_count;&lt;br /&gt;
&lt;br /&gt;
$departmentPostTemplate = $departmentName.&amp;#039;-post&amp;#039;;&lt;br /&gt;
$feedTitle = $page-&amp;gt;title.&amp;#039; - Aktuelles&amp;#039;;&lt;br /&gt;
$rss = $modules-&amp;gt;get(&amp;quot;MarkupRSS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$selector = &amp;quot;template=$departmentPostTemplate, limit=$limit, sort=$sort&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// configure the feed. see the actual module file for more optional config options.&lt;br /&gt;
$rss-&amp;gt;title =$feedTitle;&lt;br /&gt;
$rss-&amp;gt;description = &amp;quot;Aktuelle Informaionen&amp;quot;;&lt;br /&gt;
$rss-&amp;gt;itemContentField = &amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDescriptionField =&amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDateField = &amp;#039;date_begin&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// find the pages you want to appear in the feed.&lt;br /&gt;
// this can be any group of pages returned by $pages-&amp;gt;find() or $page-&amp;gt;children(), etc.&lt;br /&gt;
$items = $pages-&amp;gt;find($selector);&lt;br /&gt;
// send the output of the RSS feed, and you are done&lt;br /&gt;
$rss-&amp;gt;render($items);&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33111</id>
		<title>ProcessWire - RSS Feed</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33111"/>
		<updated>2026-01-15T16:04:12Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man einen RSS Feed benötigt gibt es im Core von ProcessWire bereits ein Modul. &lt;br /&gt;
 MarkupRSS&lt;br /&gt;
Es kann bei den Core Modulen aktiviert werden. &lt;br /&gt;
&lt;br /&gt;
Im Template kann an es so z.B. nutzen:&lt;br /&gt;
&lt;br /&gt;
Beispiel TV Altötting&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;
$departmentName = strstr($page-&amp;gt;template-&amp;gt;name,&amp;#039;-&amp;#039;,true);&lt;br /&gt;
$limit = 10; // default limit&lt;br /&gt;
$sort = &amp;#039;-modified&amp;#039;; // default sort&lt;br /&gt;
&lt;br /&gt;
// feed on?&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;opt_1){&lt;br /&gt;
  echo(&amp;#039;Der Feed ist für diese Seite nicht aktiv. Du kannst ihn in den Seiteneinstellungen aktivieren&amp;#039;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
// feed count&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;feed_count) $limit = $page-&amp;gt;fp_feed-&amp;gt;feed_count;&lt;br /&gt;
&lt;br /&gt;
$departmentPostTemplate = $departmentName.&amp;#039;-post&amp;#039;;&lt;br /&gt;
$feedTitle = $page-&amp;gt;title.&amp;#039; - Aktuelles&amp;#039;;&lt;br /&gt;
$rss = $modules-&amp;gt;get(&amp;quot;MarkupRSS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$selector = &amp;quot;template=$departmentPostTemplate, limit=$limit, sort=$sort&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// configure the feed. see the actual module file for more optional config options.&lt;br /&gt;
$rss-&amp;gt;title =$feedTitle;&lt;br /&gt;
$rss-&amp;gt;description = &amp;quot;Aktuelle Informaionen&amp;quot;;&lt;br /&gt;
$rss-&amp;gt;itemContentField = &amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDescriptionField =&amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDateField = &amp;#039;date_begin&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// find the pages you want to appear in the feed.&lt;br /&gt;
// this can be any group of pages returned by $pages-&amp;gt;find() or $page-&amp;gt;children(), etc.&lt;br /&gt;
$items = $pages-&amp;gt;find($selector);&lt;br /&gt;
// send the output of the RSS feed, and you are done&lt;br /&gt;
$rss-&amp;gt;render($items);&lt;br /&gt;
exit();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33110</id>
		<title>ProcessWire - RSS Feed</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_RSS_Feed&amp;diff=33110"/>
		<updated>2026-01-15T16:03:45Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: Die Seite wurde neu angelegt: „Wenn man einen RSS Feed benötigt gibt es im Core von ProcessWire bereits ein Modul.   MarkupRSS Es kann bei den Core Modulen aktiviert werden.   Im Template k…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn man einen RSS Feed benötigt gibt es im Core von ProcessWire bereits ein Modul. &lt;br /&gt;
 MarkupRSS&lt;br /&gt;
Es kann bei den Core Modulen aktiviert werden. &lt;br /&gt;
&lt;br /&gt;
Im Template kann an es so z.B. nutzen:&lt;br /&gt;
&lt;br /&gt;
Beispiel TV Altötting&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;
$departmentName = strstr($page-&amp;gt;template-&amp;gt;name,&amp;#039;-&amp;#039;,true);&lt;br /&gt;
$limit = 10; // default limit&lt;br /&gt;
$sort = &amp;#039;-modified&amp;#039;; // default sort&lt;br /&gt;
&lt;br /&gt;
// feed on?&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;opt_1){&lt;br /&gt;
  echo(&amp;#039;Der Feed ist für diese Seite nicht aktiv. Du kannst ihn in den Seiteneinstellungen aktivieren&amp;#039;);&lt;br /&gt;
  exit();&lt;br /&gt;
}&lt;br /&gt;
// feed count&lt;br /&gt;
if($page-&amp;gt;fp_feed &amp;amp;&amp;amp; $page-&amp;gt;fp_feed-&amp;gt;feed_count) $limit = $page-&amp;gt;fp_feed-&amp;gt;feed_count;&lt;br /&gt;
&lt;br /&gt;
$departmentPostTemplate = $departmentName.&amp;#039;-post&amp;#039;;&lt;br /&gt;
$feedTitle = $page-&amp;gt;title.&amp;#039; - Aktuelles&amp;#039;;&lt;br /&gt;
$rss = $modules-&amp;gt;get(&amp;quot;MarkupRSS&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$selector = &amp;quot;template=$departmentPostTemplate, limit=$limit, sort=$sort&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// configure the feed. see the actual module file for more optional config options.&lt;br /&gt;
$rss-&amp;gt;title =$feedTitle;&lt;br /&gt;
$rss-&amp;gt;description = &amp;quot;Aktuelle Informaionen&amp;quot;;&lt;br /&gt;
$rss-&amp;gt;itemContentField = &amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDescriptionField =&amp;#039;infotext&amp;#039;;&lt;br /&gt;
$rss-&amp;gt;itemDateField = &amp;#039;date_begin&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// find the pages you want to appear in the feed.&lt;br /&gt;
// this can be any group of pages returned by $pages-&amp;gt;find() or $page-&amp;gt;children(), etc.&lt;br /&gt;
$items = $pages-&amp;gt;find($selector);&lt;br /&gt;
// send the output of the RSS feed, and you are done&lt;br /&gt;
$rss-&amp;gt;render($items);&lt;br /&gt;
exit();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Job_Template&amp;diff=33107</id>
		<title>ProcessWire - Job Template</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Job_Template&amp;diff=33107"/>
		<updated>2025-12-12T08:39:42Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 ProcessWire - Job Modul&lt;br /&gt;
&lt;br /&gt;
== Beispiel Setting für Jobs mit strukturierten Daten ==&lt;br /&gt;
Beispiel von SPPS&lt;br /&gt;
&lt;br /&gt;
=== Job Template ===&lt;br /&gt;
&lt;br /&gt;
==== Felder ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;job_addresscountry&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 191,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_addresscountry&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Land&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_addresslocality&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 188,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_addresslocality&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Ort&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_addressregion&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 189,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_addressregion&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Job Region&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_basesalary_maxvalue&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 185,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_basesalary_maxvalue&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;job_basesalary_maxvalue&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeInteger&amp;quot;,&lt;br /&gt;
        &amp;quot;zeroNotEmpty&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 33,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 10,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;defaultValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;min&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;max&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_basesalary_minvalue&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 184,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_basesalary_minvalue&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;job_basesalary_minvalue&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeInteger&amp;quot;,&lt;br /&gt;
        &amp;quot;zeroNotEmpty&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 33,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 10,&lt;br /&gt;
        &amp;quot;defaultValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;min&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;max&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_basesalary_unittext&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 186,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_basesalary_unittext&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Bezahlung pro&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeOptions&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;InputfieldSelect&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 33,&lt;br /&gt;
        &amp;quot;initValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;export_options&amp;quot;: {&lt;br /&gt;
            &amp;quot;default&amp;quot;: &amp;quot;1=MONTH|Monat\n2=YEAR|Jahr\n3=HOUR|Stunde\n4=WEEK|Woche\n5=DAY|Tag&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_dateposted&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 179,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_dateposted&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Job Datum&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1922,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2042,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;Y-m-d&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;notes&amp;quot;: &amp;quot;Datum des Postings&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_description&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 181,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_description&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;job_description&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeTextareaLanguage&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;InputfieldCKEditor&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;rows&amp;quot;: 5,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterHannaCode&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;htmlOptions&amp;quot;: [&lt;br /&gt;
            2,&lt;br /&gt;
            4,&lt;br /&gt;
            16&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;langBlankInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;toolbar&amp;quot;: &amp;quot;Format, Styles, -, Bold, Italic, -, RemoveFormat\nNumberedList, BulletedList, -, Blockquote\nPWLink, Unlink, Anchor\nPWImage, Table, HorizontalRule, SpecialChar\nPasteText, PasteFromWord\nScayt, -, Sourcedialog\nJustifyCenter, JustifyLeft, JustifyRight&amp;quot;,&lt;br /&gt;
        &amp;quot;inlineMode&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useACF&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;usePurifier&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;formatTags&amp;quot;: &amp;quot;p;h1;h2;h3;h4;h5;h6;pre;address&amp;quot;,&lt;br /&gt;
        &amp;quot;contentsCss&amp;quot;: &amp;quot;/site/templates/modules/InputfieldCKEditor/contents.css&amp;quot;,&lt;br /&gt;
        &amp;quot;stylesSet&amp;quot;: &amp;quot;customstyles:/site/templates/modules/InputfieldCKEditor/mystyles.js&amp;quot;,&lt;br /&gt;
        &amp;quot;extraPlugins&amp;quot;: [&lt;br /&gt;
            &amp;quot;pwimage&amp;quot;,&lt;br /&gt;
            &amp;quot;pwlink&amp;quot;,&lt;br /&gt;
            &amp;quot;sourcedialog&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;removePlugins&amp;quot;: &amp;quot;image,magicline&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;imageFields&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;toggles&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;extraAllowedContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentsInlineCss&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;customOptions&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;plugin_sourcedialog&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_employmenttype&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 192,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_employmenttype&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Art der Anstellung&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeOptions&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;InputfieldSelect&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;initValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;export_options&amp;quot;: {&lt;br /&gt;
            &amp;quot;default&amp;quot;: &amp;quot;1=FULL_TIME|Vollzeit\n2=PART_TIME|Teilzeit\n3=CONTRACTOR|Vertrag\n4=TEMPORARY|Zeitarbeit\n5=INTERN|Internship (Trainee etc.)\n6=VOLUNTEER|Volontariat\n7=PER_DIEM|Per diem\n8=OTHER|Andere&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_link&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 178,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_link&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Link zum Jobangebot&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeURL&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;noRelative&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowIDN&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowQuotes&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;addRoot&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 1024,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_logo&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 183,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_logo&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Logo&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeImage&amp;quot;,&lt;br /&gt;
        &amp;quot;fileSchema&amp;quot;: 270,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;extensions&amp;quot;: &amp;quot;gif jpg jpeg png&amp;quot;,&lt;br /&gt;
        &amp;quot;maxFiles&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;outputFormat&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;descriptionRows&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;useTags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;gridMode&amp;quot;: &amp;quot;grid&amp;quot;,&lt;br /&gt;
        &amp;quot;focusMode&amp;quot;: &amp;quot;on&amp;quot;,&lt;br /&gt;
        &amp;quot;resizeServer&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;clientQuality&amp;quot;: 90,&lt;br /&gt;
        &amp;quot;maxReject&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dimensionsByAspectRatio&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultValuePage&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;InputfieldImage&amp;quot;,&lt;br /&gt;
        &amp;quot;notes&amp;quot;: &amp;quot;optional&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;outputString&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;entityEncode&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tagsList&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;unzip&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;overwrite&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;maxWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;maxHeight&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;maxSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;minWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;minHeight&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;aspect_ratios&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_organizationname&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 193,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_organizationname&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Name der Organisation&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeOptions&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;InputfieldSelect&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;initValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultValue&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;export_options&amp;quot;: {&lt;br /&gt;
            &amp;quot;default&amp;quot;: &amp;quot;1=intensiv|SPPS Karlsruhe Intensiv\n2=karlsruhe|SPPS Karlsruhe\n3=rastatt|SPPS Ötigheim/Rastatt\n4=pforzheim|SPPS Pforzheim\n5=rheinhausen|SPPS Rheinhausen-Oberhausen\n6=tagespflege|Tagespflege Etje&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_organizationname_old&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 182,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_organizationname_old&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Name der Organisation&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_postalcode&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 190,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_postalcode&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;PLZ&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_streetaddress&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 187,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_streetaddress&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Adresse&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeText&amp;quot;,&lt;br /&gt;
        &amp;quot;textformatters&amp;quot;: [&lt;br /&gt;
            &amp;quot;TextformatterEntities&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
        &amp;quot;showCount&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;inputfieldClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputSize&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeInputWidth&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBlank&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;stripTags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pattern&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;job_validthrough&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 180,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job_validthrough&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Gültig bis&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeDatetime&amp;quot;,&lt;br /&gt;
        &amp;quot;inputType&amp;quot;: &amp;quot;text&amp;quot;,&lt;br /&gt;
        &amp;quot;htmlType&amp;quot;: &amp;quot;date&amp;quot;,&lt;br /&gt;
        &amp;quot;dateSelectFormat&amp;quot;: &amp;quot;yMd&amp;quot;,&lt;br /&gt;
        &amp;quot;yearFrom&amp;quot;: 1922,&lt;br /&gt;
        &amp;quot;yearTo&amp;quot;: 2042,&lt;br /&gt;
        &amp;quot;yearLock&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;datepicker&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;timeInputSelect&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;dateInputFormat&amp;quot;: &amp;quot;Y-m-d&amp;quot;,&lt;br /&gt;
        &amp;quot;size&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 25,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;dateOutputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredAttr&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;dateMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeStep&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMin&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeMax&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;timeInputFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;placeholder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;yearRange&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;defaultToday&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Options für:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;job_basesalary_unittext&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=MONTH|Monat&lt;br /&gt;
2=YEAR|Jahr&lt;br /&gt;
3=HOUR|Stunde&lt;br /&gt;
4=WEEK|Woche&lt;br /&gt;
5=DAY|Tag&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;job_employmenttype&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1=FULL_TIME|Vollzeit&lt;br /&gt;
2=PART_TIME|Teilzeit&lt;br /&gt;
3=CONTRACTOR|Vertrag&lt;br /&gt;
4=TEMPORARY|Zeitarbeit&lt;br /&gt;
5=INTERN|Internship (Trainee etc.)&lt;br /&gt;
6=VOLUNTEER|Volontariat&lt;br /&gt;
7=PER_DIEM|Per diem&lt;br /&gt;
8=OTHER|Andere&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;job_organizationname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kann genutzt werden wenn man mehrere Organisationen hat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Job Fieldset Page&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Das Feld fasst die anderen Felder in eines zusammen. So kann man sie einfacher handeln.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;job&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 177,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Job&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;FieldtypeFieldsetPage&amp;quot;,&lt;br /&gt;
        &amp;quot;notes&amp;quot;: &amp;quot;Daten für ein Jobposting&amp;quot;,&lt;br /&gt;
        &amp;quot;icon&amp;quot;: &amp;quot;wrench&amp;quot;,&lt;br /&gt;
        &amp;quot;template_id&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;parent_id&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;repeaterLoading&amp;quot;: 2,&lt;br /&gt;
        &amp;quot;repeaterMaxItems&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;repeaterMinItems&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;collapsed&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;repeaterFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;job_dateposted&amp;quot;,&lt;br /&gt;
            &amp;quot;job_validthrough&amp;quot;,&lt;br /&gt;
            &amp;quot;job_organizationname&amp;quot;,&lt;br /&gt;
            &amp;quot;job_description&amp;quot;,&lt;br /&gt;
            &amp;quot;job_basesalary_minvalue&amp;quot;,&lt;br /&gt;
            &amp;quot;job_basesalary_maxvalue&amp;quot;,&lt;br /&gt;
            &amp;quot;job_basesalary_unittext&amp;quot;,&lt;br /&gt;
            &amp;quot;job_streetaddress&amp;quot;,&lt;br /&gt;
            &amp;quot;job_postalcode&amp;quot;,&lt;br /&gt;
            &amp;quot;job_addresslocality&amp;quot;,&lt;br /&gt;
            &amp;quot;job_addressregion&amp;quot;,&lt;br /&gt;
            &amp;quot;job_addresscountry&amp;quot;,&lt;br /&gt;
            &amp;quot;job_employmenttype&amp;quot;,&lt;br /&gt;
            &amp;quot;job_link&amp;quot;,&lt;br /&gt;
            &amp;quot;job_logo&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;showIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeOffset&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeBorder&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;themeColor&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;columnWidth&amp;quot;: 100,&lt;br /&gt;
        &amp;quot;required&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;requiredIf&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;job_dateposted&amp;quot;: {&lt;br /&gt;
                &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Datum des Postings. Wenn leer wird das Erstelldatum dieser Seite verwendet.&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;job_validthrough&amp;quot;: {&lt;br /&gt;
                &amp;quot;icon&amp;quot;: &amp;quot;calendar&amp;quot;,&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Empfohlen. Unbefristet für manche Berufsgruppen erlaubt (z.B. Bedienungen)&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;job_organizationname&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_description&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_basesalary_minvalue&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_basesalary_maxvalue&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_basesalary_unittext&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_streetaddress&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_postalcode&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_addresslocality&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_addressregion&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_addresscountry&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_employmenttype&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job_link&amp;quot;: {&lt;br /&gt;
                &amp;quot;notes&amp;quot;: &amp;quot;Wenn leer wird diese Seite genutzt.&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;job_logo&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;
==== Templates Import ====&lt;br /&gt;
Import Daten (Zulässige Kind/Elternseiten von Hand nachtragen)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;job&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 53,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;job&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;job&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;jobs&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;fa-user-circle-o title&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Stellenangebot&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;layout_blocks&amp;quot;,&lt;br /&gt;
            &amp;quot;job&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;layout_blocks&amp;quot;: [],&lt;br /&gt;
            &amp;quot;job&amp;quot;: []&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;jobs&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: 55,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;jobs&amp;quot;,&lt;br /&gt;
        &amp;quot;fieldgroups_id&amp;quot;: &amp;quot;jobs&amp;quot;,&lt;br /&gt;
        &amp;quot;flags&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cache_time&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;useRoles&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;editRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;addRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;createRoles&amp;quot;: [],&lt;br /&gt;
        &amp;quot;rolesPermissions&amp;quot;: [],&lt;br /&gt;
        &amp;quot;noInherit&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;childrenTemplatesID&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;sortfield&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noParents&amp;quot;: -1,&lt;br /&gt;
        &amp;quot;childTemplates&amp;quot;: [&lt;br /&gt;
            &amp;quot;job&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;parentTemplates&amp;quot;: [],&lt;br /&gt;
        &amp;quot;allowPageNum&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;allowChangeUser&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;redirectLogin&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;urlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;https&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrls&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;slashPageNum&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;slashUrlSegments&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;altFilename&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;guestSearchable&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;pageClass&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;childNameFormat&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pageLabelField&amp;quot;: &amp;quot;fa-users title&amp;quot;,&lt;br /&gt;
        &amp;quot;noGlobal&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noMove&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noTrash&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noSettings&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noChangeTemplate&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noShortcut&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noUnpublish&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noLang&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;compile&amp;quot;: 3,&lt;br /&gt;
        &amp;quot;nameContentTab&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noCacheGetVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;noCachePostVars&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;useCacheForUsers&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpire&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;cacheExpirePages&amp;quot;: [],&lt;br /&gt;
        &amp;quot;cacheExpireSelector&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;Stellenangebote&amp;quot;,&lt;br /&gt;
        &amp;quot;tags&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;titleNames&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noPrependTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;noAppendTemplateFile&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;prependFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;appendFile&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;pagefileSecure&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;tabContent&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;tabChildren&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;nameLabel&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;contentType&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
        &amp;quot;errorAction&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;connectedFieldID&amp;quot;: null,&lt;br /&gt;
        &amp;quot;ns&amp;quot;: &amp;quot;ProcessWire&amp;quot;,&lt;br /&gt;
        &amp;quot;_exportMode&amp;quot;: true,&lt;br /&gt;
        &amp;quot;roles&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupFields&amp;quot;: [&lt;br /&gt;
            &amp;quot;title&amp;quot;,&lt;br /&gt;
            &amp;quot;layout_blocks&amp;quot;,&lt;br /&gt;
            &amp;quot;images&amp;quot;,&lt;br /&gt;
            &amp;quot;files&amp;quot;,&lt;br /&gt;
            &amp;quot;menu&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;fieldgroupContexts&amp;quot;: {&lt;br /&gt;
            &amp;quot;title&amp;quot;: [],&lt;br /&gt;
            &amp;quot;layout_blocks&amp;quot;: [],&lt;br /&gt;
            &amp;quot;images&amp;quot;: [],&lt;br /&gt;
            &amp;quot;files&amp;quot;: [],&lt;br /&gt;
            &amp;quot;menu&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;
=== Template Jobs ===&lt;br /&gt;
Todo besser als Layout-Block&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// JOBLIST&lt;br /&gt;
$joblist = &amp;#039;&amp;#039;;&lt;br /&gt;
$jobs = pages(&amp;#039;template=job,sort=-published&amp;#039;);&lt;br /&gt;
foreach ($jobs as $item) {&lt;br /&gt;
  $joblist .= &amp;#039;&amp;lt;li class=&amp;quot;joblist-item&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$item-&amp;gt;title.&amp;#039; (&amp;#039;.$item-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title.&amp;#039;)&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$joblist = &amp;#039;&amp;lt;ul class=&amp;quot;joblist&amp;quot;&amp;gt;&amp;#039;.$joblist.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Template Job ===&lt;br /&gt;
Benötigt im Admin Bereich nur das job Feld. In diesem sind alle anderen benötigten Felder bereits enthalten.&lt;br /&gt;
&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;
include_once(&amp;#039;includes/SchemaHelper.php&amp;#039;);&lt;br /&gt;
$sh = new SchemaHelper;&lt;br /&gt;
$jsonld = $sh-&amp;gt;jsonldJobPosting($page);&lt;br /&gt;
&lt;br /&gt;
// BEWERBUNGSFORMULAR WENN GESÜNSCHT&lt;br /&gt;
$contact =  $forms-&amp;gt;render(&amp;#039;bewerbung&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;apply&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;&amp;lt;?=$page-&amp;gt;title?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;job-description&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_description?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;&amp;quot;&amp;gt;Arbeitgeber&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title?&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
	&amp;lt;?=$page-&amp;gt;link?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;font-heavy&amp;quot;&amp;gt;Arbeitsort&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_streetaddress?&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
        &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_postalcode?&amp;gt; &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_addresslocality?&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;?php if ($page-&amp;gt;job-&amp;gt;job_basesalary_minvalue &amp;amp;&amp;amp; $page-&amp;gt;job-&amp;gt;job_basesalary_maxvalue &amp;amp;&amp;amp; $page-&amp;gt;job-&amp;gt;job_basesalary_unittext): ?&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;font-heavy&amp;quot;&amp;gt;Vergütung&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&amp;lt;?=$page-&amp;gt;job-&amp;gt;job_basesalary_minvalue?&amp;gt;€ - &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_basesalary_maxvalue?&amp;gt;€ &amp;lt;?=$page-&amp;gt;job-&amp;gt;job_basesalary_unittext-&amp;gt;title?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;?php elseif($page-&amp;gt;job-&amp;gt;job_basesalary_minvalue &amp;amp;&amp;amp; $page-&amp;gt;job-&amp;gt;job_basesalary_unittext): ?&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;font-heavy&amp;quot;&amp;gt;Vergütung&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div&amp;gt;&amp;lt;?=$page-&amp;gt;job-&amp;gt;job_basesalary_minvalue?&amp;gt;€ &amp;lt;?=$page-&amp;gt;unit-&amp;gt;title?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;?php endif ?&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;font-heavy pt-20&amp;quot;&amp;gt;Art der Anstellung&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;pb-30&amp;quot;&amp;gt;&amp;lt;?=$page-&amp;gt;job-&amp;gt;job_employmenttype-&amp;gt;title?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Bewerbungsmöglichkeit --&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;apply-form&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;h2&amp;gt;Bewerbung&amp;lt;/h2&amp;gt;&lt;br /&gt;
      &amp;lt;div&amp;gt;&amp;lt;?= $contact ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- job ldjson --&amp;gt;&lt;br /&gt;
    &amp;lt;?=$jsonld?&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$content = ob_get_clean();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bewerbungsformular ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;required&amp;quot;: false,&lt;br /&gt;
    &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-resend&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;flags&amp;quot;: 256,&lt;br /&gt;
    &amp;quot;pluginActions&amp;quot;: [],&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Uikit3&amp;quot;,&lt;br /&gt;
    &amp;quot;allowPreset&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;skipSessionKey&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;useCookies&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;partialEntryDays&amp;quot;: 14,&lt;br /&gt;
    &amp;quot;spamEntryDays&amp;quot;: 7,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Absenden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank - Ihre Bewerbung wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Ein Fehler ist aufgetreten. Bitte überprüfen Sie Ihre Eingaben.&amp;quot;,&lt;br /&gt;
    &amp;quot;mobilePx&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;frBasic_noLoad&amp;quot;: [],&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/basic/main.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_itemContent&amp;quot;: [&lt;br /&gt;
        &amp;quot;description&amp;quot;,&lt;br /&gt;
        &amp;quot;out&amp;quot;,&lt;br /&gt;
        &amp;quot;error&amp;quot;,&lt;br /&gt;
        &amp;quot;notes&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;spamFlags&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;listFields&amp;quot;: [],&lt;br /&gt;
    &amp;quot;entryDays&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Bewerbungsformular auf salus-klinik.de&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 35,&lt;br /&gt;
    &amp;quot;spamWords&amp;quot;: [],&lt;br /&gt;
    &amp;quot;honeypot&amp;quot;: &amp;quot;name_1&amp;quot;,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit3_noLoad&amp;quot;: [&lt;br /&gt;
        &amp;quot;framework&amp;quot;,&lt;br /&gt;
        &amp;quot;jquery&amp;quot;,&lt;br /&gt;
        &amp;quot;jqueryui&amp;quot;&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;frUikit3_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit3/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit3_css&amp;quot;: &amp;quot;uikit.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit3_horizontal&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit3_inlineErrorBelow&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit3_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frUikit3_buttonType&amp;quot;: &amp;quot;primary&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: false,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;collapsed&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;showCount&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;name_2&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;collapsed&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;showCount&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Email&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;collapsed&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 250,&lt;br /&gt;
            &amp;quot;showCount&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;collapsed&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;minlength&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;showCount&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 0&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;bewerbungsunterlagen&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;FormBuilderFile&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Bewerbungsunterlagen&amp;quot;,&lt;br /&gt;
            &amp;quot;notes&amp;quot;: &amp;quot;Maximal 3 Dateien á 5MB&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: false,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;collapsed&amp;quot;: &amp;quot;0&amp;quot;,&lt;br /&gt;
            &amp;quot;extensions&amp;quot;: &amp;quot;pdf doc docx xls xlsx gif jpg jpeg png&amp;quot;,&lt;br /&gt;
            &amp;quot;maxFiles&amp;quot;: 3,&lt;br /&gt;
            &amp;quot;maxFileSize&amp;quot;: 5242880&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Layout Block - Job-Liste ===&lt;br /&gt;
Beispiel Salus&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;
$sectionClasses = array($page-&amp;gt;_type);&lt;br /&gt;
$containerClasses = array(&amp;#039;ani section&amp;#039;);&lt;br /&gt;
if($page-&amp;gt;bg &amp;amp;&amp;amp; $page-&amp;gt;bg-&amp;gt;value) {&lt;br /&gt;
    $colorClassBorder = $page-&amp;gt;bg-&amp;gt;value;&lt;br /&gt;
    $colorClassContent = $page-&amp;gt;bg-&amp;gt;value;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $colorClassBorder = &amp;#039;bc1&amp;#039;;&lt;br /&gt;
    $colorClassContent = &amp;#039;bc1&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$jobsMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
$jobsAccordion = new Box;&lt;br /&gt;
$jobs = pages(&amp;#039;template=job,sort=-published&amp;#039;);&lt;br /&gt;
foreach ($jobs as $item) {&lt;br /&gt;
&lt;br /&gt;
    $jobsMarkup .= &amp;#039;&lt;br /&gt;
      &amp;lt;li class=&amp;quot;bc1 joblist-item&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;a class=&amp;quot;uk-accordion-title uk-padding-small&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;#039;.$item-&amp;gt;title.&amp;#039;&lt;br /&gt;
        &amp;lt;/a&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;uk-accordion-content uk-padding-small nmt npt&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;#039;.$item-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title.&amp;#039;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Arbeitsort:&amp;lt;/strong&amp;gt; &amp;#039;.$item-&amp;gt;job-&amp;gt;job_addresslocality.&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
          &amp;lt;strong&amp;gt;Art der Anstellung: &amp;lt;/strong&amp;gt;&amp;#039;.$item-&amp;gt;job-&amp;gt;job_employmenttype-&amp;gt;title.&amp;#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
          &amp;lt;p&amp;gt;&amp;lt;a class=&amp;quot;uk-button uk-button-primary&amp;quot; href=&amp;quot;&amp;#039;.$item-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;Zur Stellenbeschreibung&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$jobsAccordion-&amp;gt;addClasses(&amp;#039;accordion uk-accordion nmb&amp;#039;);&lt;br /&gt;
$jobsAccordion-&amp;gt;addAttributes(&amp;#039;uk-accordion=&amp;quot;&amp;quot;&amp;#039;); // i.e. active:0&lt;br /&gt;
$out .= $jobsAccordion-&amp;gt;wrap($jobsMarkup,&amp;#039;ul&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// RANDSPALTE?&lt;br /&gt;
$out = &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;uk-grid uk-grid-collapse uk-grid-match&amp;quot; uk-grid&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;uk-visible@m uk-width-1-5 &amp;#039;.$colorClassBorder.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;uk-padding-small&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div class=&amp;quot;uk-width-expand@m&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;uk-padding npt npb npr&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;#039;.renderHeadline($page).&amp;#039;&lt;br /&gt;
            &amp;#039;. $out .&amp;#039;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
//$out = renderContainer($page,$out,$containerClasses);&lt;br /&gt;
$out = renderSection($page,$out,$sectionClasses,array(&amp;#039;skipDefaultClasses&amp;#039;=&amp;gt;false));&lt;br /&gt;
return $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Funktionalität ===&lt;br /&gt;
==== SchemaHelper ====&lt;br /&gt;
Für Erzeugung der Strukturierten Daten&lt;br /&gt;
&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;
 * SchemaHelper&lt;br /&gt;
 * Class for structured data&lt;br /&gt;
 * V1.0&lt;br /&gt;
 */&lt;br /&gt;
// @todo outsource some of the nessecary types (i.e. place) in backend use&lt;br /&gt;
// fieldgroups for that maybe s.th. like $place = getFg(&amp;#039;schema_place&amp;#039;)&lt;br /&gt;
class SchemaHelper{&lt;br /&gt;
	// Load the requested schema from the schemas directory and register the class&lt;br /&gt;
	public function jsonldJobPosting ($p) {&lt;br /&gt;
		$jsonld = array();&lt;br /&gt;
		$sanitizer = wire(&amp;#039;sanitizer&amp;#039;);&lt;br /&gt;
		//set unset fields (for not mandatory fields)&lt;br /&gt;
		$p-&amp;gt;job-&amp;gt;job_validthrough = $p-&amp;gt;job-&amp;gt;job_validthrough ? : &amp;#039;&amp;#039;; // todo test&lt;br /&gt;
&lt;br /&gt;
		$jsonld[&amp;quot;@context&amp;quot;] = &amp;quot;http://schema.org/&amp;quot;;&lt;br /&gt;
		$jsonld[&amp;quot;@type&amp;quot;] = &amp;quot;JobPosting&amp;quot;;&lt;br /&gt;
		if($p-&amp;gt;job-&amp;gt;job_link) $jsonld[&amp;quot;url&amp;quot;] = $p-&amp;gt;job-&amp;gt;job_link;&lt;br /&gt;
		else $jsonld[&amp;quot;url&amp;quot;] = $sanitizer-&amp;gt;url($p-&amp;gt;httpUrl);&lt;br /&gt;
		$jsonld[&amp;quot;datePosted&amp;quot;] = !empty($p-&amp;gt;job-&amp;gt;job_dateposted) ? date(&amp;#039;Y-m-d&amp;#039;, $p-&amp;gt;job-&amp;gt;getUnformatted(&amp;#039;job_dateposted&amp;#039;) ) : date(&amp;#039;Y-m-d&amp;#039;, strtotime($p-&amp;gt;created));&lt;br /&gt;
		$jsonld[&amp;quot;validThrough&amp;quot;] = date(&amp;#039;Y-m-d&amp;#039;, $p-&amp;gt;job-&amp;gt;getUnformatted(&amp;#039;job_validthrough&amp;#039;) );&lt;br /&gt;
		$jsonld[&amp;quot;description&amp;quot;] = $sanitizer-&amp;gt;textarea($p-&amp;gt;job-&amp;gt;job_description);&lt;br /&gt;
		$jsonld[&amp;#039;hiringOrganization&amp;#039;] = array(&lt;br /&gt;
			&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;Organization&amp;quot;,&lt;br /&gt;
			&amp;quot;name&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title),&lt;br /&gt;
			&amp;quot;sameAs&amp;quot; =&amp;gt; $sanitizer-&amp;gt;url($p-&amp;gt;job-&amp;gt;job_link)&lt;br /&gt;
		);&lt;br /&gt;
		if($p-&amp;gt;job-&amp;gt;link2)$jsonld[&amp;#039;hiringOrganization&amp;#039;][&amp;#039;logo&amp;#039;] = $p-&amp;gt;job-&amp;gt;link2;&lt;br /&gt;
		$jsonld[&amp;#039;title&amp;#039;] = $sanitizer-&amp;gt;text($p-&amp;gt;title);&lt;br /&gt;
&lt;br /&gt;
		if($p-&amp;gt;job-&amp;gt;job_basesalary_minvalue &amp;amp;&amp;amp; $p-&amp;gt;job-&amp;gt;job_basesalary_maxvalue &amp;amp;&amp;amp; $p-&amp;gt;job-&amp;gt;job_basesalary_unittext){&lt;br /&gt;
			$jsonld[&amp;#039;baseSalary&amp;#039;] = array(&lt;br /&gt;
				&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;MonetaryAmount&amp;quot;,&lt;br /&gt;
				&amp;quot;currency&amp;quot; =&amp;gt; &amp;quot;EUR&amp;quot;,&lt;br /&gt;
				&amp;quot;value&amp;quot; =&amp;gt; array(&lt;br /&gt;
					&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;QuantitativeValue&amp;quot;,&lt;br /&gt;
					&amp;quot;minValue&amp;quot; =&amp;gt; $sanitizer-&amp;gt;float($p-&amp;gt;job-&amp;gt;job_basesalary_minvalue),&lt;br /&gt;
					&amp;quot;maxValue&amp;quot; =&amp;gt; $sanitizer-&amp;gt;float($p-&amp;gt;job-&amp;gt;job_basesalary_maxvalue),&lt;br /&gt;
					&amp;quot;unitText&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_basesalary_unittext-&amp;gt;value)&lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
		}else if($p-&amp;gt;job-&amp;gt;job_basesalary_minvalue &amp;amp;&amp;amp; $p-&amp;gt;job-&amp;gt;job_basesalary_unittext){&lt;br /&gt;
			$jsonld[&amp;#039;baseSalary&amp;#039;] = array(&lt;br /&gt;
				&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;MonetaryAmount&amp;quot;,&lt;br /&gt;
				&amp;quot;currency&amp;quot; =&amp;gt; &amp;quot;EUR&amp;quot;,&lt;br /&gt;
				&amp;quot;value&amp;quot; =&amp;gt; array(&lt;br /&gt;
					&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;QuantitativeValue&amp;quot;,&lt;br /&gt;
					&amp;quot;value&amp;quot; =&amp;gt; $sanitizer-&amp;gt;float($p-&amp;gt;job-&amp;gt;job_basesalary_minvalue),&lt;br /&gt;
					&amp;quot;unitText&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_basesalary_unittext-&amp;gt;value)&lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		$jsonld[&amp;#039;jobLocation&amp;#039;] = array(&lt;br /&gt;
			&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;Place&amp;quot;,&lt;br /&gt;
			&amp;quot;address&amp;quot; =&amp;gt; array(&lt;br /&gt;
				&amp;quot;@type&amp;quot; =&amp;gt; &amp;quot;PostalAddress&amp;quot;,&lt;br /&gt;
				&amp;quot;streetAddress&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_streetaddress),&lt;br /&gt;
				&amp;quot;addressLocality&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_addresslocality),&lt;br /&gt;
				&amp;quot;addressRegion&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_addressregion),&lt;br /&gt;
				&amp;quot;postalCode&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_postalcode),&lt;br /&gt;
				&amp;quot;addressCountry&amp;quot; =&amp;gt; $sanitizer-&amp;gt;text($p-&amp;gt;job-&amp;gt;job_addresscountry),&lt;br /&gt;
			)&lt;br /&gt;
		);&lt;br /&gt;
		// recommended properties&lt;br /&gt;
&lt;br /&gt;
		if($c = count($p-&amp;gt;job-&amp;gt;job_employmenttype)){&lt;br /&gt;
			$types = array();&lt;br /&gt;
			foreach($p-&amp;gt;job-&amp;gt;job_employmenttype as $type){&lt;br /&gt;
				$types[] = $sanitizer-&amp;gt;text($type-&amp;gt;value);&lt;br /&gt;
			}&lt;br /&gt;
			//var_dump($c);&lt;br /&gt;
			if($c &amp;gt; 1) $jsonld[&amp;#039;employmentType&amp;#039;] = $types;&lt;br /&gt;
			else $jsonld[&amp;#039;employmentType&amp;#039;] = $types[0];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//$out .= &amp;#039;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&amp;#039; . json_encode($jsonld) . &amp;#039;&amp;lt;/script&amp;gt;&amp;#039;;&lt;br /&gt;
		$out = &amp;#039;&amp;lt;script type=&amp;quot;application/ld+json&amp;quot;&amp;gt;&amp;#039; . json_encode($jsonld,JSON_PRETTY_PRINT) . &amp;#039;&amp;lt;/script&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=33106</id>
		<title>3D-Druck</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=3D-Druck&amp;diff=33106"/>
		<updated>2025-12-11T08:06:02Z</updated>

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

		<summary type="html">&lt;p&gt;109.193.152.88: /* Feintuning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ablauf ==&lt;br /&gt;
Was kann man Einstellen und auf was hat es Einfluss?&lt;br /&gt;
* Laufwägen - Andruck der Rollen checken&lt;br /&gt;
* Motoren eSteps kalibrieren&lt;br /&gt;
** Achsen für Maßhaltigkeit (Calibration Cube)&lt;br /&gt;
** Extruder für Flow&lt;br /&gt;
&lt;br /&gt;
== Bedleveling - Druckbett einstellen ==&lt;br /&gt;
 https://drucktipps3d.de/bettleveling-bettleveling-und-immer-wieder-bettleveling/&lt;br /&gt;
&lt;br /&gt;
* Bett vorheizen&lt;br /&gt;
* Autohome&lt;br /&gt;
* Stepper aus (außer z bei bettwewegern) &lt;br /&gt;
* links vorn, links hinten, rechts hinten, rechts vorn&lt;br /&gt;
* 2. Runde, Mitte&lt;br /&gt;
=== Feintuning ===&lt;br /&gt;
Feinausrichtung.&lt;br /&gt;
&lt;br /&gt;
Der erste Layer entscheidet.&lt;br /&gt;
&lt;br /&gt;
* Druckobjekt aus 5 Quadraten mit ca. 20mm Kantenlänge, Höhe 0,2mm (1 Layer) &lt;br /&gt;
* 4 Ecken und der Mitte anordnen.&lt;br /&gt;
* Im Slicer Skirt mit ca. 5 Linien hinzu&lt;br /&gt;
* Geschwindigkeit drastisch reduzieren (direkt im Drucker regeln z.B. 30%), dann kann man direkt reagieren und die Haftung ist gut.&lt;br /&gt;
&lt;br /&gt;
Beim Druck des Skirt könnt Ihr optisch und mit dem Finger fühlen ob und wie die Plastewurst auf dem Druckbett haftet und könnt das Druckbett nachjustieren. &lt;br /&gt;
An den Quadraten bekommt Ihr das Ergebnis Eurer Bemühung. Eine saubere geschlossene Fläche ist das Ziel. Fehlerbilder für Düsenabstand und andere Druckprobleme findet Ihr mit Erklärung auf der Seite von Simplify 3D. &lt;br /&gt;
&lt;br /&gt;
Wiederholt diesen Ausdruck bis das Ergebnis perfekt ist.&lt;br /&gt;
&lt;br /&gt;
== Probleme und Lösungen ==&lt;br /&gt;
&lt;br /&gt;
=== Stringing ===&lt;br /&gt;
* Feuchtes Filament &lt;br /&gt;
* Nozzle verschmuzt&lt;br /&gt;
* Retraction zu schwach oder/und zu schnell&lt;br /&gt;
* Kühlung falsch&lt;br /&gt;
* Bowdenzug hat viel Spiel&lt;br /&gt;
* Temperatur falsch (Heattower drucken)&lt;br /&gt;
&lt;br /&gt;
=== Über- Unterextrudierung ===&lt;br /&gt;
&lt;br /&gt;
=== Betthaftung ===&lt;br /&gt;
* Auflagefläche zu klein&lt;br /&gt;
* Nozzle zu weit weg (Druckbett leveln)&lt;br /&gt;
* Fett auf der Fläche&lt;br /&gt;
* Temperatur falsch (vor allem bei ABS etc wichtig)&lt;br /&gt;
&lt;br /&gt;
== Tests ==&lt;br /&gt;
&lt;br /&gt;
=== Flow Control / Fluss einstellen ===&lt;br /&gt;
Den Flow kann man in Cura einstellen. &lt;br /&gt;
Landen pro Schicht wirklich 0.4mm auf dem Bett, wenn 0.4mm eingestellt sind? &lt;br /&gt;
Abhängig haupsächlich von:&lt;br /&gt;
* Extruderkalibrierung =&amp;gt; ERST MAL EXTRUDER RICHTIG KALIBRIEREN, DANN FLOW ALS FEINEINSTELLUNG FÜR FILAMENT ANPASSEN&lt;br /&gt;
* Filament - Wenn das dicker ist kommt mehr raus&lt;br /&gt;
&lt;br /&gt;
==== Flow Tests ====&lt;br /&gt;
20mm Calibration Cube laden (Wandstärke 1 Schicht)&lt;br /&gt;
&lt;br /&gt;
Cura:&lt;br /&gt;
 Linienbreite 0.4mm, Wandanzahl: 1&lt;br /&gt;
 Obere Untere Schichten 0 (nur Wände)&lt;br /&gt;
 Infill keins&lt;br /&gt;
 Flow steht auf 100%&lt;br /&gt;
&lt;br /&gt;
Nach dem Drucken Wandstärke messen (am besten nur oben wg. Elefantenfüßen)&lt;br /&gt;
&lt;br /&gt;
 Soll-Wandstärke x 100 / IstWandstärke = Flow&lt;br /&gt;
&lt;br /&gt;
z.B. 0.4 * 100 / 0.48 = 83,5&lt;br /&gt;
&lt;br /&gt;
im Zweifel vlt. eher Aufrunden (Ungenauigkeiten, Hitze... tragen eher breiter auf)&lt;br /&gt;
&lt;br /&gt;
=== Extruder Fördermenge kalibrieren / eSteps einstellen ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Prinzip:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
10cm fördern, tatsächliche Fördermenge messen&lt;br /&gt;
&lt;br /&gt;
 Neue Steps = Alte Steps / Tatsächlich geförderte Länge * gewünschte Länge&lt;br /&gt;
Neue Werte über Display oder über Terminalsoftware im Drucker speichern.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Details:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 https://all3dp.com/de/2/extruder-kalibrierung-3d-drucker/&lt;br /&gt;
&lt;br /&gt;
Du kannst die Messung und Speicherung der Werte entweder über das Druckermenü (zumindest bei aktuellen Druckern) oder über ein Terminal o.ä. machen. Das geht z.B. in Pronterface.&lt;br /&gt;
&lt;br /&gt;
==== Messung und Berechnung in der Praxis ====&lt;br /&gt;
* eSteps auslesen&lt;br /&gt;
 m503&lt;br /&gt;
* Düse vorheizen&lt;br /&gt;
* Material am Einzug und 12cm weiter hinten mit Stift markieren&lt;br /&gt;
* Extrusion resetten&lt;br /&gt;
 M83&lt;br /&gt;
* 10cm Einziehen (Terminal oder im Menü der Bedieneinheit) &lt;br /&gt;
 G1 E100 F100&lt;br /&gt;
* Schauen ob genau 2cm bis zur Markierung übrig sind. Wenn weniger hat er zuviel eingezogen, wenn mehr hat er zu wenig eingezogen.&lt;br /&gt;
* Neue Steps berechnen&lt;br /&gt;
 Beispiel: &lt;br /&gt;
 22,6mm übrig =&amp;gt; Tatsächlich geförderte Menge ist 120mm - 22,6mm = 97,4&lt;br /&gt;
 Alte Steps * gewünschte Länge / Tatsächlich geförderte Länge = Neue Steps&lt;br /&gt;
 100 * 100 / 97,4mm = 102,669 =&amp;gt; ca 102,67&lt;br /&gt;
* Neue eSteps setzen und speichern (Komma konnte man bei mir zweistellig angeben):&lt;br /&gt;
 M92 E102.67&lt;br /&gt;
 M500&lt;br /&gt;
&lt;br /&gt;
==== Mit Pronterface verbinden und Drucker steuern ====&lt;br /&gt;
&lt;br /&gt;
Bei mir auf dem Mac&lt;br /&gt;
 tty.usbserial-14330 at baudrate 115200:&lt;br /&gt;
Seriell über usb sollte in der Regel mit tty.usbserial oder tty.usbmodem starten. Baudrate hat 115200 für den Ender 5 gepasst. Andere funktionierten nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Die wichtigsten Befehle für Pronterface:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 M83 = Extrusion auf 0 setzen (ist wohl so eine Art zwischenspeicher)&lt;br /&gt;
&lt;br /&gt;
 M503 = gespeicherte e Steps anzeigen lassen&lt;br /&gt;
Der Drucker gibt dann eine ganze Latte an Infos aus Wichtig für uns die Zeile die mit M92 beginnt oben sehen wir auch noch was eine unit bedeutet wir wissen also unser Extruder macht hier 100 Schritte pro mm:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m503&lt;br /&gt;
SENDING:M503&lt;br /&gt;
echo:  G21    ; Units in mm (mm)&lt;br /&gt;
...&lt;br /&gt;
echo:Steps per unit:&lt;br /&gt;
echo: M92 X80.00 Y80.00 Z800.00 E100.00&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Am Ende sieht man am Wert E100.00 die Steps des Extruder pro Einheit (bei uns mm). Das sind die sogenannten ESteps&lt;br /&gt;
&lt;br /&gt;
 G1 E100 F50 = 10cm langsam fördern (G = Go / E Extrude / F = Fast )&lt;br /&gt;
&lt;br /&gt;
 M92 E(neue Steps) = neue e Steps im System hinterlegen (Punkte keine Kommas!)&lt;br /&gt;
&lt;br /&gt;
 M500 = neuen Wert in der Firmware speichern&lt;br /&gt;
&lt;br /&gt;
https://www.pronterface.com/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Regeln&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
25%-75% Regel&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Hanna_Code_(Module)&amp;diff=33104</id>
		<title>ProcessWire - Hanna Code (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Hanna_Code_(Module)&amp;diff=33104"/>
		<updated>2025-11-10T07:16:54Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TextformatterHannaCode&lt;br /&gt;
&lt;br /&gt;
Easily insert any complex HTML, Javascript or PHP output in your ProcessWire content by creating your own Hanna code tags.&lt;br /&gt;
 https://github.com/ryancramerdesign/ProcessHannaCode#using-hanna-code-from-the-api&lt;br /&gt;
&lt;br /&gt;
== Hanna Code Snippets ==&lt;br /&gt;
=== find parent page ===&lt;br /&gt;
Sometime you need to find a parent page.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if (!function_exists(&amp;#039;getPage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
    function getPage($myPage, $level=1){&lt;br /&gt;
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
        $maxLevel=5;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
           &lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
            &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Image from RepeaterMatrix or Repeater ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// include a image from the parent page&lt;br /&gt;
if (!function_exists(&amp;#039;getImagePage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
    function getImagePage($myPage, $level=1){&lt;br /&gt;
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
        $maxLevel=5;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
           &lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
            &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$imagePage = getImagePage($page);&lt;br /&gt;
$images = $imagePage-&amp;gt;images;&lt;br /&gt;
$imgTag = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
if($images){&lt;br /&gt;
    if(isset($file)){&lt;br /&gt;
        isset($width) ? $image =  $images-&amp;gt;get($file)-&amp;gt;width($width) : $image = $images-&amp;gt;get($file);&lt;br /&gt;
        $imgTag .= &amp;quot;&amp;lt;img src=&amp;#039;$image-&amp;gt;url&amp;#039;&amp;quot;; &lt;br /&gt;
        if(isset($width)) $imgTag .= &amp;quot; width=&amp;#039;$width&amp;#039;&amp;quot;;&lt;br /&gt;
        if(isset($class)) $imgTag .= &amp;quot; class=&amp;#039;$class&amp;#039;&amp;quot;;&lt;br /&gt;
        if(isset($style)) $imgTag .= &amp;quot; style=&amp;#039;$style&amp;#039;&amp;quot;;&lt;br /&gt;
        $imgTag .= &amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
        $out = $imgTag;&lt;br /&gt;
    }else{&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Gib einen Bildnamen an z.B.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        foreach($images as $image){&lt;br /&gt;
            $out .= &amp;#039;&amp;lt;p&amp;gt;[[image file=&amp;quot;&amp;#039;.$image-&amp;gt;name.&amp;#039;&amp;quot;]]&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}else{&lt;br /&gt;
   $out .= &amp;#039;&amp;lt;p&amp;gt;Keine Bilder auf der Seite gefunden&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Templates ===&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 echo(urls()-&amp;gt;templates);&lt;br /&gt;
&lt;br /&gt;
=== Video ===&lt;br /&gt;
Von chargercube - todo security / video field statt dateifeld&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// include a image from the parent page&lt;br /&gt;
if (!function_exists(&amp;#039;getImagePage&amp;#039;)) {&lt;br /&gt;
    &lt;br /&gt;
    function getImagePage($myPage, $level=1){&lt;br /&gt;
        // if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
        $maxLevel=5;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getForPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getImagePage($forPage);&lt;br /&gt;
           &lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
            &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$imagePage = getImagePage($page);&lt;br /&gt;
//var_dump($imagePage-&amp;gt;name);&lt;br /&gt;
$files = $imagePage-&amp;gt;files;&lt;br /&gt;
$videoTag = &amp;#039;&amp;#039;;&lt;br /&gt;
$videoValid = false;&lt;br /&gt;
$styles = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
if($files){&lt;br /&gt;
    if(isset($file)){&lt;br /&gt;
        $file = $files-&amp;gt;get($file); // we need the file object not the file name&lt;br /&gt;
        if(isset($width)) $styles = &amp;#039;width: &amp;#039;.$width.&amp;#039;; max-width: 100%; height: auto;&amp;#039;; &lt;br /&gt;
        else $styles = &amp;#039;width: 100%; height: auto;&amp;#039;;&lt;br /&gt;
        if($file){&lt;br /&gt;
            $videoValid = true;&lt;br /&gt;
            $videoTag .= &amp;#039;&lt;br /&gt;
            &amp;lt;video style=&amp;quot;&amp;#039;.$styles.&amp;#039;&amp;quot; preload=&amp;quot;preload&amp;quot; playsinline=&amp;quot;&amp;quot; controls=&amp;quot;&amp;quot; uk-video=&amp;quot;autoplay: false&amp;quot; aria-hidden=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;source src=&amp;quot;&amp;#039;.$file-&amp;gt;url.&amp;#039;&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&lt;br /&gt;
                Ihr Browser unterstützt kein Video Tag&lt;br /&gt;
            &amp;lt;/video&amp;gt;&lt;br /&gt;
            &amp;#039;;&lt;br /&gt;
            $out = $videoTag;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(!$videoValid){&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Gib einen Dateinamen an. Dateien auf dieser Seite:.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
        foreach($files as $file){&lt;br /&gt;
            $out .= &amp;#039;&amp;lt;p&amp;gt;[[video file=&amp;quot;&amp;#039;.$file-&amp;gt;name.&amp;#039;&amp;quot;]]&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}else{&lt;br /&gt;
   $out .= &amp;#039;&amp;lt;p&amp;gt;Keine Dateien auf der Seite gefunden&amp;lt;/p&amp;gt;&amp;#039;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $out;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Heading ===&lt;br /&gt;
Genbänkle&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
 tag=h2&lt;br /&gt;
 heading&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
echo($heading);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Next Events ===&lt;br /&gt;
Genbänkle&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$today = strtotime(date(&amp;#039;Y-m-d&amp;#039;));&lt;br /&gt;
$eventPage = $pages-&amp;gt;get(&amp;#039;/termine/&amp;#039;);&lt;br /&gt;
$mySelector = &amp;quot;template=event,limit=2,sort=event_date,event_date&amp;gt;=$today&amp;quot;;&lt;br /&gt;
$events = $pages-&amp;gt;find($mySelector);&lt;br /&gt;
$eventListMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
foreach($events as $event){&lt;br /&gt;
    $eventListMarkup .= &amp;#039;&amp;lt;div class=&amp;quot;date uk-text-muted&amp;quot;&amp;gt;&amp;#039;.$event-&amp;gt;event_date.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
    $eventListMarkup .= &amp;#039;&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$event-&amp;gt;url().&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$event-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;#039;;    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $eventListMarkup;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Childnavigation ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
($attr[&amp;#039;parent&amp;#039;]) ? $parent = $pages-&amp;gt;get($attr[&amp;#039;parent&amp;#039;]) : $parent = $page;&lt;br /&gt;
$children = $parent-&amp;gt;children();&lt;br /&gt;
$out .= &amp;#039;&amp;lt;ul class=&amp;quot;childnav&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
foreach ($children as $child){&lt;br /&gt;
    $out .= &amp;#039;&amp;lt;li class=&amp;quot;nav-item&amp;quot;&amp;gt;&amp;lt;a class=&amp;quot;nav-link&amp;quot; href=&amp;quot;&amp;#039;.$child-&amp;gt;url.&amp;#039;&amp;quot;&amp;gt;&amp;#039;. $child-&amp;gt;title . &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
$out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Social Media Icons über Repeater ===&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;
// SOCIALMEDIA&lt;br /&gt;
$socialmedia = &amp;#039;&amp;#039;;&lt;br /&gt;
$p = $pages-&amp;gt;get(&amp;#039;/site-configuration/&amp;#039;);&lt;br /&gt;
//bd($p-&amp;gt;r_socialicons);&lt;br /&gt;
foreach($p-&amp;gt;r_socialicons as $item){&lt;br /&gt;
    if($item-&amp;gt;link){&lt;br /&gt;
	    $socialmedia .= &amp;#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#039;.$item-&amp;gt;link.&amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot; description=&amp;quot;&amp;#039;.$item-&amp;gt;text.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&amp;#039;.$item-&amp;gt;single_image-&amp;gt;width(48)-&amp;gt;url.&amp;#039;&amp;quot; uk-tooltip=&amp;quot;&amp;#039;.$item-&amp;gt;text.&amp;#039;&amp;quot; alt=&amp;quot;&amp;#039;.$item-&amp;gt;text.&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;.$item-&amp;gt;text.&amp;#039;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return &amp;#039;&amp;lt;ul class=&amp;quot;nav socialicons uk-flex uk-flex-center@m nmb&amp;quot;&amp;gt;&amp;#039;.$socialmedia.&amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content einer beliebigen Seite rendern ===&lt;br /&gt;
Hier am Beispiel einer Seite die Charts rendert (Template chart).&lt;br /&gt;
 [[chart pageid=1234]]&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;
// if in repeater or repeaterMatrix find the first parent ProcessWire\Page Page&lt;br /&gt;
if (!function_exists(&amp;#039;getParentPage&amp;#039;)) {&lt;br /&gt;
    function getParentPage($myPage, $level=1){&lt;br /&gt;
        $maxLevel=3;&lt;br /&gt;
        if( get_class($myPage) == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039; || get_class($myPage) == &amp;#039;ProcessWire\RepeaterPage&amp;#039;) {&lt;br /&gt;
            $level +=1;&lt;br /&gt;
            if($level &amp;gt; $maxLevel) return false;&lt;br /&gt;
            $forPage = $myPage-&amp;gt;getForPage();&lt;br /&gt;
            //var_dump( $myPage-&amp;gt;getParentPage());&lt;br /&gt;
            //echo(&amp;quot;&amp;lt;p&amp;gt;next Level: &amp;quot;.get_class($forPage).&amp;quot;&amp;lt;/p&amp;gt;&amp;quot;);&lt;br /&gt;
            return $myPage = getParentPage($forPage);&lt;br /&gt;
        }else if( get_class($myPage) == &amp;#039;ProcessWire\Page&amp;#039;){  &lt;br /&gt;
            return $myPage;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$parent = getParentPage($page);&lt;br /&gt;
$parent-&amp;gt;hasChart = true;&lt;br /&gt;
$chart = $pages-&amp;gt;get($pageid); // this page contains our content. You should ommit appendFile in it&amp;#039;s template because we don&amp;#039;t want &amp;lt;head&amp;gt; etc. &lt;br /&gt;
$out =&amp;#039;&amp;#039;;&lt;br /&gt;
$out .= $chart-&amp;gt;render();&lt;br /&gt;
&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Hanna Code an externe Funktion weitergeben ===&lt;br /&gt;
Wenn du die Hanna Formatierung für andere Dinge nutzen willst kannst du den Code auch einfach wieder ausgeben und dann die Seite selbst parsen. Wann das sinnvoll ist musst du selbst entscheiden...&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hanna code&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Hanna code [[more]]:&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// This tag is handled by template (readMore() Function in helpers.inc)&lt;br /&gt;
// so we just pass that tag through&lt;br /&gt;
echo(&amp;#039;[[more]]&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;helpers.inc&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function readMore($text){&lt;br /&gt;
	$readMore = __(&amp;#039;Read more&amp;#039;);&lt;br /&gt;
	$readLess = __(&amp;#039;Read less&amp;#039;);&lt;br /&gt;
	if($text){&lt;br /&gt;
		$pos = strpos($text, &amp;#039;[[more]]&amp;#039;, true);&lt;br /&gt;
		if($pos){&lt;br /&gt;
			$moreLink = &amp;#039;&amp;lt;div class=&amp;quot;more-trigger&amp;quot; data-more=&amp;quot;&amp;#039;.$readMore.&amp;#039;&amp;quot; data-less=&amp;quot;&amp;#039;.$readLess.&amp;#039;&amp;quot;&amp;gt;&amp;#039;.$readMore.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
			$before = substr($text,0,$pos);&lt;br /&gt;
			$after = substr($text,$pos+8);&lt;br /&gt;
			return $before.&amp;#039;&amp;lt;div class=&amp;quot;more-text&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;#039;.$after.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;.$moreLink;&lt;br /&gt;
		}else return $text;&lt;br /&gt;
	}&lt;br /&gt;
	return $text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RepeaterMatrixItem von beliebiger Seite rendern ===&lt;br /&gt;
Hierbei gibt es ein paar Dinge zu beachten. &lt;br /&gt;
&lt;br /&gt;
Im Backend wird der Hannacode Snippets in den Labels der Items angezeigt. Das kann das Backend zerhauen. Deshalb testen wir ob wir im Admin Bereich sind und geben etwas anderes aus. Außerdem möchten wir im Template auswergen ob es über Hanna aufgerufen wurde. Dann können wir z.B. Container weglassen, die eh schon über das Elternitem kommen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
// shows a layoutblock from another page&lt;br /&gt;
// can give you a list of all available blocks on a page if you provide a page id&lt;br /&gt;
// @param id - Page Id of a Page or of a RepeaterMatrixPage&lt;br /&gt;
&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
//$p = $pages-&amp;gt;get(5725);&lt;br /&gt;
$p = $pages-&amp;gt;get($id);&lt;br /&gt;
if( gettype($p) == &amp;#039;object&amp;#039; ){&lt;br /&gt;
    $class=get_class($p);&lt;br /&gt;
    if($class == &amp;#039;ProcessWire\RepeaterMatrixPage&amp;#039;){&lt;br /&gt;
        // output&lt;br /&gt;
        $currentPath = $_SERVER[&amp;#039;REQUEST_URI&amp;#039;];&lt;br /&gt;
        $isInAdminPage = (strpos($currentPath, &amp;#039;/processwire/&amp;#039;) !== false);&lt;br /&gt;
        if(!$isInAdminPage) $out .= $p-&amp;gt;render();&lt;br /&gt;
        else $out .= &amp;#039;LAYOUTBLOCK VIA HANNA CODE&amp;#039;;&lt;br /&gt;
    }else if($class == &amp;#039;ProcessWire\Page&amp;#039;){&lt;br /&gt;
        // information&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;Gewählte Seite: &amp;#039;.$p-&amp;gt;title.&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;h4&amp;gt;Layout Blocks&amp;lt;/h4&amp;gt;&amp;#039;;&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;Du hast die Id einer Seite übergeben. Dieser Hanna Code benötigt die ID eines Layout Blocks. Die Seite enthält folgende Layout Blöcke verwenden:&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;;&lt;br /&gt;
        foreach($p-&amp;gt;layout_blocks as $i =&amp;gt; $item){&lt;br /&gt;
            $out .= &amp;#039;&amp;lt;li&amp;gt;#&amp;#039;.($i+1).&amp;#039; [[layoutblock id=&amp;#039;.$item-&amp;gt;id.&amp;#039;]] &amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
    }else{&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p class=&amp;quot;uk-alert&amp;quot;&amp;gt;Ungültige ID&amp;lt;p&amp;gt;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
}else{&lt;br /&gt;
    $out .= &amp;#039;&amp;lt;p class=&amp;quot;uk-alert&amp;quot;&amp;gt;Die Id gehört zu keiner Seite.&amp;lt;p&amp;gt;&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $out;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formbuilder und Hanna Code ==&lt;br /&gt;
Ist nicht ganz einfach, da der HannaCode mehrfach aufgerufen wird. Man kann das umgehen, indem man eine Variable beim ersten Call setzt und diese dann prüft bevor der Rest des Hanns Codes ausgeführt wird.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=33103</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=33103"/>
		<updated>2025-08-11T11:12:13Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Prüfung in TYPO3 aussetzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen Version 7 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
==== Tabellen prüfen ====&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;br /&gt;
&lt;br /&gt;
== Notfallhacks bei alten TYPO3 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
==== Tabellen prüfen ====&lt;br /&gt;
&lt;br /&gt;
phpmyadmin &amp;gt; sql&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
SHOW VARIABLES LIKE &amp;#039;character_set%&amp;#039;;&lt;br /&gt;
SHOW VARIABLES LIKE &amp;#039;collation%&amp;#039;;&lt;br /&gt;
SELECT table_name, table_collation &lt;br /&gt;
FROM information_schema.tables &lt;br /&gt;
WHERE table_schema = &amp;#039;DEIN_DATENBANKNAME&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Tabellen sollten auf utf-8  oder utf-8 mb3 (oder mb4) stehen. Bei Bedarf umstellen:&lt;br /&gt;
 ALTER TABLE `tabellenname` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
==== LocalConfiguration.php ====&lt;br /&gt;
Sicherstellen, dass utf-8 zur Übertragung verwendet wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    //...&lt;br /&gt;
    &amp;#039;DB&amp;#039; =&amp;gt; [&lt;br /&gt;
        //...&lt;br /&gt;
    &amp;#039;charset&amp;#039;=&amp;gt; &amp;#039;utf8&amp;#039;, // vorsichtshalber setzen&lt;br /&gt;
    ],&lt;br /&gt;
    //...&lt;br /&gt;
    &amp;#039;SYS&amp;#039; =&amp;gt; [&lt;br /&gt;
        //...&lt;br /&gt;
    &amp;#039;setDBInit&amp;#039; =&amp;gt; &amp;#039;SET NAMES utf8&amp;#039;, // vorsichtshalber setzen&lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Prüfung in TYPO3 aussetzen ====&lt;br /&gt;
Wenn keine Möglichkeit besteht die Datenbank selbst zu beeinflussen. Kann man die problematische Prüfung in TYPO3 auskommentieren (nur als Übergang empfohlen). Unbedingt TYPO3 updaten.&lt;br /&gt;
&lt;br /&gt;
 /typo3_src-7.6.9/typo3/sysext/core/Classes/Database/DatabaseConnection.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        /* dirty but suitable for some time&lt;br /&gt;
        if (!$hasValidCharset) {&lt;br /&gt;
            throw new \RuntimeException(&lt;br /&gt;
                &amp;#039;It looks like the character set &amp;#039; . $this-&amp;gt;connectionCharset . &amp;#039; is not used for this connection even though it is configured as connection charset. &amp;#039; .&lt;br /&gt;
                &amp;#039;This TYPO3 installation is using the $GLOBALS[\&amp;#039;TYPO3_CONF_VARS\&amp;#039;][\&amp;#039;SYS\&amp;#039;][\&amp;#039;setDBinit\&amp;#039;] property with the following value: &amp;quot;&amp;#039; .&lt;br /&gt;
                $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] . &amp;#039;&amp;quot;. Please make sure that this command does not overwrite the configured charset. &amp;#039; .&lt;br /&gt;
                &amp;#039;Please note that for the TYPO3 database everything other than utf8 is unsupported since version 4.7.&amp;#039;,&lt;br /&gt;
                1389697515&lt;br /&gt;
            );&lt;br /&gt;
        } */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 TYPO3-Cache leeren (Install Tool oder /typo3temp/Cache/*)&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=33102</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=33102"/>
		<updated>2025-08-07T10:49:35Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen Version 7 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
==== Tabellen prüfen ====&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;br /&gt;
&lt;br /&gt;
== Notfallhacks bei alten TYPO3 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
==== Tabellen prüfen ====&lt;br /&gt;
&lt;br /&gt;
phpmyadmin &amp;gt; sql&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
SHOW VARIABLES LIKE &amp;#039;character_set%&amp;#039;;&lt;br /&gt;
SHOW VARIABLES LIKE &amp;#039;collation%&amp;#039;;&lt;br /&gt;
SELECT table_name, table_collation &lt;br /&gt;
FROM information_schema.tables &lt;br /&gt;
WHERE table_schema = &amp;#039;DEIN_DATENBANKNAME&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Tabellen sollten auf utf-8  oder utf-8 mb3 (oder mb4) stehen. Bei Bedarf umstellen:&lt;br /&gt;
 ALTER TABLE `tabellenname` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;
&lt;br /&gt;
==== LocalConfiguration.php ====&lt;br /&gt;
Sicherstellen, dass utf-8 zur Übertragung verwendet wird.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    //...&lt;br /&gt;
    &amp;#039;DB&amp;#039; =&amp;gt; [&lt;br /&gt;
        //...&lt;br /&gt;
    &amp;#039;charset&amp;#039;=&amp;gt; &amp;#039;utf8&amp;#039;, // vorsichtshalber setzen&lt;br /&gt;
    ],&lt;br /&gt;
    //...&lt;br /&gt;
    &amp;#039;SYS&amp;#039; =&amp;gt; [&lt;br /&gt;
        //...&lt;br /&gt;
    &amp;#039;setDBInit&amp;#039; =&amp;gt; &amp;#039;SET NAMES utf8&amp;#039;, // vorsichtshalber setzen&lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Prüfung in TYPO3 aussetzen ====&lt;br /&gt;
Wenn keine Möglichkeit besteht die Datenbank selbst zu beeinflussen. Kann man die problematische Prüfung in TYPO3 auskommentieren (nur als Übergang empfohlen). Unbedingt TYPO3 updaten.&lt;br /&gt;
/typo3_src-7.6.9/typo3/sysext/core/Classes/Database/DatabaseConnection.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
        /* dirty but suitable for some time&lt;br /&gt;
        if (!$hasValidCharset) {&lt;br /&gt;
            throw new \RuntimeException(&lt;br /&gt;
                &amp;#039;It looks like the character set &amp;#039; . $this-&amp;gt;connectionCharset . &amp;#039; is not used for this connection even though it is configured as connection charset. &amp;#039; .&lt;br /&gt;
                &amp;#039;This TYPO3 installation is using the $GLOBALS[\&amp;#039;TYPO3_CONF_VARS\&amp;#039;][\&amp;#039;SYS\&amp;#039;][\&amp;#039;setDBinit\&amp;#039;] property with the following value: &amp;quot;&amp;#039; .&lt;br /&gt;
                $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] . &amp;#039;&amp;quot;. Please make sure that this command does not overwrite the configured charset. &amp;#039; .&lt;br /&gt;
                &amp;#039;Please note that for the TYPO3 database everything other than utf8 is unsupported since version 4.7.&amp;#039;,&lt;br /&gt;
                1389697515&lt;br /&gt;
            );&lt;br /&gt;
        } */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 TYPO3-Cache leeren (Install Tool oder /typo3temp/Cache/*)&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=33101</id>
		<title>ProcessWire - TinyMCE Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=33101"/>
		<updated>2025-08-04T17:50:49Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Divs erlauben mittels Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der TinyMCE Editor ist der Nachfolger des CKE Editor. Er läßt sich deutlich leichter modifizieren.&lt;br /&gt;
&lt;br /&gt;
Styles lassen sich in den Moduleinstellungen anpassen (Custom style formats CSS). Das geht auf Modulebene oder auf Feldebene (wenn man das in den Moduleinstellungen erlaubt):&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Extras h5.accordion { } /* Accordion item heading */&lt;br /&gt;
#Extras h6 { } /* Tab item heading */&lt;br /&gt;
#Extras hr.stop { } /* Stop tabs or accordions */&lt;br /&gt;
#Blocks uk-text-lead {font-size: 1.5em } /* Lead text */&lt;br /&gt;
#Blocks .uk-text-meta { font-size: 14px; color: #999 } /* Meta text */&lt;br /&gt;
#Blocks .uk-text-small { font-size: 14px; } /* Small text */ #Uikit .uk-text-muted { color: #999; } /* Muted text */&lt;br /&gt;
#Inline span.red-text { color: red; } /* Red Text */&lt;br /&gt;
#Blocks p.outline { padding: 20px; border: 1px dotted #ccc; } /* Outline paragraph&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei #Blocks für den Menübereich steht und der Kommentar für das /* Label */&lt;br /&gt;
&lt;br /&gt;
== Divs erlauben mittels Plugin ==&lt;br /&gt;
Wenn man divs nutzen will gibt es einige Fallen. Z.B. ist es nicht so einfach mehrere p-Tags innerhalb eines Divs zu nutzen. Man kann aber z.B. ein TinyMce Plugin basteln.&lt;br /&gt;
&lt;br /&gt;
Mit diesem Div kannst du per Button einen Bereich im Editor mit einem DIV umschließen. Danach funktionieren auch div.meinstyle Elemente die man als Blockelemente (wie oben gezeigt) definiert.&lt;br /&gt;
&lt;br /&gt;
=== Plugin Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * “wdiv” (wrap selected content with a div) plugin&lt;br /&gt;
 * for TinyMCE 6 in processwire (what eles?)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
tinymce.PluginManager.add(&amp;#039;wdiv&amp;#039;, (editor, url) =&amp;gt; {&lt;br /&gt;
	const openDialog = () =&amp;gt; editor.windowManager.open({&lt;br /&gt;
		title: &amp;#039;wdiv plugin&amp;#039;,&lt;br /&gt;
		body: {&lt;br /&gt;
			type: &amp;#039;panel&amp;#039;,&lt;br /&gt;
			items: [&lt;br /&gt;
				{&lt;br /&gt;
					type: &amp;#039;input&amp;#039;,&lt;br /&gt;
					name: &amp;#039;ziclass&amp;#039;,&lt;br /&gt;
					label: &amp;#039;css class to use&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		buttons: [&lt;br /&gt;
			{&lt;br /&gt;
				type: &amp;#039;cancel&amp;#039;,&lt;br /&gt;
				text: &amp;#039;Close&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				type: &amp;#039;submit&amp;#039;,&lt;br /&gt;
				text: &amp;#039;Save&amp;#039;,&lt;br /&gt;
				buttonType: &amp;#039;primary&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		],&lt;br /&gt;
		onSubmit: (api) =&amp;gt; {&lt;br /&gt;
			const data = api.getData();&lt;br /&gt;
			/* wrap the selected text/html with a div having a class */&lt;br /&gt;
			let cnt = editor.selection.getContent({format: &amp;#039;html&amp;#039;});&lt;br /&gt;
			if(data.ziclass != &amp;#039;&amp;#039;) {&lt;br /&gt;
				editor.insertContent(`&amp;lt;div class=&amp;quot;${data.ziclass}&amp;quot;&amp;gt;${cnt}&amp;lt;/div&amp;gt;`);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				editor.insertContent(`&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;${cnt}&amp;lt;/div&amp;gt;`);&lt;br /&gt;
			}&lt;br /&gt;
			api.close();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	editor.ui.registry.addIcon(&amp;#039;divcode&amp;#039;, &amp;#039;&amp;lt;svg height=&amp;quot;24&amp;quot; width=&amp;quot;24&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M12.89,3L14.85,3.4L11.11,21L9.15,20.6L12.89,3M19.59,12L16,8.41V5.58L22.42,12L16,18.41V15.58L19.59,12M1.58,12L8,5.58V8.41L4.41,12L8,15.58V18.41L1.58,12Z&amp;quot; /&amp;gt;&amp;lt;/svg&amp;gt;&amp;#039;);&lt;br /&gt;
	editor.ui.registry.addButton(&amp;#039;wdiv&amp;#039;, {&lt;br /&gt;
		text: &amp;#039;wdiv&amp;#039;,&lt;br /&gt;
		icon: &amp;#039;divcode&amp;#039;,&lt;br /&gt;
		tooltip: &amp;quot;wrap with a div&amp;quot;,&lt;br /&gt;
		onAction: () =&amp;gt; {&lt;br /&gt;
			/* Open dialog window */&lt;br /&gt;
			openDialog();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	// metadata&lt;br /&gt;
	return {&lt;br /&gt;
		getMetadata: () =&amp;gt; ({ name: &amp;#039;Wdiv&amp;#039; })&lt;br /&gt;
	};&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pfad zum Plugin unter external Plugins in den Moduleinstellungen eingeben z.B.&lt;br /&gt;
 /site/templates/modules/TinyMcePlugins/pw-tinymce-div-plugin-main/wdiv.js&lt;br /&gt;
* Plugin kann jetzt in den Feldeinstellungen aktivieret werden.&lt;br /&gt;
* Button zum Menü hinzufügen, mit dem Kürzel wie das Plugin heißt (hier wdiv)&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=33100</id>
		<title>ProcessWire - TinyMCE Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=33100"/>
		<updated>2025-08-04T17:49:04Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der TinyMCE Editor ist der Nachfolger des CKE Editor. Er läßt sich deutlich leichter modifizieren.&lt;br /&gt;
&lt;br /&gt;
Styles lassen sich in den Moduleinstellungen anpassen (Custom style formats CSS). Das geht auf Modulebene oder auf Feldebene (wenn man das in den Moduleinstellungen erlaubt):&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Extras h5.accordion { } /* Accordion item heading */&lt;br /&gt;
#Extras h6 { } /* Tab item heading */&lt;br /&gt;
#Extras hr.stop { } /* Stop tabs or accordions */&lt;br /&gt;
#Blocks uk-text-lead {font-size: 1.5em } /* Lead text */&lt;br /&gt;
#Blocks .uk-text-meta { font-size: 14px; color: #999 } /* Meta text */&lt;br /&gt;
#Blocks .uk-text-small { font-size: 14px; } /* Small text */ #Uikit .uk-text-muted { color: #999; } /* Muted text */&lt;br /&gt;
#Inline span.red-text { color: red; } /* Red Text */&lt;br /&gt;
#Blocks p.outline { padding: 20px; border: 1px dotted #ccc; } /* Outline paragraph&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei #Blocks für den Menübereich steht und der Kommentar für das /* Label */&lt;br /&gt;
&lt;br /&gt;
== Divs erlauben mittels Plugin ==&lt;br /&gt;
Wenn man divs nutzen will gibt es einige Fallen. Z.B. ist es nicht so einfach mehrere p-Tags innerhalb eines Divs zu nutzen. Man kann aber z.B. ein TinyMce Plugin basteln.&lt;br /&gt;
&lt;br /&gt;
=== Plugin Code ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * “wdiv” (wrap selected content with a div) plugin&lt;br /&gt;
 * for TinyMCE 6 in processwire (what eles?)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
tinymce.PluginManager.add(&amp;#039;wdiv&amp;#039;, (editor, url) =&amp;gt; {&lt;br /&gt;
	const openDialog = () =&amp;gt; editor.windowManager.open({&lt;br /&gt;
		title: &amp;#039;wdiv plugin&amp;#039;,&lt;br /&gt;
		body: {&lt;br /&gt;
			type: &amp;#039;panel&amp;#039;,&lt;br /&gt;
			items: [&lt;br /&gt;
				{&lt;br /&gt;
					type: &amp;#039;input&amp;#039;,&lt;br /&gt;
					name: &amp;#039;ziclass&amp;#039;,&lt;br /&gt;
					label: &amp;#039;css class to use&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			]&lt;br /&gt;
		},&lt;br /&gt;
		buttons: [&lt;br /&gt;
			{&lt;br /&gt;
				type: &amp;#039;cancel&amp;#039;,&lt;br /&gt;
				text: &amp;#039;Close&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				type: &amp;#039;submit&amp;#039;,&lt;br /&gt;
				text: &amp;#039;Save&amp;#039;,&lt;br /&gt;
				buttonType: &amp;#039;primary&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		],&lt;br /&gt;
		onSubmit: (api) =&amp;gt; {&lt;br /&gt;
			const data = api.getData();&lt;br /&gt;
			/* wrap the selected text/html with a div having a class */&lt;br /&gt;
			let cnt = editor.selection.getContent({format: &amp;#039;html&amp;#039;});&lt;br /&gt;
			if(data.ziclass != &amp;#039;&amp;#039;) {&lt;br /&gt;
				editor.insertContent(`&amp;lt;div class=&amp;quot;${data.ziclass}&amp;quot;&amp;gt;${cnt}&amp;lt;/div&amp;gt;`);&lt;br /&gt;
			}&lt;br /&gt;
			else {&lt;br /&gt;
				editor.insertContent(`&amp;lt;div class=&amp;quot;box&amp;quot;&amp;gt;${cnt}&amp;lt;/div&amp;gt;`);&lt;br /&gt;
			}&lt;br /&gt;
			api.close();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	editor.ui.registry.addIcon(&amp;#039;divcode&amp;#039;, &amp;#039;&amp;lt;svg height=&amp;quot;24&amp;quot; width=&amp;quot;24&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M12.89,3L14.85,3.4L11.11,21L9.15,20.6L12.89,3M19.59,12L16,8.41V5.58L22.42,12L16,18.41V15.58L19.59,12M1.58,12L8,5.58V8.41L4.41,12L8,15.58V18.41L1.58,12Z&amp;quot; /&amp;gt;&amp;lt;/svg&amp;gt;&amp;#039;);&lt;br /&gt;
	editor.ui.registry.addButton(&amp;#039;wdiv&amp;#039;, {&lt;br /&gt;
		text: &amp;#039;wdiv&amp;#039;,&lt;br /&gt;
		icon: &amp;#039;divcode&amp;#039;,&lt;br /&gt;
		tooltip: &amp;quot;wrap with a div&amp;quot;,&lt;br /&gt;
		onAction: () =&amp;gt; {&lt;br /&gt;
			/* Open dialog window */&lt;br /&gt;
			openDialog();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	// metadata&lt;br /&gt;
	return {&lt;br /&gt;
		getMetadata: () =&amp;gt; ({ name: &amp;#039;Wdiv&amp;#039; })&lt;br /&gt;
	};&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pfad zum Plugin unter external Plugins in den Moduleinstellungen eingeben z.B.&lt;br /&gt;
 /site/templates/modules/TinyMcePlugins/pw-tinymce-div-plugin-main/wdiv.js&lt;br /&gt;
* Plugin kann jetzt in den Feldeinstellungen aktivieret werden.&lt;br /&gt;
* Button zum Menü hinzufügen, mit dem Kürzel wie das Plugin heißt (hier wdiv)&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Google_Rezensionen_/_Google_Reviews&amp;diff=33099</id>
		<title>Google Rezensionen / Google Reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Google_Rezensionen_/_Google_Reviews&amp;diff=33099"/>
		<updated>2025-07-11T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
Hier geht es darum wie man Google Reviews verarbeiten und nutzen kann.&lt;br /&gt;
&lt;br /&gt;
===Auslesen von Rezensionen===&lt;br /&gt;
* geht entweder über die Business Profile Performance API (nur die eigenen, aber kostenlos).&lt;br /&gt;
* Google Places API (kostenpflichtig ab gewisser Abrufzahl). Caching wichtig damit es nicht teuer wird.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Google_Rezensionen_/_Google_Reviews&amp;diff=33098</id>
		<title>Google Rezensionen / Google Reviews</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Google_Rezensionen_/_Google_Reviews&amp;diff=33098"/>
		<updated>2025-07-11T10:17:23Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: Die Seite wurde neu angelegt: „Quickstart  Auslesen von Rezensionen  * geht entweder über die Business Profile Performance API (nur die eigenen, aber kostenlos). * Google Places API (kosten…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quickstart&lt;br /&gt;
&lt;br /&gt;
Auslesen von Rezensionen &lt;br /&gt;
* geht entweder über die Business Profile Performance API (nur die eigenen, aber kostenlos).&lt;br /&gt;
* Google Places API (kostenpflichtig ab gewisser Abrufzahl). Caching wichtig damit es nicht teuer wird.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Google&amp;diff=33097</id>
		<title>Google</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Google&amp;diff=33097"/>
		<updated>2025-07-11T10:12:32Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Google Tagmanager]]&lt;br /&gt;
 [[PrivacyWire - ProcessWire Modul|Google Consent v2 - ProcessWire PrivacyWire Modul]]&lt;br /&gt;
 [[Google Conversion-Tracking]]&lt;br /&gt;
 [[Google AdWords]] - Veraltet&lt;br /&gt;
 [[Google Maps]]&lt;br /&gt;
 [[Google Maps - DSGVO und Nutzungsvereinbarungen]]&lt;br /&gt;
 [[Google Analytics]] &lt;br /&gt;
 [[Google Maps - Snippets]]&lt;br /&gt;
 [[Google PlayStore]]&lt;br /&gt;
 [[Google PlayStore - App Release]]&lt;br /&gt;
 [[Google Conversion-Tracking]]&lt;br /&gt;
 [[Google Jobs]]&lt;br /&gt;
 [[Google Rezensionen / Google Reviews]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Selectors&amp;diff=33092</id>
		<title>ProcessWire - Selectors</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Selectors&amp;diff=33092"/>
		<updated>2025-06-17T07:15:34Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Beispiele */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Operatoren ==&lt;br /&gt;
 http://cheatsheet.processwire.com/selectors/selector-operators/&lt;br /&gt;
Selector Operators&lt;br /&gt;
&lt;br /&gt;
    =&lt;br /&gt;
    Equal to (any_field=any_value)&lt;br /&gt;
&lt;br /&gt;
    !=&lt;br /&gt;
    Not equal to (any_field!=any_value)&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;&lt;br /&gt;
    Less than (any_field&lt;br /&gt;
&lt;br /&gt;
    &amp;gt;&lt;br /&gt;
    Greater than any_field&amp;gt;any_value&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;=&lt;br /&gt;
    Less than or equal to (any_field&amp;lt;=any_value)&lt;br /&gt;
&lt;br /&gt;
    &amp;gt;=&lt;br /&gt;
    Greater than or equal to (any_field&amp;gt;=any_value)&lt;br /&gt;
&lt;br /&gt;
    *=&lt;br /&gt;
    Contains the exact word or phrase (any_field*=any_value)&lt;br /&gt;
&lt;br /&gt;
    ~=&lt;br /&gt;
    Contains all the words (any_field~=any_value)&lt;br /&gt;
&lt;br /&gt;
    %=&lt;br /&gt;
    Contains the exact word or phrase (using slower SQL LIKE) [v2.1] (any_field%=any_value)&lt;br /&gt;
&lt;br /&gt;
    ^=&lt;br /&gt;
    Contains the exact word or phrase at the beginning of the field [v2.1] (any_field^=any_value)&lt;br /&gt;
&lt;br /&gt;
    $=&lt;br /&gt;
    Contains the exact word or phrase at the end of the field [v2.1] (any_field$=any_value)&lt;br /&gt;
&lt;br /&gt;
=== Neue Operatoren ab 3.0.160 ===&lt;br /&gt;
List of new operators available as of ProcessWire 3.0.160&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s a list of new operators available as of 3.0.160, along with brief explanation of what each operator does and how it differs from other similar operators.&lt;br /&gt;
&lt;br /&gt;
    Contains words partial (~*=)&lt;br /&gt;
    Like existing match words (~=) operator, except that this one matches partial words as well.&lt;br /&gt;
&lt;br /&gt;
    Contains words live (~~=)&lt;br /&gt;
    Like match words, except that the last word in the query is treated as a partial match.&lt;br /&gt;
&lt;br /&gt;
    Contains words like (~%=)&lt;br /&gt;
    Matches all words in the query, in full or in part.&lt;br /&gt;
&lt;br /&gt;
    Contains words and expand (~+=)&lt;br /&gt;
    Like match words operator, but with the added power of the query expansion feature supported by MySQL fulltext indexes.&lt;br /&gt;
&lt;br /&gt;
    Contains any words (~|=)&lt;br /&gt;
    One or more of the words must match; this is similar to splitting the query with pipe (|) characters, but often easier to use, and better optimized.&lt;br /&gt;
&lt;br /&gt;
    Contains any partial words (~|*=)&lt;br /&gt;
    Similar to the previous operator, except that this one also provides partial matches.&lt;br /&gt;
&lt;br /&gt;
    Contains any words like (~|%=)&lt;br /&gt;
    Similar to the previous two operators, but uses LIKE query behind the scenes instead of the fulltext index.&lt;br /&gt;
&lt;br /&gt;
    Contains phrase and expand (*+=)&lt;br /&gt;
    Variation of the phrase match operator (*=) with added query expansion support.&lt;br /&gt;
&lt;br /&gt;
    Contains match (**=)&lt;br /&gt;
    This operator works much like the MATCH/AGAINST feature of MySQL fulltext indexes.&lt;br /&gt;
&lt;br /&gt;
    Contains match and expand (**+=)&lt;br /&gt;
    Otherwise identical to previous operator, except for the added query expansion.&lt;br /&gt;
&lt;br /&gt;
    Advanced text search (#=)&lt;br /&gt;
    This operator adds support for special characters, such as &amp;quot;+&amp;quot; for &amp;quot;must match&amp;quot;, &amp;quot;-&amp;quot; for &amp;quot;must not match&amp;quot;, and &amp;quot;*&amp;quot; for specifying partial matches.&lt;br /&gt;
&lt;br /&gt;
== Owner Attribut ==&lt;br /&gt;
Nützlich bei &amp;#039;&amp;#039;&amp;#039;Pagereferences&amp;#039;&amp;#039;&amp;#039;, wenn &amp;#039;&amp;#039;&amp;#039;auf die Seite verweisende Seiten&amp;#039;&amp;#039;&amp;#039; gefunden und &amp;#039;&amp;#039;&amp;#039;gleichzeitig gefiltert&amp;#039;&amp;#039;&amp;#039; werden sollen.&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.95-core-updates/&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$members = $pages-&amp;gt;find(&amp;quot;template=member, age&amp;gt;50&amp;quot;);&lt;br /&gt;
foreach($members as $m) {&lt;br /&gt;
  $items = $m-&amp;gt;memberships-&amp;gt;find(&amp;quot;club=&amp;#039;Golf Club X&amp;#039;, mtype=GOLD&amp;quot;);&lt;br /&gt;
  foreach($items as $membership) {&lt;br /&gt;
     // add to excel or other export, etc.&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ineffektiv bei vielen Datensätzen -&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;club=&amp;#039;Golf Club X&amp;#039;, mtype=GOLD, memberships.owner.age&amp;gt;50&amp;quot;);&lt;br /&gt;
foreach($items as $membership) {&lt;br /&gt;
  // add to excel or other export, etc.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kombinierte Abfragen und Subselektoren ==&lt;br /&gt;
Da man auch Seiten im Selektor übergeben kann, kann man relativ einfach kombinierte Abfragen über &amp;#039;&amp;#039;&amp;#039;mehrere Templates&amp;#039;&amp;#039;&amp;#039;, oder auch über &amp;#039;&amp;#039;&amp;#039;parents&amp;#039;&amp;#039;&amp;#039; etc. machen. Mit Subselektoren kann man das noch abkürzen.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kombinierte Abfrage&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$companies = $pages-&amp;gt;find(&amp;quot;template=company, locations&amp;gt;5, locations.title%=Finland&amp;quot;);&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;template=product, company=$companies&amp;quot;); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mit Subselektoren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 $items = $pages-&amp;gt;find(&amp;quot;template=product, company=[locations&amp;gt;5, locations.title%=Finland]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
== OR / AND ==&lt;br /&gt;
OR funktioniert über &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feldwert a oder Feldwert b&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 firstname=Mike|Steve&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Feldwert a und Feldwert b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 height&amp;gt;500, height&amp;lt;=1000&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;In Feld a oder in Feld b&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
 body|sidebar*=carbonated&lt;br /&gt;
&lt;br /&gt;
=== OR Groups ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;(Bedingung a, Bedingung b),(Bedingung c)&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
Wenn man Klammern nutzt muss nur eine der Klammern zutreffen. &lt;br /&gt;
&lt;br /&gt;
Beispiel &amp;quot;product&amp;quot; Seiten in stock, UND entweder in featured date range, ODER highlighted checkbox checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;template=product, stock&amp;gt;0, (featured_from&amp;lt;=today, featured_to&amp;gt;=today), (highlighted=1)&amp;quot;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Klammern kennzeichnen Optionale Bedingungen. &amp;#039;&amp;#039;&amp;#039;Es muss also nur eine der Klammern zutreffen.&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Wenn man mehrere Oder-Gruppen benötigt kann man so vorgehen:&lt;br /&gt;
 foo=(selector1), bar=(selector2), foo=(selector3), bar=(selector4)&lt;br /&gt;
Hier gehören alle foo zusammen und alle bar. Sprich es muss &amp;#039;&amp;#039;&amp;#039;selector1 ODER selector3 UND selector2 ODER selector4&amp;#039;&amp;#039;&amp;#039; erfüllt sein.&lt;br /&gt;
&lt;br /&gt;
 https://processwire.com/docs/selectors/#or-selectors1&lt;br /&gt;
&lt;br /&gt;
=== Selektoren und RepeaterMatrix ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel TV Altötting&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//BEISPIEL: $results = $pages-&amp;gt;find(&amp;quot;template=matrix_page,matrix_main.body%=$q&amp;quot;); // name des matrix items weglassen&lt;br /&gt;
      //$selector = &amp;quot;template=&amp;quot;.implode(&amp;#039;|&amp;#039;,$pageTemplates).&amp;quot;, layout_blocks.body~*=&amp;quot;.$val; // findet einspalter aber keine in &lt;br /&gt;
      //$selector = &amp;quot;template=&amp;quot;.implode(&amp;#039;|&amp;#039;,$pageTemplates).&amp;quot;, layout_blocks.r_grid.body~*=&amp;quot;.$val; // findet mehrspalter aber keine einspalter&lt;br /&gt;
      // dot notation not allowed with or so we have to use or groups or bracket notation:&lt;br /&gt;
      $selector = &amp;quot;template=&amp;quot;.implode(&amp;#039;|&amp;#039;,$pageTemplates).&amp;quot;, (layout_blocks.body~*=&amp;quot;.$val.&amp;quot;),(layout_blocks.text~*=&amp;quot;.$val.&amp;quot;),(layout_blocks.headline~*=&amp;quot;.$val.&amp;quot;),(layout_blocks.r_grid.body~*=&amp;quot;.$val.&amp;quot;)&amp;quot;; // findet mehrspalter aber keine einspalter&lt;br /&gt;
      bd($selector,&amp;quot;selector for content&amp;quot;);&lt;br /&gt;
      $matches = $pages-&amp;gt;find($selector); &lt;br /&gt;
&lt;br /&gt;
      $searchResultMarkup .= &amp;quot;&amp;lt;h5&amp;gt;Suche im Seiteninhalt [$matches-&amp;gt;count]&amp;lt;/h5&amp;gt;&amp;quot;;&lt;br /&gt;
      if($matches-&amp;gt;count) {&lt;br /&gt;
        $searchResultMarkup .= renderNav($matches); &lt;br /&gt;
      } else {&lt;br /&gt;
        $searchResultMarkup .= &amp;quot;&amp;lt;p&amp;gt;Keine Seiteninhalte mit diesem Suchbegriff gefunden.&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anzahl beschränken mit limit und start ==&lt;br /&gt;
 limit=50 // 50 or fewer results&lt;br /&gt;
 start=50, limit=50 //50 (or less) results starting at the 51st (results 51–100).&lt;br /&gt;
&lt;br /&gt;
If you are using a limit selector with pages, and your template has page-numbers (pagination) turned on, ProcessWire will automatically set the &amp;quot;start&amp;quot; selector according to the current page/pagination number. So when it comes to pagination, you don&amp;#039;t usually have to think about anything other than the &amp;quot;limit&amp;quot; selector.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Array Selectors ==&lt;br /&gt;
https://processwire.com/blog/posts/processwire-3.0.13-selector-upgrades-and-new-form-builder-version/#building-a-selector-string-with-user-input-example&lt;br /&gt;
&lt;br /&gt;
=== Selektoren als assoziative Arrays ===&lt;br /&gt;
&lt;br /&gt;
Anstatt von Selector Strings kann man seit PW 3.0.13 auch Arrays nutzen.:d of a string:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find([&lt;br /&gt;
  &amp;#039;template&amp;#039; =&amp;gt; [&amp;#039;basic-page&amp;#039;, &amp;#039;product&amp;#039;],&lt;br /&gt;
  &amp;#039;title|body%=&amp;#039; =&amp;gt; $sanitizer-&amp;gt;text($input-&amp;gt;get(&amp;#039;q&amp;#039;)),&lt;br /&gt;
  &amp;#039;categories&amp;#039; =&amp;gt; $sanitizer-&amp;gt;intArray($input-&amp;gt;get(&amp;#039;categories&amp;#039;)),&lt;br /&gt;
  &amp;#039;sort&amp;#039; =&amp;gt; &amp;#039;-created&amp;#039;&lt;br /&gt;
]); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Erläuterung:&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;$sanitizer-&amp;gt;selectorValue()&amp;#039;&amp;#039; Methode um Text zu sanitizen der in Selektoren geht ist nicht mehr notwendig. Du solltest immer noch User Input sanitizen, aber man kann sich die sanierung für die Selektoren sparen.&lt;br /&gt;
Werte können Arrays sein. Im Beispiel werden Arrays für &amp;#039;template&amp;#039; and &amp;#039;categories&amp;#039; items genutzt. &lt;br /&gt;
&lt;br /&gt;
Der &amp;quot;=&amp;quot; Operator wird für alle Selektoren Elemente angenommen, solange man nicht einen anderen Operator anhängt. Wie bei &amp;#039;&amp;#039;&amp;#039;title|body%=&amp;#039;&amp;#039;&amp;#039; zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Selektoren als reguläre Arrays ===&lt;br /&gt;
Man kann auch ein reguläres (nicht assoziatives Array nutzen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$results = $pages-&amp;gt;find([&lt;br /&gt;
  [&amp;#039;template&amp;#039;, [&amp;#039;basic-page&amp;#039;, &amp;#039;product&amp;#039;]],&lt;br /&gt;
  [&amp;#039;title|body&amp;#039;, &amp;#039;%=&amp;#039;, $input-&amp;gt;get(&amp;#039;q&amp;#039;), &amp;#039;text&amp;#039;],&lt;br /&gt;
  [&amp;#039;categories&amp;#039;, &amp;#039;=&amp;#039;, $input-&amp;gt;get(&amp;#039;categories&amp;#039;), &amp;#039;int&amp;#039;],&lt;br /&gt;
  [&amp;#039;sort&amp;#039;, &amp;#039;-created&amp;#039;]&lt;br /&gt;
]); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Hier werden die Selektorenteile als Array im Array übergeben. Das Format ist folgendes:f those arrays can use any of the following formats:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [field, value]&lt;br /&gt;
    [field, operator, value]&lt;br /&gt;
    [field, operator, value, sanitizer]&lt;br /&gt;
    [field, operator, value, whitelist]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*  The field element can be specified as a single field name, pipe &amp;quot;|&amp;quot; separated field names, or an array of field name(s).&lt;br /&gt;
*  The operator can be any operator. If none is specified, then equals &amp;quot;=&amp;quot; is assumed (which you can do if only specifying a field and value).&lt;br /&gt;
*  The value can be a string, number or array of either.&lt;br /&gt;
*  The sanitizer can be any $sanitizer method name that you want the value to pass through before being used in the selector.&lt;br /&gt;
*  When a whitelist (array) is specified for the sanitizer, the selector will throw an Exception if the given value (or values) are not present in the whitelist array.&lt;br /&gt;
&lt;br /&gt;
Beide Array Formate (assoziativ, regulär) kann man theoretisch sogar mischen.&lt;br /&gt;
&lt;br /&gt;
== Owner Selector ==&lt;br /&gt;
 https://processwire.com/blog/posts/processwire-3.0.95-core-updates/&lt;br /&gt;
Mit Owner Selektoren kannst du Verknüpfungen die über PageTable pages, Page fields oder Repeater fields realisiert werden effizient durchsuchen, ohne Schleifen zu benutzen.&lt;br /&gt;
&lt;br /&gt;
Es dauert etwas bis man das Konzept verstanden hat aber es ist extrem effektiv.&lt;br /&gt;
&lt;br /&gt;
Eine zeitaufwändige Suche über eine Schleife wie diese:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$members = $pages-&amp;gt;find(&amp;quot;template=member, age&amp;gt;50&amp;quot;);&lt;br /&gt;
foreach($members as $m) {&lt;br /&gt;
  $items = $m-&amp;gt;memberships-&amp;gt;find(&amp;quot;club=&amp;#039;Golf Club X&amp;#039;, mtype=GOLD&amp;quot;);&lt;br /&gt;
  foreach($items as $membership) {&lt;br /&gt;
     // add to excel or other export, etc.&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird dann einfach zu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;club=&amp;#039;Golf Club X&amp;#039;, mtype=GOLD, memberships.owner.age&amp;gt;50&amp;quot;);&lt;br /&gt;
foreach($items as $membership) {&lt;br /&gt;
  // add to excel or other export, etc.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Anstatt über template=member zuerst alle Members zu durchlaufen und diese dann weiter nach Mitgliedschaften zu filtern geht man den Weg anders herum. Man nimmt das Feld das man sucht und schaut über den owner Selector wo es überall Referenziert wird. Also eine Art Rückwärtssuche.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Datum ===&lt;br /&gt;
Per Default nutzt PW das Datum als Timestamp. Um z.B. alle &lt;br /&gt;
&lt;br /&gt;
For recieving page of today, you would have to create a start and end time range and use them in the selector.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$start = strtotime( date(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 00:00:00&amp;quot;);&lt;br /&gt;
$end = strtotime( date(&amp;#039;Y-m-d&amp;#039;) . &amp;quot; 23:59:59&amp;quot;);&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;template=linkmain,publishdate&amp;gt;=$start,publishdate&amp;lt;=$end,sort=-userid&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$startDate = &amp;#039;2023-01-01&amp;#039;;&lt;br /&gt;
$endDate = &amp;#039;2023-03-31&amp;#039;;&lt;br /&gt;
$start = $startDate . &amp;#039; 00:00:00&amp;#039;;&lt;br /&gt;
$end = $endDate . &amp;#039; 23:59:59&amp;#039;;&lt;br /&gt;
$paidInvoices = pages(&amp;quot;template=invoice, invoice_paid=1, invoice_date&amp;gt;=$start, invoice_date&amp;lt;=$end&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Todo Beispiele mit wire()-&amp;gt; Datumsfunktionen&lt;br /&gt;
&lt;br /&gt;
=== Parents ===&lt;br /&gt;
To specify that matches should have a &amp;#039;&amp;#039;&amp;#039;specific parent&amp;#039;&amp;#039;&amp;#039;, specify the parent&amp;#039;s path, object or ID. First is an example of using the parent&amp;#039;s path:&lt;br /&gt;
 https://processwire.com/docs/selectors/#finding2&lt;br /&gt;
 parent=/path/to/parent/&lt;br /&gt;
 parent=$parent&lt;br /&gt;
 parent=123&lt;br /&gt;
 parent=$parent1|$parent2|$parent3&lt;br /&gt;
&lt;br /&gt;
==== Parents bei Repeatern oder RepeaterMatrix ====&lt;br /&gt;
 https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets#Parent_von_Repeater_oder_RepeaterMatrix_finden&lt;br /&gt;
&lt;br /&gt;
=== Sortiere Seiten nach Reihenfolge im Seitenbaum ===&lt;br /&gt;
Das funktioniert mit der Sortierung &amp;quot;sort&amp;quot;.&lt;br /&gt;
 $categories = pages(&amp;#039;template=template_name,sort=sort&amp;#039;);&lt;br /&gt;
=== Große Datenmenge mit findMany() durchsuchen ===&lt;br /&gt;
 [[findMany() - ProcessWire API]]&lt;br /&gt;
&lt;br /&gt;
=== Suche nach Seiten die Verweise auf bestimmte andere Seiten enthalten ===&lt;br /&gt;
https://processwire.com/talk/topic/5414-selector-find-page-reference-help/&lt;br /&gt;
&lt;br /&gt;
Es sollen Seiten gefunden werden die mit einer Page Reference auf eine andere Seite verweisen. Am einfachsten geht das wenn man nicht wie man zuerst vermutet nach der Seiten ID sucht, sondern wenn man direkt nach der Seite sucht&lt;br /&gt;
 team_name=$page&lt;br /&gt;
&lt;br /&gt;
=== Suche nach Phrasen in Daten die in Seitenverweise enthalten sind ===&lt;br /&gt;
https://processwire.com/talk/topic/570-searching-page-reference-fields/&lt;br /&gt;
&lt;br /&gt;
Es sollen Seiten gefunden werden, die Verweise auf andere Seiten enthalten. Beispielsweise enthalten Personen (Eltern) Links zu Notfalladressen die separat angelegt sind. Nun soll Nach Eltern gesucht werden, die eine bestimmte Notfalladresse enthalten. Gesucht wird nach einer Phrase im Notfalladrdessen Namen).&lt;br /&gt;
&lt;br /&gt;
Lösung: Es wird in zwei Schritten gesucht. &lt;br /&gt;
&lt;br /&gt;
1. Suche nach Kontakten mit dem Search Term im body und die dem template emergency-contact entsprechen&lt;br /&gt;
 $contacts = $pages-&amp;gt;find(&amp;quot;body*=&amp;#039;search term&amp;#039;, template=emergency-contact&amp;quot;); &lt;br /&gt;
2. Seiten die diesen Kontakten entsprechen&lt;br /&gt;
 $parents = $pages-&amp;gt;find(&amp;quot;emergency-contacts=$contacts&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== Selektoren in Option Fieldtypes ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$optionsfield // return id (string)&lt;br /&gt;
$optionsfield-&amp;gt;id; // return id (int)&lt;br /&gt;
$optionsfield-&amp;gt;title; // return string USE THIS or&lt;br /&gt;
$optionsfield-&amp;gt;value; // return empty string or value (if your option settings like &amp;#039;1=value|title&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
// dot syntax in selector string&lt;br /&gt;
$pages-&amp;gt;find(&amp;#039;optionsfield.id=2&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selektoren für Multiple Options ===&lt;br /&gt;
&lt;br /&gt;
==== Finde Seiten in gewählten Optionen ====&lt;br /&gt;
Nehmen wir an wir haben Seiten mit dem Template tag und ein Template product, das wiederum ein PageReference Feld &amp;#039;tags&amp;#039; hat bei dem man ein oder mehrere Tags auswählen kann.&lt;br /&gt;
&lt;br /&gt;
1. Seiten die eines oder mehr der gewählten Tags haben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $myTags = array();&lt;br /&gt;
    // find product pages which fit all options&lt;br /&gt;
    $tags = array();&lt;br /&gt;
    foreach($page-&amp;gt;tag_selector as $tag) {&lt;br /&gt;
        $tags[] = $tag-&amp;gt;name;&lt;br /&gt;
    }&lt;br /&gt;
    $items = $items-&amp;gt;find(&amp;#039;template=product,tags.name=&amp;#039; . implode(&amp;#039;|&amp;#039;,$tags) );&lt;br /&gt;
    //bd($items);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
2. Seiten die alle gewählten Tags haben oder mindestens einen (mit Schalter)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$or = $page-&amp;gt;opt_1;&lt;br /&gt;
if(count($page-&amp;gt;tag_selector)){&lt;br /&gt;
    $myTags = array();&lt;br /&gt;
    $tags = array();&lt;br /&gt;
    foreach($page-&amp;gt;tag_selector as $tag) {&lt;br /&gt;
        if ($or) $tags[] = $tag-&amp;gt;name;&lt;br /&gt;
        else $tags[] = &amp;#039;tag.name=&amp;#039;.$tag-&amp;gt;name;&lt;br /&gt;
    }&lt;br /&gt;
    if ($or) $items = pages()-&amp;gt;find(&amp;#039;template=product,tags.name=&amp;#039; . implode(&amp;#039;|&amp;#039;,$tags) ); //OR&lt;br /&gt;
    else $items = pages()-&amp;gt;find(&amp;#039;template=product,&amp;#039;.implode(&amp;#039;,&amp;#039;,$tags)); // AND&lt;br /&gt;
    bd($items);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Seiten finden ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$skyscrapers = $pages-&amp;gt;find(&amp;quot;template=skyscraper, sort=-modified&amp;quot;);&lt;br /&gt;
foreach($skyscrapers as $skyscraper) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$skyscraper-&amp;gt;url&amp;#039;&amp;gt;$skyscraper-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rekursiv suchen ====&lt;br /&gt;
 $pages-&amp;gt;find(&amp;quot;parent={$cat-&amp;gt;children}, limit=$limit, sort=-date, sort=title&amp;quot;); // expands to something like &amp;quot;parent=1234|1235|1236|1237|...|1507|1508&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Page Reference auf diese Seite ===&lt;br /&gt;
https://processwire.com/talk/topic/1071-page-fieldtype-two-way-relation/&lt;br /&gt;
 echo $pages-&amp;gt;find(&amp;quot;field1=$page&amp;quot;)-&amp;gt;render();&lt;br /&gt;
If the page isn&amp;#039;t part of the front-end site, then I&amp;#039;ll remove view access from its template. Or if it is part of the front-end, but I don&amp;#039;t want to show the relations, then this:&lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;editable()) echo $pages-&amp;gt;find(&amp;quot;field1=$page&amp;quot;)-&amp;gt;render();&lt;br /&gt;
 &lt;br /&gt;
Though I almost always integrate these relation-revealing pages into the site structure, as it&amp;#039;s rare that this information doesn&amp;#039;t have some value to the site&amp;#039;s users too. This is an example of one that locates all pages referencing it in a field called &amp;#039;country&amp;#039;:&lt;br /&gt;
 https://www.tripsite.com/countries/croatia/&lt;br /&gt;
&lt;br /&gt;
=== Suche in PageReference Feldern ===&lt;br /&gt;
Generell gilt PageReferences verhalten sich gleich wie wenn man auf ein Page-Object zugreifen würde.&lt;br /&gt;
 https://processwire.com/talk/topic/1224-selector-and-page-reference-field/&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel:&amp;#039;&amp;#039;&amp;#039; Finde alle Point of Interest Seiten die eine Referenz auf die Kategorie &amp;quot;Zoo&amp;quot; haben&lt;br /&gt;
* Template &amp;#039;&amp;#039;&amp;#039;poi&amp;#039;&amp;#039;&amp;#039; (Point of Interest)&lt;br /&gt;
** Feld &amp;#039;&amp;#039;&amp;#039;poi_type&amp;#039;&amp;#039;&amp;#039; (PageReference) referenziert auf Seiten mit dem Template type &lt;br /&gt;
* Template &amp;#039;&amp;#039;&amp;#039;type&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Der Filter&lt;br /&gt;
 $poi = $pages-&amp;gt;find(template=poi, poi_type.title=&amp;#039;Zoo&amp;#039;); &lt;br /&gt;
Funktioniert nicht!&lt;br /&gt;
&lt;br /&gt;
Stattdessen &lt;br /&gt;
# holt man zuerst alle type-Seiten mit dem Titel Zoo &lt;br /&gt;
# Dieses PageArray kann man direkt als Filter für eine Suche in den POIs nutzen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pr = $pages-&amp;gt;get(&amp;quot;title=Zoo&amp;quot;);&lt;br /&gt;
$poi = $pages-&amp;gt;find(&amp;quot;template=poi, poi_type=$pr&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&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;
$prs = $pages-&amp;gt;find(&amp;quot;title=Zoo|Themepark|Museum&amp;quot;); // maybe also use the name or id&lt;br /&gt;
$poi = $pages-&amp;gt;find(&amp;quot;template=poi, poi_type=$prs&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ACHTUNG Hier ist es wichtig im ersten Selektor find zu verwenden. Get würde nur den ersten Treffer ausspucken, während find ein PageArray mit allen Ergebnissen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$invoicesNotSent = $pages-&amp;gt;find(&amp;#039;template=invoice,invoice_sent=false&amp;#039;);&lt;br /&gt;
$selector = &amp;quot;template=order,(invoice=$invoicesNotSent),(padinvoice=)&amp;quot;;&lt;br /&gt;
$ordersWithoutInvoiceOrInvoiceNotSent = $pages-&amp;gt;find( $selector );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Punkt Syntax ===&lt;br /&gt;
 $architects = $pages-&amp;gt;find(&amp;quot;template=architect, city.title=Chicago&amp;quot;); &lt;br /&gt;
 $buildings = $pages-&amp;gt;find(&amp;quot;architect=$architects&amp;quot;); &lt;br /&gt;
That&amp;#039;s easy enough, but wouldn&amp;#039;t it be nicer if you could just do this?&lt;br /&gt;
 $buildings = $pages-&amp;gt;find(&amp;quot;architect.city.title=Chicago&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
 $buildings = $pages-&amp;gt;find(&amp;quot;architect.city.state.abbr=IL&amp;quot;); &lt;br /&gt;
Broadening further, perhaps we want buildings from all architects in the USA:&lt;br /&gt;
&lt;br /&gt;
 $buildings = $pages-&amp;gt;find(&amp;quot;architect.city.state.country.abbr=USA&amp;quot;);&lt;br /&gt;
Or perhaps both USA and Canada:&lt;br /&gt;
&lt;br /&gt;
 $buildings = $pages-&amp;gt;find(&amp;quot;architect.city.state.country.abbr=USA|CA&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== User ===&lt;br /&gt;
 http://cheatsheet.processwire.com/users/users-methods/users-find-selector/&lt;br /&gt;
Find all users whose email address ENDS with processwire.com and create a link to email them&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$items = $users-&amp;gt;find(&amp;quot;email$=processwire.com&amp;quot;);&lt;br /&gt;
foreach($items as $item) {&lt;br /&gt;
    echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;mailto:{$item-&amp;gt;email}&amp;#039;&amp;gt;{$item-&amp;gt;name}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Find all users who have &amp;quot;fred&amp;quot; anywhere in their name&lt;br /&gt;
&lt;br /&gt;
 $items = $users-&amp;gt;find(&amp;quot;name*=fred&amp;quot;);&lt;br /&gt;
Find all users who have the &amp;quot;superuser&amp;quot; role&lt;br /&gt;
&lt;br /&gt;
 $items = $users-&amp;gt;find(&amp;quot;roles=superuser&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
=== Suche alle Kinder / alle Elternseiten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get children categories for a category for a product&lt;br /&gt;
 * &lt;br /&gt;
 * Page $p category page&lt;br /&gt;
 * int $maxDepth&lt;br /&gt;
 */&lt;br /&gt;
function getChildren($p, $maxDepth=3){ &lt;br /&gt;
    $children = new PageArray;&lt;br /&gt;
    $children-&amp;gt;add($p); // add parent category&lt;br /&gt;
    if ($p-&amp;gt;hasChildren() &amp;amp;&amp;amp; $maxDepth &amp;gt; 1){&lt;br /&gt;
        $children-&amp;gt;add( $p-&amp;gt;children(&amp;#039;template=category&amp;#039;) );&lt;br /&gt;
        foreach($p-&amp;gt;children as $c){&lt;br /&gt;
            $grandchildren = getChildren($c, $maxDepth-1);&lt;br /&gt;
            $children-&amp;gt;add($grandchildren);&lt;br /&gt;
        }&lt;br /&gt;
        $children-&amp;gt;sort(&amp;#039;title&amp;#039;);&lt;br /&gt;
        return $children;&lt;br /&gt;
    }else return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * get filter Categories for a item this includes all parent categories&lt;br /&gt;
 * @return string use as class for the isotope item&lt;br /&gt;
 * */&lt;br /&gt;
function getFilters($item,$prefix=&amp;#039;cat&amp;#039;){&lt;br /&gt;
    // we need to fetch $item categories + parent categories&lt;br /&gt;
    $filters = array();&lt;br /&gt;
    $allCategories = new Pagearray;&lt;br /&gt;
    $categories = $item-&amp;gt;categories;&lt;br /&gt;
    // for each category add category + parent categories to allCategories&lt;br /&gt;
    foreach($categories as $category){&lt;br /&gt;
        $allCategories-&amp;gt;add( $category );&lt;br /&gt;
        $allCategories-&amp;gt;add( $category-&amp;gt;parents(&amp;#039;template=category&amp;#039;) );&lt;br /&gt;
    }&lt;br /&gt;
    foreach($allCategories as $c){&lt;br /&gt;
        $filters[]= $prefix.$c-&amp;gt;id;&lt;br /&gt;
    }&lt;br /&gt;
    return implode(&amp;#039; &amp;#039;,$filters);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schneller CSV-Export von Selector-Ergebnissen ===&lt;br /&gt;
 ProcessWire - schneller CSV-Export&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33091</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33091"/>
		<updated>2025-05-19T10:50:50Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* DKIM bei Microsoft365 einrichten (externe Domain) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Public - Private Key Verfahren zur Verschlüsselung von E-Mail Hadern&lt;br /&gt;
&lt;br /&gt;
Siehe auch&lt;br /&gt;
&lt;br /&gt;
 https://de.wikipedia.org/wiki/Amavis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Microsoft365 einrichten (externe Domain) ==&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 Defender Portal &amp;gt; Policies &amp;amp; rules &amp;gt; Threat policies &amp;gt; Email authentication settings&lt;br /&gt;
&lt;br /&gt;
CName Einträge wie angezeigt setzen z.B. &lt;br /&gt;
&lt;br /&gt;
 Host Name : selector1._domainkey&lt;br /&gt;
 Points to address or value: selector1-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector2._domainkey&lt;br /&gt;
 Points to address or value: selector2-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
Bedeutet z.B. bei all-inkl:&lt;br /&gt;
&lt;br /&gt;
2 CNAME Einträge in DNS Einstellungen anlegen:&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector1._domainkey&lt;br /&gt;
 Value: selector1-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector2._domainkey&lt;br /&gt;
 Value: selector2-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33090</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33090"/>
		<updated>2025-05-19T10:50:32Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Public - Private Key Verfahren zur Verschlüsselung von E-Mail Hadern&lt;br /&gt;
&lt;br /&gt;
Siehe auch&lt;br /&gt;
&lt;br /&gt;
 https://de.wikipedia.org/wiki/Amavis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Microsoft365 einrichten (externe Domain) ==&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 Defender Portal &amp;gt; Policies &amp;amp; rules &amp;gt; Threat policies &amp;gt; Email authentication settings&lt;br /&gt;
&lt;br /&gt;
CName Einträge wie angezeigt setzen z.B. &lt;br /&gt;
&lt;br /&gt;
 Host Name : selector1._domainkey&lt;br /&gt;
 Points to address or value: selector1-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector2._domainkey&lt;br /&gt;
 Points to address or value: selector2-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
Bedeutet z.B. bei all-inkl:&lt;br /&gt;
&lt;br /&gt;
2 CNAME Einträge in DNS Einstellungen anlegen:&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector1._domainkey&lt;br /&gt;
 Value: selector1-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
 Host Name : selector2._domainkey&lt;br /&gt;
 Points to address or value: selector2-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33089</id>
		<title>DKIM</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=DKIM&amp;diff=33089"/>
		<updated>2025-05-19T10:12:44Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Public - Private Key Verfahren zur Verschlüsselung von E-Mail Hadern&lt;br /&gt;
&lt;br /&gt;
Siehe auch&lt;br /&gt;
&lt;br /&gt;
 https://de.wikipedia.org/wiki/Amavis&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DKIM bei Microsoft365 einrichten (externe Domain) ==&lt;br /&gt;
 Defender Portal &amp;gt; Policies &amp;amp; rules &amp;gt; Threat policies &amp;gt; Email authentication settings&lt;br /&gt;
&lt;br /&gt;
CName Einträge wie angezeigt setzen z.B. &lt;br /&gt;
Host Name : selector1._domainkey&lt;br /&gt;
Points to address or value: selector1-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
Host Name : selector2._domainkey&lt;br /&gt;
Points to address or value: selector2-bauartmassivbau-de01e._domainkey.BauArtMassivbau.n-v1.dkim.mail.microsoft&lt;br /&gt;
&lt;br /&gt;
Bedeutet z.B. bei all-inkl:&lt;br /&gt;
&lt;br /&gt;
TXT(DKIM) auswählen&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=33088</id>
		<title>ProcessWire - FormBuilder (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=33088"/>
		<updated>2025-04-30T12:59:31Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Eigene Templates für E-Mails */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/store/form-builder/&lt;br /&gt;
&lt;br /&gt;
== Mails per smtp versenden ==&lt;br /&gt;
 [[ProcessWire - WireMailSmtp (Module)]]&lt;br /&gt;
&lt;br /&gt;
== CSS bei einfachem embed per iFrame anpassen ==&lt;br /&gt;
Einfache Lösung: &lt;br /&gt;
* auf Basic Output stellen&lt;br /&gt;
* Standard CSS von /site/templates/FormBuilder/main.css kopieren&lt;br /&gt;
* Neuen Pfad im Formbuilder Formular eingeben.&lt;br /&gt;
Nachteil, das könnte für den User zu kompliziert sein. &lt;br /&gt;
&lt;br /&gt;
== Import Daten für Standard Formular ==&lt;br /&gt;
Hiermit kann man schnell ein Formular erstellen. Einfach in Import Feld des Formbuilder kopieren.&lt;br /&gt;
Einfaches Standardformular:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;./&amp;quot;,&lt;br /&gt;
    &amp;quot;method&amp;quot;: &amp;quot;post&amp;quot;,&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;Ich stimme zu&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit Adresse...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_adresse&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 80,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 100&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;hausnummer&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;plz_ort&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;1&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;
==Tipps und Tricks für Formbuilder==&lt;br /&gt;
=== Weiterleitung / Redirect auf Danke Seite ===&lt;br /&gt;
&lt;br /&gt;
=== DatePicker ===&lt;br /&gt;
==== Lokalisierung / Sprache einstellen====&lt;br /&gt;
Der Formbuilder nutzt das Standard InputField Datetime. Das kann man übersetzen:&lt;br /&gt;
 https://processwire.com/talk/topic/4547-possibility-to-translate-timepicker-addon-on-datepicker/?tab=comments#comment-49746&lt;br /&gt;
&lt;br /&gt;
In der folgenden datei kann man als Übersetzung den Pfad zur Lokalisierungsdatei von jQuery angeben (ist im PW mit drin).&lt;br /&gt;
&lt;br /&gt;
Die Datei muss man evtl. selber anlegen (im Übersetzungstool) wenn die Indizierung sie nicht schon selbst angelegt hat.&lt;br /&gt;
&lt;br /&gt;
 /wire/modules/Inputfield/InputfieldDatetime/types/InputfieldDatetimeText.php&lt;br /&gt;
 path: /wire/modules/Jquery/JqueryUI/i18n/jquery.ui.datepicker-de.js&lt;br /&gt;
&lt;br /&gt;
=== Links in Checkbox-Label ===&lt;br /&gt;
HTML geht nicht aber Markdown funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ich habe die [Datenschutzerklärung](https://fbz-vet.de/datenschutz) gelesen und willige in die dort dargestellte Verarbeitung meiner personenbezogenen Daten ein.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formbuilder CSV Export der Eingaben automatisch ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form = $forms-&amp;gt;load(&amp;#039;my-formname&amp;#039;);&lt;br /&gt;
$formBuilderEntries = $form-&amp;gt;entries();&lt;br /&gt;
$formBuilderEntries-&amp;gt;exportCSV($form, &amp;quot;any_field=any_value&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Same as above, but shorter:&lt;br /&gt;
&lt;br /&gt;
$form = $forms-&amp;gt;load(&amp;#039;my-formname&amp;#039;);&lt;br /&gt;
$form-&amp;gt;entries()-&amp;gt;exportCSV($form, &amp;quot;any_field=any_value&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hooks in general ===&lt;br /&gt;
 https://processwire.com/talk/topic/26362-general-question-on-formbuilder-and-hooks/#comment-218911&lt;br /&gt;
&lt;br /&gt;
==== In Hooks auf Page zugreifen ====&lt;br /&gt;
Im Hook&lt;br /&gt;
 $page = $event-&amp;gt;wire()-&amp;gt;page; // current $page API var&lt;br /&gt;
Oder per use (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
=== Relevante Hooks ===&lt;br /&gt;
Beispiele aus site/ready.php&lt;br /&gt;
 // if (isset($forms)) //...possible too&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
if(!defined(&amp;quot;PROCESSWIRE&amp;quot;)) die();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;job&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  $emailList = array(&lt;br /&gt;
    &amp;#039;intensiv&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;karlsruhe&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;rastatt&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;pforzheim&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;rheinhausen&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;tagespflege&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
  );&lt;br /&gt;
  $organization = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title;&lt;br /&gt;
  $organizationName = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;value;&lt;br /&gt;
  $jobtitle = $page-&amp;gt;title;&lt;br /&gt;
&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::renderReady&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($organization)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;); &lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($jobtitle)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)-&amp;gt;val($organization);&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)-&amp;gt;val($jobtitle);  &lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($organizationName, $emailList, $formname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; &lt;br /&gt;
      if(array_key_exists($organizationName,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$organizationName]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Werte in Success Meldung anzeigen ===&lt;br /&gt;
 https://processwire.com/talk/topic/12874-mini-how-to-display-submitted-values-in-success-message/#comment-116913&lt;br /&gt;
In site/ready.php I add this code...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$forms-&amp;gt;addHookAfter(&amp;#039;FormBuilderProcessor::formSubmitSuccess&amp;#039;, function($event) {&lt;br /&gt;
    $form = $event-&amp;gt;object;&lt;br /&gt;
    if ($form-&amp;gt;formName == &amp;#039;YOUR-FORM-NAME-HERE&amp;#039; &amp;amp;&amp;amp; $form-&amp;gt;isSubmitted()) {&lt;br /&gt;
        $values = $form-&amp;gt;getValues();&lt;br /&gt;
        array_walk($values, function(&amp;amp;$i){ $i = htmlentities($i, ENT_QUOTES, &amp;#039;UTF-8&amp;#039;, false); });&lt;br /&gt;
        $form-&amp;gt;successMessage = wirePopulateStringTags($form-&amp;gt;successMessage, $values);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... changing &amp;#039;YOUR-FORM-NAME-HERE&amp;#039; for the actual name of your form.&lt;br /&gt;
&lt;br /&gt;
I can now include submitted values in my success messages. Like this;&lt;br /&gt;
&lt;br /&gt;
Thank you, {name}. A confirmation email has been sent to {email}.&lt;br /&gt;
&lt;br /&gt;
If I also want to clean up submitted values, prior to the form entry being saved (and, therefore, prior to success message display) I do that in another ready.php hook. In the following example I simply make sure that my collected email field is all lowercase...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$forms-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::saveForm&amp;#039;, function($event) {&lt;br /&gt;
    $form  = $event-&amp;gt;arguments(0);&lt;br /&gt;
    if($form-&amp;gt;name == &amp;#039;YOUR-FORM-NAME-HERE&amp;#039;) {&lt;br /&gt;
        // Sanitise the email field (all lower case)...&lt;br /&gt;
        $f = $form-&amp;gt;get(&amp;#039;email&amp;#039;);&lt;br /&gt;
        $email = strtolower($f-&amp;gt;value);&lt;br /&gt;
        $f-&amp;gt;attr(&amp;#039;value&amp;#039;, &amp;quot;$email&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Adressen per Hook manipulieren ===&lt;br /&gt;
==== Admin E-Mail via User Option Feld auswählen ====&lt;br /&gt;
Im Formular Feld &amp;quot;auswahl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+Standortauswahl&lt;br /&gt;
salusklinik=Salus Klinik Bad Reichenhall&lt;br /&gt;
mvzreichenhall=MVZ Bad Reichenhall&lt;br /&gt;
mvztraunstein=MVZ Traunstein&lt;br /&gt;
mvzfeldmoching=MVZ Außenstelle Feldmoching&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
site/ready.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;layout-blocks&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
  $formName = &amp;#039;kontakt&amp;#039;;&lt;br /&gt;
  $optionField = &amp;#039;auswahl&amp;#039;;&lt;br /&gt;
  $emailList = array(&lt;br /&gt;
    // We could use e-mail adresses as a value in the select field. But to keep it more secret we use a table.&lt;br /&gt;
    &amp;#039;salusklinik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvzreichenhall&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvztraunstein&amp;#039; =&amp;gt; &amp;#039;info@mvztraunstein.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvzfeldmoching&amp;#039; =&amp;gt; &amp;#039;info@hautarzt-feldmoching.de&amp;#039;&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($formName, $optionField, $emailList) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formName) return;&lt;br /&gt;
      $values = $processor-&amp;gt;getValues();&lt;br /&gt;
      if($email = $values[$optionField]){&lt;br /&gt;
        //bd($email,&amp;#039;email&amp;#039;);&lt;br /&gt;
        if(array_key_exists($email, $emailList)) {&lt;br /&gt;
          $processor-&amp;gt;emailTo = $emailList[$email];&lt;br /&gt;
          //bd($processor-&amp;gt;emailTo,&amp;quot;email to&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //$form-&amp;gt;getChildByName(&amp;#039;message&amp;#039;)-&amp;gt;val($email.&amp;#039; email&amp;#039;); // use for debugging&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Beispiel Forum ====&lt;br /&gt;
Nicht getestet. Von:&lt;br /&gt;
 https://processwire.com/talk/topic/26261-solved-send-email-to-email-address-field-in-dynamic-page/#comment-218230&lt;br /&gt;
In ready.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, function($event) {&lt;br /&gt;
  $processor = $event-&amp;gt;object; &lt;br /&gt;
  if($processor-&amp;gt;formName != &amp;#039;myFormName&amp;#039;) return; &lt;br /&gt;
  $page = $event-&amp;gt;wire()-&amp;gt;page; // current $page API var&lt;br /&gt;
  $email = $page-&amp;gt;get(&amp;#039;emailFieldName&amp;#039;); // get &amp;quot;email&amp;quot; field from current page&lt;br /&gt;
  $processor-&amp;gt;emailTo .= &amp;quot;\n&amp;quot; . $email; // use that email + admin Mail (Formbuilder uses one per line)&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel 2 - RepeaterMatrix ====&lt;br /&gt;
In Repeatern oder einer RepeaterMatrix ist es evtl. geschickter auf andere Weise auf das richtige Feld des Formulars zuzugreifen. Den genauen Grund warum ich hier diesen Hook verwendet habe weiß ich nicht mehr. Er funktioniert auf alle Fälle gut in der RepeaterMatrix.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$emailList = array(&lt;br /&gt;
  &amp;#039;auftrag&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
  &amp;#039;marketing&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;personal&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;gold&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;technik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;beanstandungen&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;sonstiges&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// HOOKS FÜR E-MAIL VERTEILER SCHNELLKONTAKT&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;layout-blocks&amp;#039;){ // check if template is correct&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  $fieldname = &amp;#039;bereich&amp;#039;; // take value of this field as selector&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($emailList, $formname, $fieldname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; // check if we are in correct form&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      $name = $form-&amp;gt;getChildByName($fieldname)-&amp;gt;val();&lt;br /&gt;
      if(array_key_exists($name,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$name]; // tell FormBuilder to use that email&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;
==== Beispiel 3 ====&lt;br /&gt;
Beispiel mit mehreren Formularen&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;
if(!defined(&amp;quot;PROCESSWIRE&amp;quot;)) die();&lt;br /&gt;
&lt;br /&gt;
$emailList = array(&lt;br /&gt;
  &amp;#039;organisationeins&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
  &amp;#039;organisationzwei&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;organisationdrei&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;technik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;beanstandungen&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;sonstiges&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// HOOKS FÜR BEWERBUNG IM JOBTEMPLATE&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;job&amp;#039;){&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  // E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
  $organization = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title;&lt;br /&gt;
  $organizationName = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;value;&lt;br /&gt;
  $jobtitle = $page-&amp;gt;title;&lt;br /&gt;
&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::renderReady&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      &lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($organization)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;); &lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($jobtitle)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)-&amp;gt;val($organization);&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)-&amp;gt;val($jobtitle);  &lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($organizationName, $emailList, $formname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; &lt;br /&gt;
      if(array_key_exists($organizationName,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$organizationName]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
}else{&lt;br /&gt;
  // HOOKS FÜR INITIATIVBEWERBUNG&lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($emailList) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != &amp;#039;schnellkontakt&amp;#039;) return; &lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      $name = $form-&amp;gt;getChildByName(&amp;#039;bereich&amp;#039;)-&amp;gt;val();&lt;br /&gt;
      if(array_key_exists($name,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$name]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feld Read Only bei Formular Rendering ===&lt;br /&gt;
 https://processwire.com/talk/topic/26373-making-field-read-only/#comment-218986&lt;br /&gt;
&lt;br /&gt;
=== Prepopulated Fields ===&lt;br /&gt;
 https://processwire.com/talk/topic/25517-solved-pre-populated-fields/#comment-218903&lt;br /&gt;
&lt;br /&gt;
=== PDF Download nach Form Submission ===&lt;br /&gt;
 https://processwire.com/talk/topic/26309-solved-download-pdf-file-after-submitting-the-contact-form/#comment-218905&lt;br /&gt;
&lt;br /&gt;
=== JavaScript ausführen wenn Fehler im Formular sind ===&lt;br /&gt;
Das ist z.B. nützlich wenn man das Formular in einem Modalfenster anzeigt und dieses nach dem Absenden nicht geöffnet ist. Dazu checkt man einfach ob in der Fehlerausgabe Daten sind:&lt;br /&gt;
&lt;br /&gt;
JavaScript / jQuery&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if($(&amp;quot;#FormBuilderSubmitted&amp;quot;).length) {&lt;br /&gt;
  // form was submitted and has errors -&amp;gt; open&lt;br /&gt;
  showForm();&lt;br /&gt;
}else{&lt;br /&gt;
  hideModal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigene Templates für E-Mails ===&lt;br /&gt;
==== Administrator E-Mail ====&lt;br /&gt;
Hilfe bekommst du bereits beim Erstellen im Backend:&lt;br /&gt;
o customize the email body, copy the template file &lt;br /&gt;
 /site/modules/FormBuilder/email-administrator.php &lt;br /&gt;
into &lt;br /&gt;
 /site/templates/FormBuilder/email-administrator.php &lt;br /&gt;
or &lt;br /&gt;
 /site/templates/FormBuilder/email-administrator-testform.php &lt;br /&gt;
(creating the directory if not there already) and modify it to suit your needs.&lt;br /&gt;
==== Beispiel: Nur ausgefüllte Felder anzeigen ====&lt;br /&gt;
Im Template werden in der Variable $values bereits Formatiert gespeichert. Das bedeutet auch nicht übermittelte Felder enthalten Werte. Wir müssen daher die Rohwerte testen. Hier ein Beispiel wie man es machen kann:&lt;br /&gt;
&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;
 * This is the email template used by the &amp;#039;Email administrators&amp;#039; feature in Form Builder&lt;br /&gt;
 *&lt;br /&gt;
 * CUSTOMIZE&lt;br /&gt;
 * =========&lt;br /&gt;
 * To customize this email, copy this file to /site/templates/FormBuilder/email-administrator.php and modify it as needed.&lt;br /&gt;
 * To make it just for a one form, name it email-administrator-myform.php, replacing &amp;quot;myform&amp;quot; with form name.&lt;br /&gt;
 * It&amp;#039;s preferable to do this so that your email template doesn&amp;#039;t get overwritten during FormBuilder upgrades.&lt;br /&gt;
 * Inline styles are recommended in the markup since not all email clients will use &amp;lt;style&amp;gt;&amp;lt;/style&amp;gt; declarations.&lt;br /&gt;
 *&lt;br /&gt;
 * VARIABLES&lt;br /&gt;
 * =========&lt;br /&gt;
 * @var array $values This is an array of all submitted field values with (&amp;#039;field name&amp;#039; =&amp;gt; &amp;#039;field value&amp;#039;) where the &amp;#039;field value&amp;#039; is ready for output.&lt;br /&gt;
 * @var array $labels This is an array of all field labels with (&amp;#039;field name&amp;#039; =&amp;gt; &amp;#039;field label&amp;#039;) where the &amp;#039;field label&amp;#039; is ready for output.&lt;br /&gt;
 * @var array $formData Raw form data array, which is the same as $values but unformatted and with additional properties like &amp;#039;entryID&amp;#039; and &amp;#039;_savePage&amp;#039; id. &lt;br /&gt;
 * @var FormBuilderEmail $formBuilderEmail Instance of FormBuilderEmail that is sending the message.&lt;br /&gt;
 * @var InputfieldForm $form Containing the entire form if you want grab anything else from it.&lt;br /&gt;
 * @var string $viewEntryUrl URL to view entry in the admin&lt;br /&gt;
 *&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if(!defined(&amp;quot;PROCESSWIRE&amp;quot;)) die();&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
$fieldsMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
$emptyFieldsMarkup = &amp;#039;&amp;#039;;&lt;br /&gt;
$styles = array(&lt;br /&gt;
	&amp;#039;table&amp;#039; =&amp;gt; &amp;#039;width:100%;border-bottom: 1px solid #ccc&amp;#039;,&lt;br /&gt;
	&amp;#039;label&amp;#039; =&amp;gt; &amp;#039;width:30%;text-align:right;font-weight:bold;padding:10px 10px 10px 0;vertical-align:top;border-top:1px solid #ccc&amp;#039;,&lt;br /&gt;
	&amp;#039;value&amp;#039; =&amp;gt; &amp;#039;width:70%;padding: 10px 0 10px 0;border-top: 1px solid #ccc&amp;#039;,&lt;br /&gt;
);	&lt;br /&gt;
//bd($formData, &amp;#039;$formData&amp;#039;);&lt;br /&gt;
foreach($values as $name =&amp;gt; $value){&lt;br /&gt;
  //bd($value);&lt;br /&gt;
  if( !empty( $formData[$name] ) ){&lt;br /&gt;
    $label = (isset($labels[$name]) ? $labels[$name] : &amp;#039;&amp;amp;nbsp;&amp;#039;);&lt;br /&gt;
    $fieldsMarkup .= &amp;#039;&lt;br /&gt;
      &amp;lt;tr&amp;gt; &lt;br /&gt;
        &amp;lt;th class=&amp;quot;label&amp;quot; style=&amp;quot;&amp;#039; . $styles[&amp;quot;label&amp;quot;] . &amp;#039;&amp;quot;&amp;gt;&amp;#039; . $label . &amp;#039;&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;td class=&amp;quot;value&amp;quot; style=&amp;quot;&amp;#039; . $styles[&amp;#039;value&amp;#039;] . &amp;#039;&amp;quot;&amp;gt;&amp;#039; . $value . &amp;#039;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;#039;; &lt;br /&gt;
  }else{&lt;br /&gt;
    $emptyFieldsMarkup .= &amp;#039;&lt;br /&gt;
      &amp;lt;p&amp;gt; &amp;#039; . $label . &amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ob_start();&lt;br /&gt;
?&amp;gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=utf-8&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;&amp;lt;?= $form-&amp;gt;name ?&amp;gt; email&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;table style=&amp;quot;&amp;lt;?= $styles[&amp;#039;table&amp;#039;]?&amp;gt;&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;?= $fieldsMarkup ?&amp;gt;&lt;br /&gt;
  &amp;lt;/table&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Leere Felder oder kein Wert gewählt:&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;?= $emptyFieldsMarkup ?&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;p&amp;gt;&amp;lt;small&amp;gt;&amp;lt;?= date(&amp;#039;d.m.Y g:i&amp;#039;) ?&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = ob_get_clean();&lt;br /&gt;
echo $out;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FormBuilder File Upload ==&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
== Feldtypen hinzufügen ==&lt;br /&gt;
In den Settings von Formbuilder kann man Felder auswählen die man im Formular verwenden möchte. Z.B. erlaubt das Markup Feld das Einfügen von Text etc.&lt;br /&gt;
=== Text im Formular einfügen ===&lt;br /&gt;
Z.B. mit Markup Feld. &lt;br /&gt;
&lt;br /&gt;
Vorsicht CK-Editor funktioniert nicht. Mit diesem stellst du dem User ein Eingabefeld mit Editor zur Verfügung (ungetestet - evtl. funktioniert das auch nicht oder erzeugt eine Sicherheitslücke).&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=33087</id>
		<title>ProcessWire - FormBuilder (Module)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_FormBuilder_(Module)&amp;diff=33087"/>
		<updated>2025-04-30T08:53:12Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Tipps und Tricks für Formbuilder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/store/form-builder/&lt;br /&gt;
&lt;br /&gt;
== Mails per smtp versenden ==&lt;br /&gt;
 [[ProcessWire - WireMailSmtp (Module)]]&lt;br /&gt;
&lt;br /&gt;
== CSS bei einfachem embed per iFrame anpassen ==&lt;br /&gt;
Einfache Lösung: &lt;br /&gt;
* auf Basic Output stellen&lt;br /&gt;
* Standard CSS von /site/templates/FormBuilder/main.css kopieren&lt;br /&gt;
* Neuen Pfad im Formbuilder Formular eingeben.&lt;br /&gt;
Nachteil, das könnte für den User zu kompliziert sein. &lt;br /&gt;
&lt;br /&gt;
== Import Daten für Standard Formular ==&lt;br /&gt;
Hiermit kann man schnell ein Formular erstellen. Einfach in Import Feld des Formbuilder kopieren.&lt;br /&gt;
Einfaches Standardformular:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;action&amp;quot;: &amp;quot;./&amp;quot;,&lt;br /&gt;
    &amp;quot;method&amp;quot;: &amp;quot;post&amp;quot;,&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;Ich stimme zu&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mit Adresse...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;roles&amp;quot;: {&lt;br /&gt;
        &amp;quot;form-submit&amp;quot;: [&lt;br /&gt;
            &amp;quot;guest&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;form-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;form-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-list&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-edit&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-delete&amp;quot;: [],&lt;br /&gt;
        &amp;quot;entries-page&amp;quot;: []&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;framework&amp;quot;: &amp;quot;Basic&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus. Zur Kontaktaufnahme benötigen wir entweder Ihre E-Mail oder Ihre Telefonnummer.&amp;quot;,&lt;br /&gt;
    &amp;quot;emailSubject&amp;quot;: &amp;quot;Nachricht über Ihr Kontaktformular&amp;quot;,&lt;br /&gt;
    &amp;quot;responderSubject&amp;quot;: &amp;quot;Auto-Response&amp;quot;,&lt;br /&gt;
    &amp;quot;saveFlags&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;emailTo&amp;quot;: &amp;quot;post@stephanschlegel.de&amp;quot;,&lt;br /&gt;
    &amp;quot;emailFrom&amp;quot;: &amp;quot;e_mail&amp;quot;,&lt;br /&gt;
    &amp;quot;submitText1018&amp;quot;: &amp;quot;Senden&amp;quot;,&lt;br /&gt;
    &amp;quot;successMessage1018&amp;quot;: &amp;quot;Vielen Dank, ihre Nachricht wurde versendet.&amp;quot;,&lt;br /&gt;
    &amp;quot;errorMessage1018&amp;quot;: &amp;quot;Entschuldigung, das Formular konnte nicht versendet werden. Bitte füllen Sie alle Pflichtfelder aus.&amp;quot;,&lt;br /&gt;
    &amp;quot;frBasic_cssURL&amp;quot;: &amp;quot;/site/templates/styles/forms.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_foundationURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/foundation/&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizHeaderClass&amp;quot;: &amp;quot;small-5 medium-3 right inline&amp;quot;,&lt;br /&gt;
    &amp;quot;frFoundation_horizContentClass&amp;quot;: &amp;quot;small-7 medium-9&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_ukURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/uikit/&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_css&amp;quot;: &amp;quot;uikit.gradient.min.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frUikit_horizHeaderWidth&amp;quot;: 30,&lt;br /&gt;
    &amp;quot;frAdmin_styleSet&amp;quot;: &amp;quot;AdminThemeDefault/styles/main-classic.css&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootURL&amp;quot;: &amp;quot;/site/modules/FormBuilder/frameworks/bootstrap/&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizHeaderClass&amp;quot;: &amp;quot;col-xs-5 col-sm-4 col-md-3&amp;quot;,&lt;br /&gt;
    &amp;quot;frBootstrap_bootHorizContentClass&amp;quot;: &amp;quot;col-xs-7 col-sm-8 col-md-9&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: {&lt;br /&gt;
        &amp;quot;name_1&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Name&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihr Name&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;telefon&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Telefon&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Telefonnummer&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;e_mail=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;e_mail&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 50,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre E-Mail&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;requiredIf&amp;quot;: &amp;quot;telefon=&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
            &amp;quot;stripTags&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_adresse&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 80,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Straße&amp;quot;,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 100&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;hausnummer&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;columnWidth&amp;quot;: 20,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Hausnr.&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;plz_ort&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Text&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;PLZ Ort&amp;quot;,&lt;br /&gt;
            &amp;quot;maxlength&amp;quot;: 2048&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;ihre_nachricht&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Textarea&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Ihre Nachricht&amp;quot;,&lt;br /&gt;
            &amp;quot;rows&amp;quot;: 5,&lt;br /&gt;
            &amp;quot;requiredAttr&amp;quot;: 1&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;datenschutz&amp;quot;: {&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;Checkbox&amp;quot;,&lt;br /&gt;
            &amp;quot;label&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;required&amp;quot;: 1,&lt;br /&gt;
            &amp;quot;label1018&amp;quot;: &amp;quot;Datenschutz&amp;quot;,&lt;br /&gt;
            &amp;quot;description1018&amp;quot;: &amp;quot;Mit meiner Kontaktaufnahme willige ich ein, dass meine Daten gespeichert und zur Bearbeitung meiner Anfrage/Kontaktaufnahme genutzt werden. Meine Daten werden niemals an Dritte weitergeleitet. Diese Einwilligung kann jederzeit widerrufen werden.&amp;quot;,&lt;br /&gt;
            &amp;quot;checkedValue&amp;quot;: &amp;quot;1&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;
==Tipps und Tricks für Formbuilder==&lt;br /&gt;
=== Weiterleitung / Redirect auf Danke Seite ===&lt;br /&gt;
&lt;br /&gt;
=== DatePicker ===&lt;br /&gt;
==== Lokalisierung / Sprache einstellen====&lt;br /&gt;
Der Formbuilder nutzt das Standard InputField Datetime. Das kann man übersetzen:&lt;br /&gt;
 https://processwire.com/talk/topic/4547-possibility-to-translate-timepicker-addon-on-datepicker/?tab=comments#comment-49746&lt;br /&gt;
&lt;br /&gt;
In der folgenden datei kann man als Übersetzung den Pfad zur Lokalisierungsdatei von jQuery angeben (ist im PW mit drin).&lt;br /&gt;
&lt;br /&gt;
Die Datei muss man evtl. selber anlegen (im Übersetzungstool) wenn die Indizierung sie nicht schon selbst angelegt hat.&lt;br /&gt;
&lt;br /&gt;
 /wire/modules/Inputfield/InputfieldDatetime/types/InputfieldDatetimeText.php&lt;br /&gt;
 path: /wire/modules/Jquery/JqueryUI/i18n/jquery.ui.datepicker-de.js&lt;br /&gt;
&lt;br /&gt;
=== Links in Checkbox-Label ===&lt;br /&gt;
HTML geht nicht aber Markdown funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ich habe die [Datenschutzerklärung](https://fbz-vet.de/datenschutz) gelesen und willige in die dort dargestellte Verarbeitung meiner personenbezogenen Daten ein.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formbuilder CSV Export der Eingaben automatisch ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form = $forms-&amp;gt;load(&amp;#039;my-formname&amp;#039;);&lt;br /&gt;
$formBuilderEntries = $form-&amp;gt;entries();&lt;br /&gt;
$formBuilderEntries-&amp;gt;exportCSV($form, &amp;quot;any_field=any_value&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//Same as above, but shorter:&lt;br /&gt;
&lt;br /&gt;
$form = $forms-&amp;gt;load(&amp;#039;my-formname&amp;#039;);&lt;br /&gt;
$form-&amp;gt;entries()-&amp;gt;exportCSV($form, &amp;quot;any_field=any_value&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hooks in general ===&lt;br /&gt;
 https://processwire.com/talk/topic/26362-general-question-on-formbuilder-and-hooks/#comment-218911&lt;br /&gt;
&lt;br /&gt;
==== In Hooks auf Page zugreifen ====&lt;br /&gt;
Im Hook&lt;br /&gt;
 $page = $event-&amp;gt;wire()-&amp;gt;page; // current $page API var&lt;br /&gt;
Oder per use (siehe Beispiel unten)&lt;br /&gt;
&lt;br /&gt;
=== Relevante Hooks ===&lt;br /&gt;
Beispiele aus site/ready.php&lt;br /&gt;
 // if (isset($forms)) //...possible too&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
if(!defined(&amp;quot;PROCESSWIRE&amp;quot;)) die();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;job&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  $emailList = array(&lt;br /&gt;
    &amp;#039;intensiv&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;karlsruhe&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;rastatt&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;pforzheim&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;rheinhausen&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
    &amp;#039;tagespflege&amp;#039; =&amp;gt; &amp;#039;info@indiharart.de&amp;#039;,&lt;br /&gt;
  );&lt;br /&gt;
  $organization = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title;&lt;br /&gt;
  $organizationName = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;value;&lt;br /&gt;
  $jobtitle = $page-&amp;gt;title;&lt;br /&gt;
&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::renderReady&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($organization)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;); &lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($jobtitle)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)-&amp;gt;val($organization);&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)-&amp;gt;val($jobtitle);  &lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($organizationName, $emailList, $formname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; &lt;br /&gt;
      if(array_key_exists($organizationName,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$organizationName]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Werte in Success Meldung anzeigen ===&lt;br /&gt;
 https://processwire.com/talk/topic/12874-mini-how-to-display-submitted-values-in-success-message/#comment-116913&lt;br /&gt;
In site/ready.php I add this code...&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$forms-&amp;gt;addHookAfter(&amp;#039;FormBuilderProcessor::formSubmitSuccess&amp;#039;, function($event) {&lt;br /&gt;
    $form = $event-&amp;gt;object;&lt;br /&gt;
    if ($form-&amp;gt;formName == &amp;#039;YOUR-FORM-NAME-HERE&amp;#039; &amp;amp;&amp;amp; $form-&amp;gt;isSubmitted()) {&lt;br /&gt;
        $values = $form-&amp;gt;getValues();&lt;br /&gt;
        array_walk($values, function(&amp;amp;$i){ $i = htmlentities($i, ENT_QUOTES, &amp;#039;UTF-8&amp;#039;, false); });&lt;br /&gt;
        $form-&amp;gt;successMessage = wirePopulateStringTags($form-&amp;gt;successMessage, $values);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
... changing &amp;#039;YOUR-FORM-NAME-HERE&amp;#039; for the actual name of your form.&lt;br /&gt;
&lt;br /&gt;
I can now include submitted values in my success messages. Like this;&lt;br /&gt;
&lt;br /&gt;
Thank you, {name}. A confirmation email has been sent to {email}.&lt;br /&gt;
&lt;br /&gt;
If I also want to clean up submitted values, prior to the form entry being saved (and, therefore, prior to success message display) I do that in another ready.php hook. In the following example I simply make sure that my collected email field is all lowercase...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$forms-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::saveForm&amp;#039;, function($event) {&lt;br /&gt;
    $form  = $event-&amp;gt;arguments(0);&lt;br /&gt;
    if($form-&amp;gt;name == &amp;#039;YOUR-FORM-NAME-HERE&amp;#039;) {&lt;br /&gt;
        // Sanitise the email field (all lower case)...&lt;br /&gt;
        $f = $form-&amp;gt;get(&amp;#039;email&amp;#039;);&lt;br /&gt;
        $email = strtolower($f-&amp;gt;value);&lt;br /&gt;
        $f-&amp;gt;attr(&amp;#039;value&amp;#039;, &amp;quot;$email&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== E-Mail Adressen per Hook manipulieren ===&lt;br /&gt;
==== Admin E-Mail via User Option Feld auswählen ====&lt;br /&gt;
Im Formular Feld &amp;quot;auswahl&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+Standortauswahl&lt;br /&gt;
salusklinik=Salus Klinik Bad Reichenhall&lt;br /&gt;
mvzreichenhall=MVZ Bad Reichenhall&lt;br /&gt;
mvztraunstein=MVZ Traunstein&lt;br /&gt;
mvzfeldmoching=MVZ Außenstelle Feldmoching&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
site/ready.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;layout-blocks&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
  $formName = &amp;#039;kontakt&amp;#039;;&lt;br /&gt;
  $optionField = &amp;#039;auswahl&amp;#039;;&lt;br /&gt;
  $emailList = array(&lt;br /&gt;
    // We could use e-mail adresses as a value in the select field. But to keep it more secret we use a table.&lt;br /&gt;
    &amp;#039;salusklinik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvzreichenhall&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvztraunstein&amp;#039; =&amp;gt; &amp;#039;info@mvztraunstein.de&amp;#039;,&lt;br /&gt;
    &amp;#039;mvzfeldmoching&amp;#039; =&amp;gt; &amp;#039;info@hautarzt-feldmoching.de&amp;#039;&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($formName, $optionField, $emailList) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formName) return;&lt;br /&gt;
      $values = $processor-&amp;gt;getValues();&lt;br /&gt;
      if($email = $values[$optionField]){&lt;br /&gt;
        //bd($email,&amp;#039;email&amp;#039;);&lt;br /&gt;
        if(array_key_exists($email, $emailList)) {&lt;br /&gt;
          $processor-&amp;gt;emailTo = $emailList[$email];&lt;br /&gt;
          //bd($processor-&amp;gt;emailTo,&amp;quot;email to&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      //$form-&amp;gt;getChildByName(&amp;#039;message&amp;#039;)-&amp;gt;val($email.&amp;#039; email&amp;#039;); // use for debugging&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Beispiel Forum ====&lt;br /&gt;
Nicht getestet. Von:&lt;br /&gt;
 https://processwire.com/talk/topic/26261-solved-send-email-to-email-address-field-in-dynamic-page/#comment-218230&lt;br /&gt;
In ready.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, function($event) {&lt;br /&gt;
  $processor = $event-&amp;gt;object; &lt;br /&gt;
  if($processor-&amp;gt;formName != &amp;#039;myFormName&amp;#039;) return; &lt;br /&gt;
  $page = $event-&amp;gt;wire()-&amp;gt;page; // current $page API var&lt;br /&gt;
  $email = $page-&amp;gt;get(&amp;#039;emailFieldName&amp;#039;); // get &amp;quot;email&amp;quot; field from current page&lt;br /&gt;
  $processor-&amp;gt;emailTo .= &amp;quot;\n&amp;quot; . $email; // use that email + admin Mail (Formbuilder uses one per line)&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Beispiel 2 - RepeaterMatrix ====&lt;br /&gt;
In Repeatern oder einer RepeaterMatrix ist es evtl. geschickter auf andere Weise auf das richtige Feld des Formulars zuzugreifen. Den genauen Grund warum ich hier diesen Hook verwendet habe weiß ich nicht mehr. Er funktioniert auf alle Fälle gut in der RepeaterMatrix.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$emailList = array(&lt;br /&gt;
  &amp;#039;auftrag&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
  &amp;#039;marketing&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;personal&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;gold&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;technik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;beanstandungen&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;sonstiges&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// HOOKS FÜR E-MAIL VERTEILER SCHNELLKONTAKT&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;layout-blocks&amp;#039;){ // check if template is correct&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  $fieldname = &amp;#039;bereich&amp;#039;; // take value of this field as selector&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($emailList, $formname, $fieldname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; // check if we are in correct form&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      $name = $form-&amp;gt;getChildByName($fieldname)-&amp;gt;val();&lt;br /&gt;
      if(array_key_exists($name,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$name]; // tell FormBuilder to use that email&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;
==== Beispiel 3 ====&lt;br /&gt;
Beispiel mit mehreren Formularen&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;
if(!defined(&amp;quot;PROCESSWIRE&amp;quot;)) die();&lt;br /&gt;
&lt;br /&gt;
$emailList = array(&lt;br /&gt;
  &amp;#039;organisationeins&amp;#039; =&amp;gt; &amp;#039;stephanschlegel@gmx.de&amp;#039;,&lt;br /&gt;
  &amp;#039;organisationzwei&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;organisationdrei&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;technik&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;beanstandungen&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
  &amp;#039;sonstiges&amp;#039; =&amp;gt; &amp;#039;post@stephanschlegel.de&amp;#039;,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// HOOKS FÜR BEWERBUNG IM JOBTEMPLATE&lt;br /&gt;
if($page-&amp;gt;template-&amp;gt;name==&amp;#039;job&amp;#039;){&lt;br /&gt;
  $formname = &amp;#039;schnellkontakt&amp;#039;;&lt;br /&gt;
  // E-Mails (Wert aus Template &amp;#039;job&amp;#039; Feld: job_organizationname =&amp;gt; Mailadresse)&lt;br /&gt;
  $organization = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;title;&lt;br /&gt;
  $organizationName = $page-&amp;gt;job-&amp;gt;job_organizationname-&amp;gt;value;&lt;br /&gt;
  $jobtitle = $page-&amp;gt;title;&lt;br /&gt;
&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::renderReady&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      &lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($organization)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;); &lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)&lt;br /&gt;
        -&amp;gt;val($jobtitle)&lt;br /&gt;
        -&amp;gt;attr(&amp;#039;disabled&amp;#039;, &amp;#039;disabled&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // nach dem übermitteln der eingaben (user kann nichts mehr ändern)&lt;br /&gt;
  $wire-&amp;gt;addHook(&amp;#039;FormBuilderProcessor::processInputDone&amp;#039;, &lt;br /&gt;
    function($event) use($organization, $jobtitle, $formname) {&lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      if($form-&amp;gt;name !== $formname) return;&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_fur_folgende_einrichtung&amp;#039;)-&amp;gt;val($organization);&lt;br /&gt;
      $form-&amp;gt;getChildByName(&amp;#039;ich_bewerbe_mich_als&amp;#039;)-&amp;gt;val($jobtitle);  &lt;br /&gt;
    }&lt;br /&gt;
  ); &lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($organizationName, $emailList, $formname) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != $formname) return; &lt;br /&gt;
      if(array_key_exists($organizationName,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$organizationName]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
}else{&lt;br /&gt;
  // HOOKS FÜR INITIATIVBEWERBUNG&lt;br /&gt;
  // change email based on job&lt;br /&gt;
  $wire-&amp;gt;addHookBefore(&amp;#039;FormBuilderProcessor::emailForm&amp;#039;, &lt;br /&gt;
    function($event) use($emailList) {&lt;br /&gt;
      $processor = $event-&amp;gt;object;&lt;br /&gt;
      if($processor-&amp;gt;formName != &amp;#039;schnellkontakt&amp;#039;) return; &lt;br /&gt;
      $form = $event-&amp;gt;arguments(0);&lt;br /&gt;
      $name = $form-&amp;gt;getChildByName(&amp;#039;bereich&amp;#039;)-&amp;gt;val();&lt;br /&gt;
      if(array_key_exists($name,$emailList)){&lt;br /&gt;
        $processor-&amp;gt;emailTo = $emailList[$name]; // tell FormBuilder to use that email&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feld Read Only bei Formular Rendering ===&lt;br /&gt;
 https://processwire.com/talk/topic/26373-making-field-read-only/#comment-218986&lt;br /&gt;
&lt;br /&gt;
=== Prepopulated Fields ===&lt;br /&gt;
 https://processwire.com/talk/topic/25517-solved-pre-populated-fields/#comment-218903&lt;br /&gt;
&lt;br /&gt;
=== PDF Download nach Form Submission ===&lt;br /&gt;
 https://processwire.com/talk/topic/26309-solved-download-pdf-file-after-submitting-the-contact-form/#comment-218905&lt;br /&gt;
&lt;br /&gt;
=== JavaScript ausführen wenn Fehler im Formular sind ===&lt;br /&gt;
Das ist z.B. nützlich wenn man das Formular in einem Modalfenster anzeigt und dieses nach dem Absenden nicht geöffnet ist. Dazu checkt man einfach ob in der Fehlerausgabe Daten sind:&lt;br /&gt;
&lt;br /&gt;
JavaScript / jQuery&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if($(&amp;quot;#FormBuilderSubmitted&amp;quot;).length) {&lt;br /&gt;
  // form was submitted and has errors -&amp;gt; open&lt;br /&gt;
  showForm();&lt;br /&gt;
}else{&lt;br /&gt;
  hideModal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Eigene Templates für E-Mails ===&lt;br /&gt;
==== Administrator E-Mail ====&lt;br /&gt;
Hilfe bekommst du bereits beim Erstellen im Backend:&lt;br /&gt;
o customize the email body, copy the template file &lt;br /&gt;
 /site/modules/FormBuilder/email-administrator.php &lt;br /&gt;
into &lt;br /&gt;
 /site/templates/FormBuilder/email-administrator.php &lt;br /&gt;
or &lt;br /&gt;
 /site/templates/FormBuilder/email-administrator-testform.php &lt;br /&gt;
(creating the directory if not there already) and modify it to suit your needs.&lt;br /&gt;
&lt;br /&gt;
== FormBuilder File Upload ==&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
== Feldtypen hinzufügen ==&lt;br /&gt;
In den Settings von Formbuilder kann man Felder auswählen die man im Formular verwenden möchte. Z.B. erlaubt das Markup Feld das Einfügen von Text etc.&lt;br /&gt;
=== Text im Formular einfügen ===&lt;br /&gt;
Z.B. mit Markup Feld. &lt;br /&gt;
&lt;br /&gt;
Vorsicht CK-Editor funktioniert nicht. Mit diesem stellst du dem User ein Eingabefeld mit Editor zur Verfügung (ungetestet - evtl. funktioniert das auch nicht oder erzeugt eine Sicherheitslücke).&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=33086</id>
		<title>ProcessWire - Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Snippets&amp;diff=33086"/>
		<updated>2025-04-30T08:12:08Z</updated>

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

		<summary type="html">&lt;p&gt;109.193.152.88: /* Probleme lösen Version 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen Version 7 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
==== Tabellen prüfen ====&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27297</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27297"/>
		<updated>2025-04-15T11:32:29Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Probleme lösen Version 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen Version 7 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
Lösungen:&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27296</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27296"/>
		<updated>2025-04-15T11:30:21Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Update auf 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen Version 7 ==&lt;br /&gt;
=== Update auf neuere Datenbanken Fehler: character set utf8 is not used for this connection ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Potentielle Probleme:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* TYPO3 erwartet utf8 (genauer gesagt utf8mb3)&lt;br /&gt;
* TYPO3 7.6 geht standardmäßig von utf8_general_ci aus. Eine neuere Datenbank verwendet aber utf8mb3_general_ci – das ist funktional fast identisch mit dem alten utf8, aber durch neuere MySQL-Versionen expliziter gemacht. Trotzdem nicht 100 % dieselbe Bezeichnung → TYPO3 könnte das als Konflikt interpretieren.&lt;br /&gt;
* Verbindung läuft auf utf8mb4_unicode_ci Das ist ein 4-Byte-Zeichensatz, der nicht 100% kompatibel mit utf8mb3 ist. → Bei Sortierungen oder LIKE-Abfragen könnte TYPO3 falsche Ergebnisse bekommen (z. B. bei Umlauten, Emojis, Sonderzeichen). Ist aber i.d.R. nicht die Ursache für einen Datenbankfehler.&lt;br /&gt;
* Server-Default ist latin1_swedish_ci Dieser Zeichensatz ist alt und wird häufig von MySQL als Fallback verwendet. Gefährlich: Wenn irgendwo keine Zeichensatzangabe erfolgt (z. B. beim Import oder bei neuen Tabellen), wird automatisch latin1 genommen – und das zerstört Umlaute.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27295</id>
		<title>Typo3 - Update</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Typo3_-_Update&amp;diff=27295"/>
		<updated>2025-04-15T11:29:47Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Update auf 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
http://wiki.typo3.org/Upgrade&lt;br /&gt;
&lt;br /&gt;
 [[TYPO3 - Troubleshooting Version 8]]&lt;br /&gt;
 [[TYPO3 - Änderungen Version 9]]&lt;br /&gt;
== Aufräumen vor dem Update ==&lt;br /&gt;
http://typo3blogger.de/turchen-2-tutorial-typo3-entrumpeln/&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
* kb_cleanfiles.&lt;br /&gt;
* Modul unter „DB-Überprüfung“ -&amp;gt; „Database Relations“. Neben dem Listing „Dateien, die in keinem Eintrag verwendet werden (bitte löschen!):“, welches der inhaltlichen Ausgabe der Extension sehr ähnelt, wird hier auch angezeigt ob Dateien doppelt referenziert werden &lt;br /&gt;
* typo3temp über install tool&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
*  kj_recycler für papierkorb Daten danach refefence Index updaten&lt;br /&gt;
* cache_ Tabellen leeren&lt;br /&gt;
* sys_histroy leeren&lt;br /&gt;
&lt;br /&gt;
Zur Not alles löschbar...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[PHP]TRUNCATE TABLE sys_log //e.g. alle älter als 14 Tage&lt;br /&gt;
TRUNCATE TABLE sys_history //e.g. alle änderungen älter als 30 Tage&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE index_fulltext&lt;br /&gt;
TRUNCATE TABLE index_grlist&lt;br /&gt;
TRUNCATE TABLE index_phash&lt;br /&gt;
TRUNCATE TABLE index_rel&lt;br /&gt;
TRUNCATE TABLE index_section&lt;br /&gt;
TRUNCATE TABLE index_stat_search&lt;br /&gt;
TRUNCATE TABLE index_stat_word&lt;br /&gt;
TRUNCATE TABLE index_words&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE cache_pages&lt;br /&gt;
TRUNCATE TABLE cache_hash&lt;br /&gt;
TRUNCATE TABLE cache_imagesizes&lt;br /&gt;
TRUNCATE TABLE cache_pagesection&lt;br /&gt;
TRUNCATE TABLE cache_treelist&lt;br /&gt;
TRUNCATE TABLE cache_typo3temp_log&lt;br /&gt;
TRUNCATE TABLE cache_extensions&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE tx_realurl_errorlog&lt;br /&gt;
&lt;br /&gt;
TRUNCATE TABLE be_sessions&lt;br /&gt;
TRUNCATE TABLE fe_sessions&lt;br /&gt;
TRUNCATE TABLE fe_session_data[/PHP]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Updates ==&lt;br /&gt;
===  PHP 5.5 2017 - Kurzanleitung ===&lt;br /&gt;
Kurzanleitung Update auf PHP 5.5 für TYPO3 4.5.x&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Wichtig&lt;br /&gt;
htaccess aktualisieren&lt;br /&gt;
Source aktualisieren&lt;br /&gt;
Umstellung utf8 &lt;br /&gt;
- DB Export&lt;br /&gt;
- Textmate in utf-8 speichern &lt;br /&gt;
- Ersetzen von CHARSET=latin1 durch CHARSET=utf8&lt;br /&gt;
- Ersetzen der COLLATE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
localconf.php&lt;br /&gt;
=== PHP 5.6 2018 für TYPO 3 4.5 / 6.0===&lt;br /&gt;
Hinweis: 6.2 sollte laufen. Ältere Versionen sind ohnehin nicht mehr sicher.&lt;br /&gt;
&lt;br /&gt;
Quelle:&lt;br /&gt;
 http://www.typo3forum.net/discussion/79348/geloest-toolbaritem-shortcuts-must-implement-interface-backend-toolbaritem&lt;br /&gt;
 https://www.typo3.net/forum/thematik/zeige/thema/123471/&lt;br /&gt;
Eine Suche im Netz ergab, dass T3 in der von mir verwendeten Version nicht mit PHP 5.6 kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
Unter diesem Link habe ich aber gefunden, wie man - bis zu einem Upgrade auf wenigstens 6.2 - das Backend wieder zum Laufen bekommt. Dazu müsste in folgenden Dateien über die Shell der Aufruf &amp;quot;&amp;amp;$backendReference&amp;quot; durch &amp;quot;$backendReference&amp;quot; ersetzt werden:&lt;br /&gt;
 &lt;br /&gt;
 www/cms/typo3/classes/class.clearcachemenu.php:55:&lt;br /&gt;
 www/cms/typo3/classes/class.livesearch.php:51:&lt;br /&gt;
 www/cms/typo3/classes/class.shortcutmenu.php:79:&lt;br /&gt;
 www/cms/typo3/interfaces/interface.backend_toolbaritem.php:43:&lt;br /&gt;
 www/cms/typo3/sysext/opendocs/class.tx_opendocs.php:61:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:53:&lt;br /&gt;
 www/cms/typo3/sysext/sys_action/toolbarmenu/class.tx_sysaction_toolbarmenu.php:63:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/BackendUserInterface/WorkspaceSelectorToolbarItem.php:59:&lt;br /&gt;
&lt;br /&gt;
und zusätzlich noch&lt;br /&gt;
&lt;br /&gt;
 www/cms/typo3/classes/class.backendsearchmenu.php:52:&lt;br /&gt;
 www/cms/typo3/classes/class.workspaceselector.php:57:&lt;br /&gt;
 www/cms/typo3/sysext/workspaces/Classes/ExtDirect/WorkspaceSelectorToolbarItem.php:59&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Update auf 7 ==&lt;br /&gt;
 https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/upgrade-typo3-62-auf-7.html&lt;br /&gt;
 [[TYPO3 Update - 6 auf 7]]&lt;br /&gt;
https://jweiland.net/video-anleitungen/typo3/typo3-projekte-verwalten/typo3-7-lts-migration-von-css-styled-content-nach-fluid-styled-content.html&lt;br /&gt;
* css_styled_content wird durch fluid_styled_content ersetzt&lt;br /&gt;
* FSC bringt eigene CSS-Klassen für das Frontend mit. Anpassungen im CSS einer Website sind notwendig.&lt;br /&gt;
* Die Funktion &amp;quot;Rahmen und Einrückungen (section_frames)&amp;quot; gibt es nicht mehr. Hier muss bei Bedarf auf das &amp;quot;Layout&amp;quot;-Feld ausgewichen werden.&lt;br /&gt;
* Überschriften lassen sich nicht mehr direkt zentrieren oder rechts ausrichten.&lt;br /&gt;
* Die Bildeffekte (Drehung, Graustufen etc.) gibt es auch nicht mehr.&lt;br /&gt;
&lt;br /&gt;
=== Fluid Styled Content ersetzt CSS Styled Content ===&lt;br /&gt;
[[TYPO3 - fluid_styled_content]]&lt;br /&gt;
&lt;br /&gt;
=== htaccess für all-inkl TYPO3 v7===&lt;br /&gt;
So machts der Auto Installer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
php_value always_populate_raw_post_data -1&lt;br /&gt;
php_value memory_limit 256M&lt;br /&gt;
php_value max_execution_time 240&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;\.(php.*|phtml)\.&amp;quot;&amp;gt; &lt;br /&gt;
 RewriteEngine on &lt;br /&gt;
 RewriteRule .* - [R=403,L] &lt;br /&gt;
 &amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#####&lt;br /&gt;
#&lt;br /&gt;
# Example .htaccess file for TYPO3 CMS - for use with Apache Webserver&lt;br /&gt;
#&lt;br /&gt;
# This file includes settings for the following configuration options:&lt;br /&gt;
#&lt;br /&gt;
# - Compression&lt;br /&gt;
# - Caching&lt;br /&gt;
# - MIME types&lt;br /&gt;
# - Cross Origin requests&lt;br /&gt;
# - Rewriting and Access&lt;br /&gt;
# - Miscellaneous&lt;br /&gt;
# - PHP optimisation&lt;br /&gt;
#&lt;br /&gt;
# If you want to use it, you have to copy it to the root folder of your TYPO3 installation (if its&lt;br /&gt;
# not there already) and rename it to &amp;#039;.htaccess&amp;#039;. To make .htaccess files work, you might need to&lt;br /&gt;
# adjust the &amp;#039;AllowOverride&amp;#039; directive in your Apache configuration file.&lt;br /&gt;
#&lt;br /&gt;
# IMPORTANT: You may need to change this file depending on your TYPO3 installation!&lt;br /&gt;
#            Consider adding this file&amp;#039;s content to your webserver&amp;#039;s configuration directly for speed improvement&lt;br /&gt;
#&lt;br /&gt;
# Lots of the options are taken from https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess&lt;br /&gt;
#&lt;br /&gt;
####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Compression ###&lt;br /&gt;
&lt;br /&gt;
# Compressing resource files will save bandwidth and so improve loading speed especially for users&lt;br /&gt;
# with slower internet connections. TYPO3 can compress the .js and .css files for you.&lt;br /&gt;
# *) Uncomment the following lines and&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 for the Backend&lt;br /&gt;
# *) Set $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;compressionLevel&amp;#039;] = 9 together with the TypoScript properties&lt;br /&gt;
#    config.compressJs and config.compressCss for GZIP compression of Frontend JS and CSS files.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.js\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/javascript&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#&amp;lt;FilesMatch &amp;quot;\.css\.gzip$&amp;quot;&amp;gt;&lt;br /&gt;
#	AddType &amp;quot;text/css&amp;quot; .gzip&lt;br /&gt;
#&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
#AddEncoding gzip .gzip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_deflate.c&amp;gt;&lt;br /&gt;
	# Force compression for mangled `Accept-Encoding` request headers&lt;br /&gt;
	&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
		&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
			SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding&lt;br /&gt;
			RequestHeader append Accept-Encoding &amp;quot;gzip,deflate&amp;quot; env=HAVE_Accept-Encoding&lt;br /&gt;
		&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Compress all output labeled with one of the following media types.&lt;br /&gt;
	#&lt;br /&gt;
	# (!) For Apache versions below version 2.3.7 you don&amp;#039;t need to&lt;br /&gt;
	# enable `mod_filter` and can remove the `&amp;lt;IfModule mod_filter.c&amp;gt;`&lt;br /&gt;
	# and `&amp;lt;/IfModule&amp;gt;` lines as `AddOutputFilterByType` is still in&lt;br /&gt;
	# the core directives.&lt;br /&gt;
	#&lt;br /&gt;
	# https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_filter.c&amp;gt;&lt;br /&gt;
		AddOutputFilterByType DEFLATE application/atom+xml \&lt;br /&gt;
			application/javascript \&lt;br /&gt;
			application/json \&lt;br /&gt;
			application/ld+json \&lt;br /&gt;
			application/manifest+json \&lt;br /&gt;
			application/rdf+xml \&lt;br /&gt;
			application/rss+xml \&lt;br /&gt;
			application/schema+json \&lt;br /&gt;
			application/vnd.geo+json \&lt;br /&gt;
			application/vnd.ms-fontobject \&lt;br /&gt;
			application/x-font-ttf \&lt;br /&gt;
			application/x-javascript \&lt;br /&gt;
			application/x-web-app-manifest+json \&lt;br /&gt;
			application/xhtml+xml \&lt;br /&gt;
			application/xml \&lt;br /&gt;
			font/eot \&lt;br /&gt;
			font/opentype \&lt;br /&gt;
			image/bmp \&lt;br /&gt;
			image/svg+xml \&lt;br /&gt;
			image/vnd.microsoft.icon \&lt;br /&gt;
			image/x-icon \&lt;br /&gt;
			text/cache-manifest \&lt;br /&gt;
			text/css \&lt;br /&gt;
			text/html \&lt;br /&gt;
			text/javascript \&lt;br /&gt;
			text/plain \&lt;br /&gt;
			text/vcard \&lt;br /&gt;
			text/vnd.rim.location.xloc \&lt;br /&gt;
			text/vtt \&lt;br /&gt;
			text/x-component \&lt;br /&gt;
			text/x-cross-domain-policy \&lt;br /&gt;
			text/xml&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
		AddEncoding gzip              svgz&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Compression ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
# This affects Frontend and Backend and increases performance.&lt;br /&gt;
&amp;lt;IfModule mod_expires.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	ExpiresActive on&lt;br /&gt;
	ExpiresDefault                                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/css                              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/json                      &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/ld+json                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/schema+json               &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/vnd.geo+json              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType application/xml                       &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/xml                              &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType image/vnd.microsoft.icon              &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType image/x-icon                          &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-component                      &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/html                             &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/javascript                &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-javascript              &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
	ExpiresByType text/javascript                       &amp;quot;access plus 1 year&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/manifest+json             &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-web-app-manifest+json   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
	ExpiresByType text/cache-manifest                   &amp;quot;access plus 0 seconds&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType audio/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/bmp                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/gif                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/jpeg                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/png                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/svg+xml                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType image/webp                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/mp4                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/ogg                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType video/webm                            &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/atom+xml                  &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rdf+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
	ExpiresByType application/rss+xml                   &amp;quot;access plus 1 hour&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType application/vnd.ms-fontobject         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/eot                              &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/opentype                         &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-ttf                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff                 &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/x-font-woff               &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType font/woff                             &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
	ExpiresByType application/font-woff2                &amp;quot;access plus 1 month&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	ExpiresByType text/x-cross-domain-policy            &amp;quot;access plus 1 week&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Browser caching of resource files ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: MIME types ###&lt;br /&gt;
&lt;br /&gt;
# Proper MIME types for all files&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Data interchange&lt;br /&gt;
	AddType application/atom+xml                        atom&lt;br /&gt;
	AddType application/json                            json map topojson&lt;br /&gt;
	AddType application/ld+json                         jsonld&lt;br /&gt;
	AddType application/rss+xml                         rss&lt;br /&gt;
	AddType application/vnd.geo+json                    geojson&lt;br /&gt;
	AddType application/xml                             rdf xml&lt;br /&gt;
&lt;br /&gt;
	# JavaScript&lt;br /&gt;
	AddType application/javascript                      js&lt;br /&gt;
&lt;br /&gt;
	# Manifest files&lt;br /&gt;
	AddType application/manifest+json                   webmanifest&lt;br /&gt;
	AddType application/x-web-app-manifest+json         webapp&lt;br /&gt;
	AddType text/cache-manifest                         appcache&lt;br /&gt;
&lt;br /&gt;
	# Media files&lt;br /&gt;
&lt;br /&gt;
	AddType audio/mp4                                   f4a f4b m4a&lt;br /&gt;
	AddType audio/ogg                                   oga ogg opus&lt;br /&gt;
	AddType image/bmp                                   bmp&lt;br /&gt;
	AddType image/svg+xml                               svg svgz&lt;br /&gt;
	AddType image/webp                                  webp&lt;br /&gt;
	AddType video/mp4                                   f4v f4p m4v mp4&lt;br /&gt;
	AddType video/ogg                                   ogv&lt;br /&gt;
	AddType video/webm                                  webm&lt;br /&gt;
	AddType video/x-flv                                 flv&lt;br /&gt;
	AddType image/x-icon                                cur ico&lt;br /&gt;
&lt;br /&gt;
	# Web fonts&lt;br /&gt;
	AddType application/font-woff                       woff&lt;br /&gt;
	AddType application/font-woff2                      woff2&lt;br /&gt;
	AddType application/vnd.ms-fontobject               eot&lt;br /&gt;
	AddType application/x-font-ttf                      ttc ttf&lt;br /&gt;
	AddType font/opentype                               otf&lt;br /&gt;
&lt;br /&gt;
	# Other&lt;br /&gt;
	AddType application/octet-stream                    safariextz&lt;br /&gt;
	AddType application/x-bb-appworld                   bbaw&lt;br /&gt;
	AddType application/x-chrome-extension              crx&lt;br /&gt;
	AddType application/x-opera-extension               oex&lt;br /&gt;
	AddType application/x-xpinstall                     xpi&lt;br /&gt;
	AddType text/vcard                                  vcard vcf&lt;br /&gt;
	AddType text/vnd.rim.location.xloc                  xloc&lt;br /&gt;
	AddType text/vtt                                    vtt&lt;br /&gt;
	AddType text/x-component                            htc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# UTF-8 encoding&lt;br /&gt;
AddDefaultCharset utf-8&lt;br /&gt;
&amp;lt;IfModule mod_mime.c&amp;gt;&lt;br /&gt;
	AddCharset utf-8 .atom .css .js .json .manifest .rdf .rss .vtt .webapp .webmanifest .xml&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: MIME types ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
# Send the CORS header for images when browsers request it.&lt;br /&gt;
&amp;lt;IfModule mod_setenvif.c&amp;gt;&lt;br /&gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
		&amp;lt;FilesMatch &amp;quot;\.(bmp|cur|gif|ico|jpe?g|png|svgz?|webp)$&amp;quot;&amp;gt;&lt;br /&gt;
			SetEnvIf Origin &amp;quot;:&amp;quot; IS_CORS&lt;br /&gt;
			Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot; env=IS_CORS&lt;br /&gt;
		&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Allow cross-origin access to web fonts.&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(eot|otf|tt[cf]|woff2?)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header set Access-Control-Allow-Origin &amp;quot;*&amp;quot;&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Cross Origin ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
# You need rewriting, if you use a URL-Rewriting extension (RealURL, CoolUri).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Enable URL rewriting&lt;br /&gt;
	RewriteEngine On&lt;br /&gt;
&lt;br /&gt;
	# Store the current location in an environment variable CWD to use&lt;br /&gt;
	# mod_rewrite in .htaccess files without knowing the RewriteBase&lt;br /&gt;
	RewriteCond $0#%{REQUEST_URI} ([^#]*)#(.*)\1$&lt;br /&gt;
	RewriteRule ^.*$ - [E=CWD:%2]&lt;br /&gt;
&lt;br /&gt;
	# Rules to set ApplicationContext based on hostname&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^dev\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Development]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^staging\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production/Staging]&lt;br /&gt;
	#RewriteCond %{HTTP_HOST} ^www\.example\.com$&lt;br /&gt;
	#RewriteRule .? - [E=TYPO3_CONTEXT:Production]&lt;br /&gt;
&lt;br /&gt;
	# Rule for versioned static files, configured through:&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;BE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# - $GLOBALS[&amp;#039;TYPO3_CONF_VARS&amp;#039;][&amp;#039;FE&amp;#039;][&amp;#039;versionNumberInFilename&amp;#039;]&lt;br /&gt;
	# IMPORTANT: This rule has to be the very first RewriteCond in order to work!&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ %{ENV:CWD}$1.$3 [L]&lt;br /&gt;
&lt;br /&gt;
	# Access block for folders&lt;br /&gt;
	RewriteRule _(?:recycler|temp)_/ - [F]&lt;br /&gt;
	RewriteRule fileadmin/templates/.*\.(?:txt|ts)$ - [F]&lt;br /&gt;
	RewriteRule ^(?:vendor|typo3_src|typo3temp/logs) - [F]&lt;br /&gt;
	RewriteRule (?:typo3conf/ext|typo3/sysext|typo3/ext)/[^/]+/(?:Configuration|Resources/Private|Tests?|Documentation|docs?)/ - [F]&lt;br /&gt;
&lt;br /&gt;
	# Block access to all hidden files and directories with the exception of&lt;br /&gt;
	# the visible content from within the `/.well-known/` hidden directory (RFC 5785).&lt;br /&gt;
	RewriteCond %{REQUEST_URI} &amp;quot;!(^|/)\.well-known/([^./]+./?)+$&amp;quot; [NC]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -d [OR]&lt;br /&gt;
	RewriteCond %{SCRIPT_FILENAME} -f&lt;br /&gt;
	RewriteRule (?:^|/)\. - [F]&lt;br /&gt;
&lt;br /&gt;
	# Stop rewrite processing, if we are in the typo3/ directory or any other known directory&lt;br /&gt;
	# NOTE: Add your additional local storages here&lt;br /&gt;
	RewriteRule ^(?:typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|favicon\.ico) - [L]&lt;br /&gt;
&lt;br /&gt;
	# If the file/symlink/directory does not exist =&amp;gt; Redirect to index.php.&lt;br /&gt;
	# For httpd.conf, you need to prefix each &amp;#039;%{REQUEST_FILENAME}&amp;#039; with &amp;#039;%{DOCUMENT_ROOT}&amp;#039;.&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;
	RewriteCond %{REQUEST_FILENAME} !-l&lt;br /&gt;
	RewriteRule ^.*$ %{ENV:CWD}index.php [QSA,L]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Access block for files&lt;br /&gt;
&amp;lt;FilesMatch &amp;quot;(?i:^\.|^#.*#|^(?:ChangeLog|ToDo|Readme|License)(?:\.md|\.txt)?|^composer\.(?:json|lock)|^ext_conf_template\.txt|^ext_typoscript_constants\.txt|^ext_typoscript_setup\.txt|flexform[^.]*\.xml|locallang[^.]*\.(?:xml|xlf)|\.(?:bak|co?nf|cfg|ya?ml|ts|dist|fla|in[ci]|log|sh|sql(?:\..*)?|sw[op]|git.*)|.*(?:~|rc))$&amp;quot;&amp;gt;&lt;br /&gt;
	# Apache &amp;lt; 2.3&lt;br /&gt;
	&amp;lt;IfModule !mod_authz_core.c&amp;gt;&lt;br /&gt;
		Order allow,deny&lt;br /&gt;
		Deny from all&lt;br /&gt;
		Satisfy All&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Apache ≥ 2.3&lt;br /&gt;
	&amp;lt;IfModule mod_authz_core.c&amp;gt;&lt;br /&gt;
		Require all denied&lt;br /&gt;
	&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Block access to vcs directories&lt;br /&gt;
&amp;lt;IfModule mod_alias.c&amp;gt;&lt;br /&gt;
	RedirectMatch 404 /\.(?:git|svn|hg)/&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
### End: Rewriting and Access ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Begin: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
# 404 error prevention for non-existing redirected folders&lt;br /&gt;
Options -MultiViews&lt;br /&gt;
&lt;br /&gt;
# Make sure that directory listings are disabled.&lt;br /&gt;
&amp;lt;IfModule mod_autoindex.c&amp;gt;&lt;br /&gt;
	Options -Indexes&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	# Force IE to render pages in the highest available mode&lt;br /&gt;
	Header set X-UA-Compatible &amp;quot;IE=edge&amp;quot;&lt;br /&gt;
	&amp;lt;FilesMatch &amp;quot;\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svgz?|ttf|vcf|webapp|webm|webp|woff2?|xml|xpi)$&amp;quot;&amp;gt;&lt;br /&gt;
		Header unset X-UA-Compatible&lt;br /&gt;
	&amp;lt;/FilesMatch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	# Reducing MIME type security risks&lt;br /&gt;
	Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# ETag removal&lt;br /&gt;
&amp;lt;IfModule mod_headers.c&amp;gt;&lt;br /&gt;
	Header unset ETag&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
FileETag None&lt;br /&gt;
&lt;br /&gt;
### End: Miscellaneous ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Add your own rules here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update auf 6.2 ==&lt;br /&gt;
=== Probleme mit dem index ===&lt;br /&gt;
https://forge.typo3.org/issues/61154&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fehlermeldung&amp;#039;&amp;#039;&amp;#039; &amp;quot;Migrate all file links of RTE-enabled fields to FAL&amp;quot; fails with &amp;quot;Reference index was probably out of date.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Description&lt;br /&gt;
&lt;br /&gt;
Meanwhile I did upgrades from TYPO3 4.7 to 6.2 for three different instances and every time I ran into this problem.&lt;br /&gt;
Reason are links in content elements of hidden or (from database point of view: logical) deleted pages where the target (usually the file in fileadmin) does not exist anymore.&lt;br /&gt;
&lt;br /&gt;
 cli_dispatch.phpsh lowlevel_refindex -c&lt;br /&gt;
&lt;br /&gt;
does not detect these broken links. So this is a deadlock during migration.&lt;br /&gt;
&lt;br /&gt;
I found this workaround which requires using a SQL client for the mysql database:&lt;br /&gt;
1) &amp;#039;&amp;#039;&amp;#039;check&amp;#039;&amp;#039;&amp;#039; if the result of this query matches the list of &amp;quot;Reference index was probably out of date&amp;quot; elements&lt;br /&gt;
&lt;br /&gt;
 select * from sys_refindex where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
2) If so you can &amp;#039;&amp;#039;&amp;#039;update&amp;#039;&amp;#039;&amp;#039; these records:&lt;br /&gt;
&lt;br /&gt;
 update sys_refindex set softref_key = &amp;#039;typolink&amp;#039; where softref_key = &amp;#039;typolink_tag&amp;#039; AND ref_table = &amp;#039;_FILE&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
== Update 4.5 , 4.7 ==&lt;br /&gt;
=== Umlautprobleme ===&lt;br /&gt;
evtl. auch mal bei dbinit&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET character_set_client = utf8; &lt;br /&gt;
SET character_set_results = utf8; &lt;br /&gt;
SET character_set_connection = utf8; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Manchmal auch bei Darstellungsproblemen oder weißer Seite&lt;br /&gt;
&lt;br /&gt;
Install-Tool nach dem Parameter &amp;quot;&lt;br /&gt;
 systemLocale -&amp;gt; de_DE.utf8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bis TYPO3 4.6&amp;#039;&amp;#039;&amp;#039;: im Install-Tool den Parameter &lt;br /&gt;
 forceCharset -&amp;gt; utf-8&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ab TYPO3 4.7&amp;#039;&amp;#039;&amp;#039;: im &amp;#039;&amp;#039;&amp;#039;Typoscript-Setup&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
 config.renderCharset = utf-8&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Install-Tool&amp;#039;&amp;#039;&amp;#039; bei &amp;quot;&lt;br /&gt;
 setDBinit -&amp;gt;  SET NAMES utf8;&lt;br /&gt;
eintragen (ist ab TYPO3 4.7 bereits als Standard eingetragen).&lt;br /&gt;
&lt;br /&gt;
Nun den kompletten Cache leeren. Jetzt sollten die Umlaute korrekt dargestellt werden.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie per GIFBUILDER Text in Bilder einbauen, versuchen Sie folgendes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_convMethod&amp;quot; den Wert &amp;quot;mbstring&amp;quot; eintragen.&lt;br /&gt;
    Im Install-Tool beim Parameter &amp;quot;t3lib_cs_utils&amp;quot; ebenfalls &amp;quot; mbstring&amp;quot; eintragen.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Falls Sie Templavoila verwenden, müssen Sie darauf achten, dass Ihr HTML-Editor die Datei UTF-8-kodiert speichert. In den meisten Editoren können Sie das in den Einstellungen anpassen.&lt;br /&gt;
&lt;br /&gt;
Wenn immer noch Darstellungsprobleme auftreten, kann unter Umständen eine Konvertierung der Datenbank nötig sein.&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.5 ==&lt;br /&gt;
* Weitere Tools werden separat installiert&lt;br /&gt;
* utf-8 für Datenbankverbindung wird vorausgesetzt (siehe auch Typo3 auf utf-8 umstellen)&lt;br /&gt;
** Install-Tool $TYPO3_CONF_VARS[&amp;#039;SYS&amp;#039;][&amp;#039;setDBinit&amp;#039;] und $TYPO3_CONF_VARS[&amp;#039;BE&amp;#039;][&amp;#039;forceCharset&amp;#039;] default haben sich verändert.&lt;br /&gt;
&lt;br /&gt;
* Zugriff auf veraltete php-Funktionen werden geloggt. Vorsichtig Log kann groß werden&lt;br /&gt;
* Extbase und Fluid&lt;br /&gt;
&lt;br /&gt;
== Update Infos 4.3 ==&lt;br /&gt;
* simulate_static_docs muss separat installiert werden&lt;br /&gt;
=== Update Wizard Info ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: Default targets for non-frame pages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The default page target is empty (so no target is generated). If you use frames, you have to set target to &amp;quot;page&amp;quot; in Constants.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSS Styled Content: htmlspecialchars in menu content elements&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Page titles will get htmlspecialchar&amp;#039;ed when rendered in &amp;quot;Sitemap/menu&amp;quot; content elements, to avoid generating invalid XHTML.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;htmlArea RTE: Using CSS classes for indentation and alignment&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    * Indentation is produced by a CSS class instead of the blockquote element.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for indentation using property buttons.indent.useClass (default is &amp;quot;indent&amp;quot;). You will need to define this class in your stylesheets and ensure that it is allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using the blockquote element by setting property buttons.indent.useBlockquote. You may also want to add the new blockquote button to the RTE toolbar.&lt;br /&gt;
&lt;br /&gt;
    * Text alignment is produced by CSS classes instead of deprecated align attribute.&lt;br /&gt;
      You will need to specify in Page TSConfig the class to be used for each text alignment button using property buttons.[left, center, right or justifyfull].useClass (defaults are &amp;quot;align-left&amp;quot;, &amp;quot;align-center&amp;quot;, &amp;quot;align-right&amp;quot;, &amp;quot;align-justify&amp;quot;). You will need to define these classes in your stylesheets, and ensure that they are allowed by the RTE transformation (RTE.default.proc). Alternatively, you may continue using deprecated align attribute by setting property buttons.[left, center, right or justifyfull].useAlignAttribute.&lt;br /&gt;
&lt;br /&gt;
== Update alter Typo3 Installationen (&amp;lt;V.3.8)==&lt;br /&gt;
Aus der Mailing Liste Östereich:&lt;br /&gt;
- der Core ist relativ easy (fast) immer zu upgraden (muesst&amp;#039; eigentlich von&lt;br /&gt;
v3.3 auch gehen ;-) )&lt;br /&gt;
- Achte immer auf installierte Extensions&lt;br /&gt;
* wenn etwas nicht geht, mal soweit wie moeglich alle Extensions wegschalten (nicht loeschen!).&lt;br /&gt;
* dann zuschalten; wenns dann hakt, dann sieht man gleich welche ext &amp;quot;boese&amp;quot; ist.&lt;br /&gt;
* dann diese ext updaten, wenns keine updates gibt, mal danach googlen.&lt;br /&gt;
* wenns dann net geht, debuggen..&lt;br /&gt;
&lt;br /&gt;
Weitere Probleme:&lt;br /&gt;
&lt;br /&gt;
Alte TS Templates arbeiten noch mit CSet und Content als default Template. Nach umstellen auf css-styled-content muß evt. einiges angepasst werden:&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Backup erstellen (sollte selbstverständlich sein)!&lt;br /&gt;
    Notieren welche Extensions &amp;quot;Global&amp;quot; installiert wurden, da diese später wieder erneut installiert werden müssen&lt;br /&gt;
    Resource herunterladen:&lt;br /&gt;
    wget kent.dl.sourceforge.net/sourceforge/typo3/typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Source-Paket entpacken:&lt;br /&gt;
    tar -xzf typo3_src-4.2.8.tar.gz&lt;br /&gt;
    Im Verzeichnis typo3conf müssen Sie eine Datei mit dem Namen &amp;quot;ENALBE_INSTALL_TOOL&amp;quot; erstellen bzw. uploaden (ich mache das immer mit vi ENABLE_INSTALL_TOOL )&lt;br /&gt;
    eventuell die Rechte und die Gruppe ändern&lt;br /&gt;
    eventuell basedir_restriction anpassen (für Plesk siehe hier)&lt;br /&gt;
    typo3_src Symlink löschen:&lt;br /&gt;
    rm typo3_src&lt;br /&gt;
    neuen Symlink anlegen:&lt;br /&gt;
    ln -s ../../typo3_src-4.2.8/ typo3_src&lt;br /&gt;
    (den richtigen Pfad zum Source-Verzeichnis eventuell anpassen)&lt;br /&gt;
    index.php löschen und neu erstellen:&lt;br /&gt;
    rm index.php &lt;br /&gt;
    ln -s typo3_src/index.php index.php&lt;br /&gt;
    alte Verzeichnisse löschen (media, tslib)&lt;br /&gt;
    alte Dateien löschen (showpic.php)&lt;br /&gt;
    fehlende Verzeichnisse erstellen:&lt;br /&gt;
    typo3conf/l10n, typo3temp/temp, typo3temp/GB, typo3temp/pics, typo3temp/llxml/, typo3temp/cs/ (sofern diese nicht schon vorhanden sind)&lt;br /&gt;
    Installtool aufrufen und &amp;quot;Basic Configuration&amp;quot; überprüfen; hier sollte alles im grünen Bereich sein. Wenn nicht entsprechende Probleme beheben.&lt;br /&gt;
    &amp;quot;Update Wizard&amp;quot; ausführen&lt;br /&gt;
    Im &amp;quot;Database Analyser&amp;quot; auf &amp;quot;Update required tables&amp;quot; auf &amp;quot;Compare&amp;quot; klicken und bestätigen&lt;br /&gt;
    Ins Backend einloggen und alle &amp;quot;Global&amp;quot; installierten Extensions nachinstallieren&lt;br /&gt;
    Im Ext Manager unter Settings &amp;quot;Enable unsupported extensions&amp;quot; aktivieren, da zur Zeit noch nicht alle Exentensions überprüft wurden.&lt;br /&gt;
    Im Ext Manager unter &amp;quot;Import extensions&amp;quot; auf &amp;quot;Retrieve/Update&amp;quot; klicken, um die aktuelle Liste der Extensions herunterzuladen&lt;br /&gt;
    (Sollte es dabei zu Fehlermeldungen kommen, muss u.U. auf curl umgestellt werden) Leider ist das neue TER 2.0 extrem speicherhungrig, so dass u.U. die Speicherbeschränkung von PHP nicht ausreicht. Wenn möglich sollten Sie also zuvor den verfügbaren Speicher von PHP auf min. 45MB(!) hochsetzen. Sollten Sie dazu keine Rechte haben oder soviel Speicher nicht zur Verfügung stellen wollen, können Sie sich dadurch behelfen, dass Sie die benötigten Extensions als .t3x-Dateien herunterladen und &amp;quot;von Hand&amp;quot; installieren.&lt;br /&gt;
    Im Ext Manager die Sprache updaten&lt;br /&gt;
    Eventuell veraltete local-installierte Extensions erneuern (z.B. TemplaVoila, static_info_tables u.ä.)&lt;br /&gt;
    Nicht mehr benötigte &amp;quot;Local&amp;quot;-installierte Extensions entfernen, wie z.B. csh_de, htmlarea (ist jetzt eine &amp;quot;System&amp;quot;-Extension und sollte daher local deinstalliert werden)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Update auf 4.1 ==&lt;br /&gt;
Unbedingt im Install Tool Compare ausführen und Tabellen aktualisieren. Sonst kann es Probleme mit verschiedenen Extensions geben (z.B. Login..)&lt;br /&gt;
&lt;br /&gt;
== Probleme beim TYPO3 Update lösen ==&lt;br /&gt;
=== Weiße Seite ===&lt;br /&gt;
* Fehlermeldungen einschalten&lt;br /&gt;
=== The requested URL /typo3/alt_main.php was not found on this server.===&lt;br /&gt;
Symlink für index.php falsch&lt;br /&gt;
=== Nach dem Datenbank Compare fehlen Teile der TYPOScript Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lösung&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Von Version 4.2 auf 4.1 werden blob Felder zu Text Feldern umgewandelt. Dabei werden bei Umlauten die Inhalte abgeschnitten, wenn die Datenbank utf-8 arbeitet, TYPO3 aber die Daten in latin abgelegt hat. &lt;br /&gt;
&lt;br /&gt;
Beim Compare muß man dann die blob konvertierungen weglassen (vor allem bei den Templates - in der Regel gibt es da Kommentare mit Umlauten) und leicht abgewandelt selbst durchführen:&lt;br /&gt;
&lt;br /&gt;
 ALTER TABLE sys_template CHANGE config config TEXT CHARACTER SET latin1;&lt;br /&gt;
&lt;br /&gt;
Typo3 läßt hier die Angabe welcher Zeichensatz drin ist weg.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Statements (Stand Typo3 4.5):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sys_template CHANGE constants constants text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE sys_template CHANGE config config text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE image image text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE pages pages tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE tt_content CHANGE multimedia multimedia tinytext CHARACTER SET latin1;&lt;br /&gt;
ALTER TABLE pages CHANGE media media text CHARACTER SET latin1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Link: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html (Zugriff: 10/2012)&lt;br /&gt;
&lt;br /&gt;
== Release Notes Version 4.1 ==&lt;br /&gt;
Die wichtigsten Neuerungen&lt;br /&gt;
* IRRE (Inline Relational Record Editing)&lt;br /&gt;
* AJAX Page and File Tree&lt;br /&gt;
* Clean-up functions (command line scripts)(Über Extension lowlevel)&lt;br /&gt;
* Improved Extension Manager (less memory, stored extension list)&lt;br /&gt;
* UTF-8 for filenames&lt;br /&gt;
* Backend &amp;quot;Who is online&amp;quot;&lt;br /&gt;
* Frontend &amp;quot;Stay logged in&amp;quot; (Konfiguration mit new login box)&lt;br /&gt;
* MySQL InnoDB (Wird automatisch bei Neuinstallation zur Verfügung gestellt, wenn es in mySQL aktiviert ist)&lt;br /&gt;
* Speed up Backend with .htaccess http://typo3.org/development/articles/release-notes-41/page/4/)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manuelles ändern der Tabellen auf InnoDB ===&lt;br /&gt;
Hinweis persönlich rate ich von INNODB und TYPO3 ab, besser ISAM nehmen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alter table cache_hash ENGINE = INNODB;&lt;br /&gt;
alter table cache_imagesizes ENGINE = INNODB;&lt;br /&gt;
alter table cache_md5params ENGINE = INNODB;&lt;br /&gt;
alter table cache_pages ENGINE = INNODB;&lt;br /&gt;
alter table cache_pagesection ENGINE = INNODB;&lt;br /&gt;
alter table cache_typo3temp_log ENGINE = INNODB;&lt;br /&gt;
alter table fe_sessions ENGINE = INNODB;&lt;br /&gt;
alter table fe_session_data ENGINE = INNODB;&lt;br /&gt;
alter table index_fulltext ENGINE = INNODB;&lt;br /&gt;
alter table index_grlist ENGINE = INNODB;&lt;br /&gt;
alter table index_phash ENGINE = INNODB;&lt;br /&gt;
alter table index_rel ENGINE = INNODB;&lt;br /&gt;
alter table index_section ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_search ENGINE = INNODB;&lt;br /&gt;
alter table index_stat_word ENGINE = INNODB;&lt;br /&gt;
alter table index_words ENGINE = INNODB;&lt;br /&gt;
alter table sys_log ENGINE = INNODB;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Generelle Informationen zum Update unter Linux ==&lt;br /&gt;
Quelle: typo3.net Mai 2006&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typo3 ist normalerweise sehr einfach upzudaten - allerdings müssen ein paar Dinge beachtet werden, um updatefähig zu bleiben:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Es dürfen keine Änderungen an dem Typo3-Sourcecode gemacht worden sein. Falls dieses doch gemacht wurde, müssen natürlich diese Änderungen erst in die neue Version eingearbeitet werden.&lt;br /&gt;
* Installierte Extensions sollten möglichst immer LOCAL installiert worden sein. So bleiben diese nach dem Tausch des Typo3-Sourcecodes unberührt und funktionieren nach dem Update (meist) wie gewohnt. Es gibt nur selten den Fall, daß eine Typo3-Version eine Funktion nicht mehr verwendet, die es in der alten Version noch gab.&lt;br /&gt;
* Wenn sie HTML-Templates von GLOBAL installierten Erweiterungen direkt im Extensionordner modifiziert haben sollten, müssen diese erst z.B. in den fileadmin kopiert werden. Dann können Sie den Pfad zu dieser Datei im TypoScript anpassen.&lt;br /&gt;
&lt;br /&gt;
Den Pfad finden Sie überigens mithilfe des TypoScript-Object-Browsers schnell. Meist ist er an der Stelle plugin.extensionname.templateFile zu finden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Bild:T3_wichtigeVerzeichnisse.gif]]&lt;br /&gt;
&lt;br /&gt;
Einige der wichtigsten Verzeichnisse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Das Update für mittwaldmedien Kunden&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Für unsere Kunden ist es nun besonders einfach, die vorhandene Installation auf die aktuelle Version zu bringen. Sie müssen sich nur auf der Webseite http://www.typo3server.com einloggen. Nach dem Login finden Sie ein Menü mit einem Link zu dem Typo3-Versionsmanager. Dort können Sie mit einem Klick Ihren Account auf die neue Version updaten.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ToDo Versionsmanager für Geo-bit&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Manuelles Update&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Für diejenigen, die dieses Update manuell machen wollen oder müssen, sind die folgenden Schrittenötig. Die Beispiele - vor allem die Pfade - müssen natürlich angepasst werden. Die Beispiele gehen davon aus, daß Sie eine Verzeichnisstruktur angelegt haben, die dem obigen Bild entspricht.&lt;br /&gt;
&lt;br /&gt;
1. Machen Sie zuerst eine Datensicherung von dem Typo3-Sourcen und Ihrem html-Ordner! Die Datenbank können Sie nun über diesen Befehl sichern:&lt;br /&gt;
&lt;br /&gt;
 mysqldump -u benutzername -p -B --add-drop-table datenbank &amp;gt; typo3DBSicherung.sql&lt;br /&gt;
&lt;br /&gt;
Notfalls könnte auch ein Dump mit phpMyAdmin erstellt werden.&lt;br /&gt;
&lt;br /&gt;
2. Verbinden Sie sich mit Ihrem Server über SSH.&lt;br /&gt;
&lt;br /&gt;
3. Wechseln Sie das Verzeichnis auf einer Ebene über dem Rootverzeichnis Ihres Webservers.&lt;br /&gt;
z.B.: cd /home/www/p1234/&lt;br /&gt;
&lt;br /&gt;
4. Laden Sie sich die neuen Typo3-Sourcen auf ihren Linuxrechner. Die aktuellen Sourcen finden Sie unter: http://typo3.org/download/packages/.&lt;br /&gt;
&lt;br /&gt;
Die benötigte Datei hat das Format typo3_src-3.x.x.tar.gz&lt;br /&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;
 wget belnet.dl.sourceforge.net/sourceforge/typo3/typo3_src-3.7.0.tar.gz&lt;br /&gt;
&lt;br /&gt;
5. Entpacken Sie die Datei mit dem Kommando:&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;
 tar -xzvf typo3_src-3.x.x.tar.gz&lt;br /&gt;
&lt;br /&gt;
6. Ändern Sie nun die Rechte so, wie der bisherige Typo3-Sourcecode-Ordner sie hatte.&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;
 chown p1234.ftponly typo3_src-3.7.0 -R&lt;br /&gt;
&lt;br /&gt;
7. Entfernen Sie den alten symbolischen Link mit:&lt;br /&gt;
&lt;br /&gt;
 rm typo3_src&lt;br /&gt;
&lt;br /&gt;
8. Legen Sie nun einen neuen Link an mit:&lt;br /&gt;
&lt;br /&gt;
 ln -s typo3_src-3.x.x typo3_src&lt;br /&gt;
&lt;br /&gt;
(Die Versionsnummer müssen Sie natürlich noch anpassen.)&lt;br /&gt;
&lt;br /&gt;
9. Nun muss die Datenbank noch aktualisiert werden:&lt;br /&gt;
&lt;br /&gt;
Gehen Sie hierzu in das Typo3-Installtool und klicken Sie auf den 2. Menüpunkt Database Analyser. Mit einem Klick auf Compare werden die zu ändernden oder zu ergänzenden Datenbankfelder angezeigt. Mit einem Klick auf &amp;quot;Write to database&amp;quot; wird die Datenbank an die neue Typo3-Version angepasst.&lt;br /&gt;
&lt;br /&gt;
10. Loggen Sie sich nun als Admin im Backend an und löschen Sie alle Caches.&lt;br /&gt;
&lt;br /&gt;
== Neu in Version 4 ==&lt;br /&gt;
* Conditions mit AND und OR (|| &amp;amp;&amp;amp;)&lt;br /&gt;
&lt;br /&gt;
== Neu in 4.2 ==&lt;br /&gt;
Viele Usability Verbesserungen im Backend&lt;br /&gt;
== Update auf 4.2 ==&lt;br /&gt;
=== Extensions Updaten ===&lt;br /&gt;
* dam 1.0.11 ist nicht kompatibel Update auf min. 1.0.13&lt;br /&gt;
* date2cal auf &amp;gt;= 7.1.0&lt;br /&gt;
* Kickstarter 0.3.8 ist nicht kompatibel&lt;br /&gt;
* Developer tools gehen nicht mehr (wg. Frame oben)&lt;br /&gt;
&lt;br /&gt;
=== Ablauf ===&lt;br /&gt;
* Backend Benutzer sperren (only Admins)&lt;br /&gt;
* Sicherung der Datenbank&lt;br /&gt;
* neue Source + Symlink&lt;br /&gt;
* Update Wizard&lt;br /&gt;
* Compare&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DAM Upload geht für Benutzer&amp;#039;&amp;#039;&amp;#039; nicht mehr (Fehler Meta Daten können nicht geschrieben werden)&lt;br /&gt;
Beim neu indizieren geht dem dam der Media Ordner verloren. Er legt dann einen neuen an, in den er scheiben möchte. Die Benutzer sind abe noch auf den alten eingestellt. D.h. die Benutzergruppen m´üssen auf den neuen eingestellt werden.&lt;br /&gt;
&lt;br /&gt;
Im Dam stehen im IE7 die Benutzerwerkzeuge nicht zur verfügung (löschen etc.) nur der Stift ist noch da.&lt;br /&gt;
&lt;br /&gt;
Lösung: Das Problem ist das CSS für das Fenster. Es verdeckt die restlichen Symbole&lt;br /&gt;
Forum: 24.7.&lt;br /&gt;
&lt;br /&gt;
Ich hatte das gleiche Problem bis vor 5 Minuten auch,&lt;br /&gt;
gelöst habe ich es so:&lt;br /&gt;
- Datei: class.tx_dam_listbase.php im Ordner DAM\lib\&lt;br /&gt;
Unter der Zeile 256 (&amp;#039;itemTD&amp;#039; =&amp;gt; &amp;#039; class=&amp;quot;typo3-dblist-item&amp;quot;&amp;#039;,)&lt;br /&gt;
ist in 3 Werten als Breite 1% angegeben. Das auskommentieren&lt;br /&gt;
&lt;br /&gt;
- Datei: stylesheet.cdd in typo3_src\typo3\&lt;br /&gt;
table.typo3-dblist width: 98%; durch width: auto; ersetzen und in&lt;br /&gt;
table.typo3-dblist tr td {width: auto;} einsetzen,&lt;br /&gt;
&lt;br /&gt;
damit hats bei mir im IE 7, Firefox, safari für Win und Opera alles richtig angezeigt :-)&lt;br /&gt;
&lt;br /&gt;
Ich hoffe, geholrfen zu haben,&lt;br /&gt;
Schmoozer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bug in Mount Points&lt;br /&gt;
&lt;br /&gt;
== Datenbank über Root Shell sichern (mysql backup) ==&lt;br /&gt;
&lt;br /&gt;
mysqldump -opt ...&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&lt;br /&gt;
Die häufigste Anwendung von mysqldump ist wahrscheinlich die &amp;#039;&amp;#039;&amp;#039;Erstellung eines Backups einer vollständigen Datenbank&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name &amp;gt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
oder mit User und Passwortangabe:&lt;br /&gt;
 mysqldump -u meinDBUser -pGEHEIM db_name &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
--opt ist in neueren MySQL Versionen Standardmäßig an deshalb lassen wir es mal weg.&lt;br /&gt;
&lt;br /&gt;
Die Speicherauszugsdatei können Sie wie folgt &amp;#039;&amp;#039;&amp;#039;wieder einspielen&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql db_name &amp;lt; backup-file.sql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Oder aber so:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysql -e &amp;quot;source /path-to-backup/backup-file.sql&amp;quot; db_name&lt;br /&gt;
&lt;br /&gt;
mysqldump ist ferner sehr nützlich zum Ausfüllen von Datenbanken durch Kopieren von Daten von einem MySQL Server auf einen anderen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --opt db_name | mysql --host=remote_host -C db_name&lt;br /&gt;
&lt;br /&gt;
Sie können mit einem einzigen Befehl einen Speicherauszug mehrerer Datenbanken erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --databases db_name1 [db_name2 ...] &amp;gt; my_databases.sql&lt;br /&gt;
&lt;br /&gt;
Um einen Speicherauszug aller Datenbanken zu erstellen, verwenden Sie die Option --all-databases:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Bei InnoDB-Tabellen bietet mysqldump die Möglichkeit, eine Online-Sicherung zu erstellen:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --single-transaction &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Diese Datensicherung muss vor Beginn des Speicherauszugsvorgangs lediglich (mit FLUSH TABLES WITH READ LOCK) eine globale Lesesperre für alle Tabellen erwirken. Sobald diese Sperre aktiv ist, werden die Koordinaten des Binärlogs ausgelesen, und die Sperre wird aufgehoben. Wenn beim Absetzen der FLUSH-Anweisung gerade eine umfangreiche Änderungsanweisung ausgeführt wird, dann – und nur dann! – kann der MySQL Server stehen bleiben, bis diese lange Anweisung ausgeführt ist; danach ist der Server sperrfrei. Wenn die vom MySQL Server empfangenen Änderungsanweisungen (in Bezug auf ihre Ausführungsdauer) kurz sind, sollte die anfängliche Sperrperiode auch bei vielen Änderungen nicht spürbar sein.&lt;br /&gt;
&lt;br /&gt;
Bei der Point-in-Time-Wiederherstellung (die auch als „Roll-Forward“ bezeichnet wird, wenn Sie ein altes Backup wiederherstellen und die seitdem durchgeführten Änderungen neu aufspielen müssen) ist es häufig nützlich, das Binärlog zu rotieren (siehe Abschnitt 5.12.3, „Die binäre Update-Logdatei“) oder zumindest die Binärlogkoordinaten zu kennen, denen der Speicherauszug entspricht:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --master-data=2 &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
Oder:&lt;br /&gt;
&lt;br /&gt;
 shell&amp;gt; mysqldump --all-databases --flush-logs --master-data=2&lt;br /&gt;
              &amp;gt; all_databases.sql&lt;br /&gt;
&lt;br /&gt;
== Mass Update Script ==&lt;br /&gt;
&lt;br /&gt;
Yesterday some updates came out for TYPO3. These updates fixed certain issues and we needed to update all of our excellent shared hosting environments.&lt;br /&gt;
&lt;br /&gt;
We already have a script (which is more elaborate now) that checks all our TYPO3 installations and sends the sysadmins a nice report about its findings. We use part of that report (list of paths to Document Roots) to feed the updater script.&lt;br /&gt;
&lt;br /&gt;
The TYPO3 update requires you to do the followi&lt;br /&gt;
&lt;br /&gt;
    * update encryption key&lt;br /&gt;
    * clear configuration cache&lt;br /&gt;
    * clear page cache&lt;br /&gt;
&lt;br /&gt;
We do not want to go into 200+ TYPO3 backends and do those tasks manually. We are lazy and we will write a script to automagically do the boring tasks for us.&lt;br /&gt;
&lt;br /&gt;
This script is not perfect but it works well on Debian systems. You can modify it to fit your needs. It was just a quick hack to ease the upgrade pain. Take care to switch the symlink part for upgrade runs of different versions of TYPO3.&lt;br /&gt;
&lt;br /&gt;
I am not responsible for any damage to your system that may occur to misuse of this script. Make sure you understand it before you run it. Run it with a single URI before attempting a whole ist of URI&amp;#039;s. &lt;br /&gt;
&lt;br /&gt;
Ein Massen Update Script von:&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
Zugriff am 12.3.2009&lt;br /&gt;
&lt;br /&gt;
http://typofree.org/article/archive/2009/january/title/typo3-mass-upgrade-script/&lt;br /&gt;
&lt;br /&gt;
TYPO3 mass update script&lt;br /&gt;
&lt;br /&gt;
   1.&lt;br /&gt;
      #!/bin/sh&lt;br /&gt;
   2.&lt;br /&gt;
      binDir=/usr/bin/&lt;br /&gt;
   3.&lt;br /&gt;
      sleep=2&lt;br /&gt;
   4.&lt;br /&gt;
       &lt;br /&gt;
   5.&lt;br /&gt;
      pageCacheTables=(&lt;br /&gt;
   6.&lt;br /&gt;
              cache_pages&lt;br /&gt;
   7.&lt;br /&gt;
              cache_pagesection&lt;br /&gt;
   8.&lt;br /&gt;
      )&lt;br /&gt;
   9.&lt;br /&gt;
       &lt;br /&gt;
  10.&lt;br /&gt;
      sites=(&lt;br /&gt;
  11.&lt;br /&gt;
              /var/www/sites/live/www.somedomain.tld&lt;br /&gt;
  12.&lt;br /&gt;
              /var/www/sites/live/www.someotherdomain.tld&lt;br /&gt;
  13.&lt;br /&gt;
              /var/www/sites/live/www.yetsomeotherdomain.tld&lt;br /&gt;
  14.&lt;br /&gt;
      )&lt;br /&gt;
  15.&lt;br /&gt;
       &lt;br /&gt;
  16.&lt;br /&gt;
      len=${#sites[*]}&lt;br /&gt;
  17.&lt;br /&gt;
      pageCacheTablesLength=${#pageCacheTables[*]}&lt;br /&gt;
  18.&lt;br /&gt;
      i=0&lt;br /&gt;
  19.&lt;br /&gt;
      while [ $i -lt $len ]; do&lt;br /&gt;
  20.&lt;br /&gt;
              echo updating: ${sites[$i]}&lt;br /&gt;
  21.&lt;br /&gt;
                      cd ${sites[$i]}&lt;br /&gt;
  22.&lt;br /&gt;
                      rm typo3_src&lt;br /&gt;
  23.&lt;br /&gt;
                      ln -s ../../sources/typo3_src-4.2.5 typo3_src&lt;br /&gt;
  24.&lt;br /&gt;
       &lt;br /&gt;
  25.&lt;br /&gt;
              echo generating new key&lt;br /&gt;
  26.&lt;br /&gt;
                      k=0&lt;br /&gt;
  27.&lt;br /&gt;
                      key=&amp;#039;&amp;#039;&lt;br /&gt;
  28.&lt;br /&gt;
                      while [ $k -lt 96 ]; do&lt;br /&gt;
  29.&lt;br /&gt;
                              key=$key$(head -100 /dev/urandom | md5sum | cut -c1)&lt;br /&gt;
  30.&lt;br /&gt;
                              let k++&lt;br /&gt;
  31.&lt;br /&gt;
                      done&lt;br /&gt;
  32.&lt;br /&gt;
                      echo key: $key&lt;br /&gt;
  33.&lt;br /&gt;
                      sed -i &amp;quot;s/\(\$TYPO3_CONF_VARS\[&amp;#039;SYS&amp;#039;]\[&amp;#039;encryptionKey&amp;#039;] = \).*/\1&amp;#039;$key&amp;#039;;/g&amp;quot; typo3conf/localconf.php&lt;br /&gt;
  34.&lt;br /&gt;
             &lt;br /&gt;
  35.&lt;br /&gt;
              echo removing configuration cache&lt;br /&gt;
  36.&lt;br /&gt;
                      rm -f typo3conf/temp_CACHED*&lt;br /&gt;
  37.&lt;br /&gt;
       &lt;br /&gt;
  38.&lt;br /&gt;
              echo clearing page cache&lt;br /&gt;
  39.&lt;br /&gt;
                      # For some insane reason some values are enclosed in double qotes&lt;br /&gt;
  40.&lt;br /&gt;
                      database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db =&amp;#039;)&lt;br /&gt;
  41.&lt;br /&gt;
                      if [ -z &amp;quot;$database&amp;quot; ] ; then&lt;br /&gt;
  42.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  43.&lt;br /&gt;
                      else&lt;br /&gt;
  44.&lt;br /&gt;
                              database=$(grep &amp;quot;typo_db &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  45.&lt;br /&gt;
                      fi&lt;br /&gt;
  46.&lt;br /&gt;
                      username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_username =&amp;#039;)&lt;br /&gt;
  47.&lt;br /&gt;
                      if [ -z &amp;quot;$username&amp;quot; ] ; then&lt;br /&gt;
  48.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  49.&lt;br /&gt;
                      else&lt;br /&gt;
  50.&lt;br /&gt;
                              username=$(grep &amp;quot;typo_db_username &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  51.&lt;br /&gt;
                      fi&lt;br /&gt;
  52.&lt;br /&gt;
                      password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot; | grep &amp;#039;$typo_db_password =&amp;#039;)&lt;br /&gt;
  53.&lt;br /&gt;
                      if [ -z &amp;quot;$password&amp;quot; ] ; then&lt;br /&gt;
  54.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^&amp;#039;]*&amp;#039;\([^&amp;#039;]*\)&amp;#039;.*/\1/&amp;quot;)&lt;br /&gt;
  55.&lt;br /&gt;
                      else&lt;br /&gt;
  56.&lt;br /&gt;
                              password=$(grep &amp;quot;typo_db_password &amp;quot; typo3conf/localconf.php | tail -1 | sed &amp;quot;s/^[^\&amp;quot;]*\&amp;quot;\([^\&amp;quot;]*\)\&amp;quot;.*/\1/&amp;quot;)&lt;br /&gt;
  57.&lt;br /&gt;
                      fi&lt;br /&gt;
  58.&lt;br /&gt;
                      j=0&lt;br /&gt;
  59.&lt;br /&gt;
                      while [ $j -lt $pageCacheTablesLength ];&lt;br /&gt;
  60.&lt;br /&gt;
                      do&lt;br /&gt;
  61.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;TRUNCATE ${pageCacheTables[$j]}&amp;quot;&lt;br /&gt;
  62.&lt;br /&gt;
                              nice -n 19 ${binDir}mysql --batch -u$username -p&amp;quot;$password&amp;quot; -D$database -e &amp;quot;ALTER TABLE ${pageCacheTables[$j]} auto_increment=1&amp;quot;&lt;br /&gt;
  63.&lt;br /&gt;
                              let j++&lt;br /&gt;
  64.&lt;br /&gt;
                      done&lt;br /&gt;
  65.&lt;br /&gt;
       &lt;br /&gt;
  66.&lt;br /&gt;
              echo &amp;quot;done! Sleeping $sleep seconds . . .&amp;quot;&lt;br /&gt;
  67.&lt;br /&gt;
                      sleep $sleep&lt;br /&gt;
  68.&lt;br /&gt;
       &lt;br /&gt;
  69.&lt;br /&gt;
              echo&lt;br /&gt;
  70.&lt;br /&gt;
        let i++&lt;br /&gt;
  71.&lt;br /&gt;
      done&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27294</id>
		<title>All-inkl</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27294"/>
		<updated>2025-04-11T10:06:39Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* all-inkl Mailserver Ports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== all-inkl Mailserver Ports==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server Ports&lt;br /&gt;
POP3:  110&lt;br /&gt;
POP3S: 995&lt;br /&gt;
IMAP:  143&lt;br /&gt;
IMAPS: 993&lt;br /&gt;
SMTP:   25 oder 587&lt;br /&gt;
SMTPS: 465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSL (nicht STARTTLS)&lt;br /&gt;
&lt;br /&gt;
== Spezifische Einstellungen für all-inkl Accounts ==&lt;br /&gt;
== Begriffe ==&lt;br /&gt;
* CSR -&amp;gt; Certificate Request - braucht man für Certifikate von externen Signern normalerweise nicht&lt;br /&gt;
* Key -&amp;gt; Private Key&lt;br /&gt;
* CRT = CERT -&amp;gt; Das Zertifikat&lt;br /&gt;
* Brückenzertifikat, Intermediate Bundle, CA Zertifikat -&amp;gt; Das Zertifikat der Zertifizierungsstelle. Dies wird benötigt damit eine Zertifizierungsstelle als Certification Authority verifiziert werden kann. Wenn man ein selbstausgestelltes Zertifikat bei einer CA Zertifizieren will muß man das zusammen mit dem CRT abgeben.&lt;br /&gt;
* CA Certification Authority -&amp;gt; Eine Organisation (Zertifizierungsstelle) die für die Gültigkeit von Zertifikaten steht und diese Signieren kann. &lt;br /&gt;
== DNS E-Mail Einträge für Google Mail ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nr Name Typ Data&lt;br /&gt;
1 [leer] A 85.13.144.174&lt;br /&gt;
2 * A 85.13.144.174&lt;br /&gt;
3 [leer] MX 1 aspmx.l.google.com.&lt;br /&gt;
4 leer MX 5 alt1.aspmx.l.google.com.&lt;br /&gt;
5 leer MX 10 spmx2.googlemail.com.&lt;br /&gt;
6 leer NS ns5.kasserver.com.&lt;br /&gt;
7 leer NS ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Microsoft 365 ==&lt;br /&gt;
Nameserver für Microsoft Office 365 (Outlook) einrichten&lt;br /&gt;
Beispiel BuG&lt;br /&gt;
(&lt;br /&gt;
&lt;br /&gt;
Standardeinträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Name	Typ	Data&lt;br /&gt;
	A	85.13.142.76&lt;br /&gt;
*	A	85.13.142.76&lt;br /&gt;
	NS	ns5.kasserver.com.&lt;br /&gt;
	NS	ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Microsoft 365 (Exchange)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
autodiscover	CNAME	autodiscover.outlook.com.&lt;br /&gt;
enterpriseenrollment	CNAME	enterpriseenrollment.manage.microsoft.com.&lt;br /&gt;
enterpriseregistration	CNAME	enterpriseregistration.windows.net.&lt;br /&gt;
	TXT	v=spf1 include:spf.protection.outlook.com -all&lt;br /&gt;
	MX 0	baumundgarten-de01bb.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Client Configuration?&lt;br /&gt;
 msoid	CNAME	clientconfig.microsoftonline-p.net.&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 lyncdiscover	CNAME	webdir.online.lync.com.&lt;br /&gt;
Telefonanlage?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_sip._tls	SRV 100	1 443 sipdir.online.lync.com.&lt;br /&gt;
_sipfederationtls._tcp	SRV 100	1 5061 sipfed.online.lync.com.&lt;br /&gt;
sip	CNAME	sipdir.online.lync.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Newsletter Anbieter ==&lt;br /&gt;
Wenn Du Newsletter z.B. über Newsletter2Go verschickst musst Du evtl. DNS Einträge setzen, damit du diese über deine Absender-Adresse senden kannst ohne dass Mails als Spam erkannt werden. So funktioniert es:&lt;br /&gt;
&lt;br /&gt;
[[All-inkl - Newsletter Anbieter einrichten]]&lt;br /&gt;
&lt;br /&gt;
== Eigene SSL Zertifikate ==&lt;br /&gt;
Kann man mittlerweile selbst einbinden. Im Kasserver unter &lt;br /&gt;
 Domains &amp;gt; bearbeiten &amp;gt; SSL-Schutz&lt;br /&gt;
Dort kann man auch eigene erstellen (sind dann aber nicht von einer offiziellen Stelle signiert)&lt;br /&gt;
&lt;br /&gt;
=== Eigene SSL Zertifikate mit CA Chain ===&lt;br /&gt;
Manchmal sind in einer Datei mehrere Zertifikatsteile abgelegt. Z.b. kann in einer .pem Datei das Zertifikat und das Brückenzertifikat liegen. Einfach mal reinschauen. Manchmal sind sie auch sinnvoll bezeichnet, z.B. &amp;#039;&amp;#039;&amp;#039;cert+intermediate-ca.pem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
Ins Webformular kommt bei&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSR&amp;#039;&amp;#039;&amp;#039; -&amp;gt;normalerweise nichts, das braucht man nur für den Antrag&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; -&amp;gt; hier der Private Key&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key Passphrase&amp;#039;&amp;#039;&amp;#039; -&amp;gt; braucht man wenn der Key Encrypted ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRT&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Hier kommt das Zertifikat rein (Inhalt der crt Datei)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Brückenzertifikate&amp;#039;&amp;#039;&amp;#039; -&amp;gt; diese werden meistens benötigt und sind oft als Intermediate-, Bundle- oder CA Zertifikat oder CA Chain gekennzeichnet)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wenn alles klappt kommen nach dem Speichern die Daten des Zertifikats z.B.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten CRT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Organisationseinheit [OU]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
GT80198924&lt;br /&gt;
See www.rapidssl.com/resources/cps (c)15&lt;br /&gt;
Domain Control Validated - RapidSSL(R)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gemeinsamer Name [CN]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
www.dekra-sponsoring.de&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gültig&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2015-05-19 bis 2016-07-20&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SHA1 Fingerabdruck&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
00:5A:81:E9:06:35:C3:C2:02:1B:57:7A:DF:26:EB:90:A8:CA:11:A5&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schlüsselstärke&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2048 bit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Signaturalgorithmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
sha256WithRSAEncryption&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten der Brückenzertifikate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSL Zertifikat #1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;	&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., GeoTrust Global CA&lt;br /&gt;
&lt;br /&gt;
== SSL-Proxy ==&lt;br /&gt;
https://ssl-account.com/meineDomain.de/&lt;br /&gt;
&lt;br /&gt;
== Pfade ==&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[TYPO3 - Sichere Backend und Frontend Benutzer mit rsaauth, ssl und saltedpasswords]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27293</id>
		<title>All-inkl</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27293"/>
		<updated>2025-04-11T10:05:57Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* all-inkl Mailserver Ports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== all-inkl Mailserver Ports==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server Ports&lt;br /&gt;
POP3:  110&lt;br /&gt;
POP3S: 995&lt;br /&gt;
IMAP:  143&lt;br /&gt;
IMAPS: 993&lt;br /&gt;
SMTP:   25 oder 587&lt;br /&gt;
SMTPS: 465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSL (normal nicht STARTTLS)&lt;br /&gt;
&lt;br /&gt;
== Spezifische Einstellungen für all-inkl Accounts ==&lt;br /&gt;
== Begriffe ==&lt;br /&gt;
* CSR -&amp;gt; Certificate Request - braucht man für Certifikate von externen Signern normalerweise nicht&lt;br /&gt;
* Key -&amp;gt; Private Key&lt;br /&gt;
* CRT = CERT -&amp;gt; Das Zertifikat&lt;br /&gt;
* Brückenzertifikat, Intermediate Bundle, CA Zertifikat -&amp;gt; Das Zertifikat der Zertifizierungsstelle. Dies wird benötigt damit eine Zertifizierungsstelle als Certification Authority verifiziert werden kann. Wenn man ein selbstausgestelltes Zertifikat bei einer CA Zertifizieren will muß man das zusammen mit dem CRT abgeben.&lt;br /&gt;
* CA Certification Authority -&amp;gt; Eine Organisation (Zertifizierungsstelle) die für die Gültigkeit von Zertifikaten steht und diese Signieren kann. &lt;br /&gt;
== DNS E-Mail Einträge für Google Mail ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nr Name Typ Data&lt;br /&gt;
1 [leer] A 85.13.144.174&lt;br /&gt;
2 * A 85.13.144.174&lt;br /&gt;
3 [leer] MX 1 aspmx.l.google.com.&lt;br /&gt;
4 leer MX 5 alt1.aspmx.l.google.com.&lt;br /&gt;
5 leer MX 10 spmx2.googlemail.com.&lt;br /&gt;
6 leer NS ns5.kasserver.com.&lt;br /&gt;
7 leer NS ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Microsoft 365 ==&lt;br /&gt;
Nameserver für Microsoft Office 365 (Outlook) einrichten&lt;br /&gt;
Beispiel BuG&lt;br /&gt;
(&lt;br /&gt;
&lt;br /&gt;
Standardeinträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Name	Typ	Data&lt;br /&gt;
	A	85.13.142.76&lt;br /&gt;
*	A	85.13.142.76&lt;br /&gt;
	NS	ns5.kasserver.com.&lt;br /&gt;
	NS	ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Microsoft 365 (Exchange)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
autodiscover	CNAME	autodiscover.outlook.com.&lt;br /&gt;
enterpriseenrollment	CNAME	enterpriseenrollment.manage.microsoft.com.&lt;br /&gt;
enterpriseregistration	CNAME	enterpriseregistration.windows.net.&lt;br /&gt;
	TXT	v=spf1 include:spf.protection.outlook.com -all&lt;br /&gt;
	MX 0	baumundgarten-de01bb.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Client Configuration?&lt;br /&gt;
 msoid	CNAME	clientconfig.microsoftonline-p.net.&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 lyncdiscover	CNAME	webdir.online.lync.com.&lt;br /&gt;
Telefonanlage?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_sip._tls	SRV 100	1 443 sipdir.online.lync.com.&lt;br /&gt;
_sipfederationtls._tcp	SRV 100	1 5061 sipfed.online.lync.com.&lt;br /&gt;
sip	CNAME	sipdir.online.lync.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Newsletter Anbieter ==&lt;br /&gt;
Wenn Du Newsletter z.B. über Newsletter2Go verschickst musst Du evtl. DNS Einträge setzen, damit du diese über deine Absender-Adresse senden kannst ohne dass Mails als Spam erkannt werden. So funktioniert es:&lt;br /&gt;
&lt;br /&gt;
[[All-inkl - Newsletter Anbieter einrichten]]&lt;br /&gt;
&lt;br /&gt;
== Eigene SSL Zertifikate ==&lt;br /&gt;
Kann man mittlerweile selbst einbinden. Im Kasserver unter &lt;br /&gt;
 Domains &amp;gt; bearbeiten &amp;gt; SSL-Schutz&lt;br /&gt;
Dort kann man auch eigene erstellen (sind dann aber nicht von einer offiziellen Stelle signiert)&lt;br /&gt;
&lt;br /&gt;
=== Eigene SSL Zertifikate mit CA Chain ===&lt;br /&gt;
Manchmal sind in einer Datei mehrere Zertifikatsteile abgelegt. Z.b. kann in einer .pem Datei das Zertifikat und das Brückenzertifikat liegen. Einfach mal reinschauen. Manchmal sind sie auch sinnvoll bezeichnet, z.B. &amp;#039;&amp;#039;&amp;#039;cert+intermediate-ca.pem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
Ins Webformular kommt bei&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSR&amp;#039;&amp;#039;&amp;#039; -&amp;gt;normalerweise nichts, das braucht man nur für den Antrag&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; -&amp;gt; hier der Private Key&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key Passphrase&amp;#039;&amp;#039;&amp;#039; -&amp;gt; braucht man wenn der Key Encrypted ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRT&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Hier kommt das Zertifikat rein (Inhalt der crt Datei)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Brückenzertifikate&amp;#039;&amp;#039;&amp;#039; -&amp;gt; diese werden meistens benötigt und sind oft als Intermediate-, Bundle- oder CA Zertifikat oder CA Chain gekennzeichnet)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wenn alles klappt kommen nach dem Speichern die Daten des Zertifikats z.B.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten CRT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Organisationseinheit [OU]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
GT80198924&lt;br /&gt;
See www.rapidssl.com/resources/cps (c)15&lt;br /&gt;
Domain Control Validated - RapidSSL(R)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gemeinsamer Name [CN]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
www.dekra-sponsoring.de&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gültig&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2015-05-19 bis 2016-07-20&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SHA1 Fingerabdruck&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
00:5A:81:E9:06:35:C3:C2:02:1B:57:7A:DF:26:EB:90:A8:CA:11:A5&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schlüsselstärke&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2048 bit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Signaturalgorithmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
sha256WithRSAEncryption&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten der Brückenzertifikate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSL Zertifikat #1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;	&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., GeoTrust Global CA&lt;br /&gt;
&lt;br /&gt;
== SSL-Proxy ==&lt;br /&gt;
https://ssl-account.com/meineDomain.de/&lt;br /&gt;
&lt;br /&gt;
== Pfade ==&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[TYPO3 - Sichere Backend und Frontend Benutzer mit rsaauth, ssl und saltedpasswords]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27292</id>
		<title>All-inkl</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27292"/>
		<updated>2025-04-11T09:32:41Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* all-inkl Mailserver Ports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== all-inkl Mailserver Ports==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server Ports&lt;br /&gt;
POP3:  110&lt;br /&gt;
POP3S: 995&lt;br /&gt;
IMAP:  143&lt;br /&gt;
IMAPS: 993&lt;br /&gt;
SMTP:   25 oder 587&lt;br /&gt;
SMTPS: 465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SSL (normal nicht START)&lt;br /&gt;
&lt;br /&gt;
== Spezifische Einstellungen für all-inkl Accounts ==&lt;br /&gt;
== Begriffe ==&lt;br /&gt;
* CSR -&amp;gt; Certificate Request - braucht man für Certifikate von externen Signern normalerweise nicht&lt;br /&gt;
* Key -&amp;gt; Private Key&lt;br /&gt;
* CRT = CERT -&amp;gt; Das Zertifikat&lt;br /&gt;
* Brückenzertifikat, Intermediate Bundle, CA Zertifikat -&amp;gt; Das Zertifikat der Zertifizierungsstelle. Dies wird benötigt damit eine Zertifizierungsstelle als Certification Authority verifiziert werden kann. Wenn man ein selbstausgestelltes Zertifikat bei einer CA Zertifizieren will muß man das zusammen mit dem CRT abgeben.&lt;br /&gt;
* CA Certification Authority -&amp;gt; Eine Organisation (Zertifizierungsstelle) die für die Gültigkeit von Zertifikaten steht und diese Signieren kann. &lt;br /&gt;
== DNS E-Mail Einträge für Google Mail ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nr Name Typ Data&lt;br /&gt;
1 [leer] A 85.13.144.174&lt;br /&gt;
2 * A 85.13.144.174&lt;br /&gt;
3 [leer] MX 1 aspmx.l.google.com.&lt;br /&gt;
4 leer MX 5 alt1.aspmx.l.google.com.&lt;br /&gt;
5 leer MX 10 spmx2.googlemail.com.&lt;br /&gt;
6 leer NS ns5.kasserver.com.&lt;br /&gt;
7 leer NS ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Microsoft 365 ==&lt;br /&gt;
Nameserver für Microsoft Office 365 (Outlook) einrichten&lt;br /&gt;
Beispiel BuG&lt;br /&gt;
(&lt;br /&gt;
&lt;br /&gt;
Standardeinträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Name	Typ	Data&lt;br /&gt;
	A	85.13.142.76&lt;br /&gt;
*	A	85.13.142.76&lt;br /&gt;
	NS	ns5.kasserver.com.&lt;br /&gt;
	NS	ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Microsoft 365 (Exchange)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
autodiscover	CNAME	autodiscover.outlook.com.&lt;br /&gt;
enterpriseenrollment	CNAME	enterpriseenrollment.manage.microsoft.com.&lt;br /&gt;
enterpriseregistration	CNAME	enterpriseregistration.windows.net.&lt;br /&gt;
	TXT	v=spf1 include:spf.protection.outlook.com -all&lt;br /&gt;
	MX 0	baumundgarten-de01bb.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Client Configuration?&lt;br /&gt;
 msoid	CNAME	clientconfig.microsoftonline-p.net.&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 lyncdiscover	CNAME	webdir.online.lync.com.&lt;br /&gt;
Telefonanlage?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_sip._tls	SRV 100	1 443 sipdir.online.lync.com.&lt;br /&gt;
_sipfederationtls._tcp	SRV 100	1 5061 sipfed.online.lync.com.&lt;br /&gt;
sip	CNAME	sipdir.online.lync.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Newsletter Anbieter ==&lt;br /&gt;
Wenn Du Newsletter z.B. über Newsletter2Go verschickst musst Du evtl. DNS Einträge setzen, damit du diese über deine Absender-Adresse senden kannst ohne dass Mails als Spam erkannt werden. So funktioniert es:&lt;br /&gt;
&lt;br /&gt;
[[All-inkl - Newsletter Anbieter einrichten]]&lt;br /&gt;
&lt;br /&gt;
== Eigene SSL Zertifikate ==&lt;br /&gt;
Kann man mittlerweile selbst einbinden. Im Kasserver unter &lt;br /&gt;
 Domains &amp;gt; bearbeiten &amp;gt; SSL-Schutz&lt;br /&gt;
Dort kann man auch eigene erstellen (sind dann aber nicht von einer offiziellen Stelle signiert)&lt;br /&gt;
&lt;br /&gt;
=== Eigene SSL Zertifikate mit CA Chain ===&lt;br /&gt;
Manchmal sind in einer Datei mehrere Zertifikatsteile abgelegt. Z.b. kann in einer .pem Datei das Zertifikat und das Brückenzertifikat liegen. Einfach mal reinschauen. Manchmal sind sie auch sinnvoll bezeichnet, z.B. &amp;#039;&amp;#039;&amp;#039;cert+intermediate-ca.pem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
Ins Webformular kommt bei&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSR&amp;#039;&amp;#039;&amp;#039; -&amp;gt;normalerweise nichts, das braucht man nur für den Antrag&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; -&amp;gt; hier der Private Key&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key Passphrase&amp;#039;&amp;#039;&amp;#039; -&amp;gt; braucht man wenn der Key Encrypted ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRT&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Hier kommt das Zertifikat rein (Inhalt der crt Datei)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Brückenzertifikate&amp;#039;&amp;#039;&amp;#039; -&amp;gt; diese werden meistens benötigt und sind oft als Intermediate-, Bundle- oder CA Zertifikat oder CA Chain gekennzeichnet)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wenn alles klappt kommen nach dem Speichern die Daten des Zertifikats z.B.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten CRT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Organisationseinheit [OU]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
GT80198924&lt;br /&gt;
See www.rapidssl.com/resources/cps (c)15&lt;br /&gt;
Domain Control Validated - RapidSSL(R)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gemeinsamer Name [CN]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
www.dekra-sponsoring.de&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gültig&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2015-05-19 bis 2016-07-20&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SHA1 Fingerabdruck&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
00:5A:81:E9:06:35:C3:C2:02:1B:57:7A:DF:26:EB:90:A8:CA:11:A5&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schlüsselstärke&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2048 bit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Signaturalgorithmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
sha256WithRSAEncryption&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten der Brückenzertifikate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSL Zertifikat #1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;	&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., GeoTrust Global CA&lt;br /&gt;
&lt;br /&gt;
== SSL-Proxy ==&lt;br /&gt;
https://ssl-account.com/meineDomain.de/&lt;br /&gt;
&lt;br /&gt;
== Pfade ==&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[TYPO3 - Sichere Backend und Frontend Benutzer mit rsaauth, ssl und saltedpasswords]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27291</id>
		<title>All-inkl</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=All-inkl&amp;diff=27291"/>
		<updated>2025-04-11T09:30:39Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* all-inkl Mailserver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== all-inkl Mailserver Ports==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Server Ports&lt;br /&gt;
POP3:  110&lt;br /&gt;
POP3S: 995&lt;br /&gt;
IMAP:  143&lt;br /&gt;
IMAPS: 993&lt;br /&gt;
SMTP:   25 oder 587&lt;br /&gt;
SMTPS: 465&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spezifische Einstellungen für all-inkl Accounts ==&lt;br /&gt;
== Begriffe ==&lt;br /&gt;
* CSR -&amp;gt; Certificate Request - braucht man für Certifikate von externen Signern normalerweise nicht&lt;br /&gt;
* Key -&amp;gt; Private Key&lt;br /&gt;
* CRT = CERT -&amp;gt; Das Zertifikat&lt;br /&gt;
* Brückenzertifikat, Intermediate Bundle, CA Zertifikat -&amp;gt; Das Zertifikat der Zertifizierungsstelle. Dies wird benötigt damit eine Zertifizierungsstelle als Certification Authority verifiziert werden kann. Wenn man ein selbstausgestelltes Zertifikat bei einer CA Zertifizieren will muß man das zusammen mit dem CRT abgeben.&lt;br /&gt;
* CA Certification Authority -&amp;gt; Eine Organisation (Zertifizierungsstelle) die für die Gültigkeit von Zertifikaten steht und diese Signieren kann. &lt;br /&gt;
== DNS E-Mail Einträge für Google Mail ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Nr Name Typ Data&lt;br /&gt;
1 [leer] A 85.13.144.174&lt;br /&gt;
2 * A 85.13.144.174&lt;br /&gt;
3 [leer] MX 1 aspmx.l.google.com.&lt;br /&gt;
4 leer MX 5 alt1.aspmx.l.google.com.&lt;br /&gt;
5 leer MX 10 spmx2.googlemail.com.&lt;br /&gt;
6 leer NS ns5.kasserver.com.&lt;br /&gt;
7 leer NS ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Microsoft 365 ==&lt;br /&gt;
Nameserver für Microsoft Office 365 (Outlook) einrichten&lt;br /&gt;
Beispiel BuG&lt;br /&gt;
(&lt;br /&gt;
&lt;br /&gt;
Standardeinträge&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Name	Typ	Data&lt;br /&gt;
	A	85.13.142.76&lt;br /&gt;
*	A	85.13.142.76&lt;br /&gt;
	NS	ns5.kasserver.com.&lt;br /&gt;
	NS	ns6.kasserver.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Microsoft 365 (Exchange)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
autodiscover	CNAME	autodiscover.outlook.com.&lt;br /&gt;
enterpriseenrollment	CNAME	enterpriseenrollment.manage.microsoft.com.&lt;br /&gt;
enterpriseregistration	CNAME	enterpriseregistration.windows.net.&lt;br /&gt;
	TXT	v=spf1 include:spf.protection.outlook.com -all&lt;br /&gt;
	MX 0	baumundgarten-de01bb.mail.protection.outlook.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Client Configuration?&lt;br /&gt;
 msoid	CNAME	clientconfig.microsoftonline-p.net.&lt;br /&gt;
&lt;br /&gt;
?&lt;br /&gt;
 lyncdiscover	CNAME	webdir.online.lync.com.&lt;br /&gt;
Telefonanlage?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
_sip._tls	SRV 100	1 443 sipdir.online.lync.com.&lt;br /&gt;
_sipfederationtls._tcp	SRV 100	1 5061 sipfed.online.lync.com.&lt;br /&gt;
sip	CNAME	sipdir.online.lync.com.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS Einträge für Newsletter Anbieter ==&lt;br /&gt;
Wenn Du Newsletter z.B. über Newsletter2Go verschickst musst Du evtl. DNS Einträge setzen, damit du diese über deine Absender-Adresse senden kannst ohne dass Mails als Spam erkannt werden. So funktioniert es:&lt;br /&gt;
&lt;br /&gt;
[[All-inkl - Newsletter Anbieter einrichten]]&lt;br /&gt;
&lt;br /&gt;
== Eigene SSL Zertifikate ==&lt;br /&gt;
Kann man mittlerweile selbst einbinden. Im Kasserver unter &lt;br /&gt;
 Domains &amp;gt; bearbeiten &amp;gt; SSL-Schutz&lt;br /&gt;
Dort kann man auch eigene erstellen (sind dann aber nicht von einer offiziellen Stelle signiert)&lt;br /&gt;
&lt;br /&gt;
=== Eigene SSL Zertifikate mit CA Chain ===&lt;br /&gt;
Manchmal sind in einer Datei mehrere Zertifikatsteile abgelegt. Z.b. kann in einer .pem Datei das Zertifikat und das Brückenzertifikat liegen. Einfach mal reinschauen. Manchmal sind sie auch sinnvoll bezeichnet, z.B. &amp;#039;&amp;#039;&amp;#039;cert+intermediate-ca.pem&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
Ins Webformular kommt bei&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CSR&amp;#039;&amp;#039;&amp;#039; -&amp;gt;normalerweise nichts, das braucht man nur für den Antrag&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key&amp;#039;&amp;#039;&amp;#039; -&amp;gt; hier der Private Key&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key Passphrase&amp;#039;&amp;#039;&amp;#039; -&amp;gt; braucht man wenn der Key Encrypted ist&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CRT&amp;#039;&amp;#039;&amp;#039; -&amp;gt; Hier kommt das Zertifikat rein (Inhalt der crt Datei)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Brückenzertifikate&amp;#039;&amp;#039;&amp;#039; -&amp;gt; diese werden meistens benötigt und sind oft als Intermediate-, Bundle- oder CA Zertifikat oder CA Chain gekennzeichnet)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wenn alles klappt kommen nach dem Speichern die Daten des Zertifikats z.B.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten CRT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Organisationseinheit [OU]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
GT80198924&lt;br /&gt;
See www.rapidssl.com/resources/cps (c)15&lt;br /&gt;
Domain Control Validated - RapidSSL(R)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gemeinsamer Name [CN]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
www.dekra-sponsoring.de&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Gültig&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2015-05-19 bis 2016-07-20&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SHA1 Fingerabdruck&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
00:5A:81:E9:06:35:C3:C2:02:1B:57:7A:DF:26:EB:90:A8:CA:11:A5&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Schlüsselstärke&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
2048 bit&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Signaturalgorithmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
sha256WithRSAEncryption&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Inhaltsdaten der Brückenzertifikate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SSL Zertifikat #1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., RapidSSL SHA256 CA - G3&lt;br /&gt;
&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;signiert von:&amp;#039;&amp;#039;&amp;#039;	&lt;br /&gt;
&lt;br /&gt;
GeoTrust Inc., GeoTrust Global CA&lt;br /&gt;
&lt;br /&gt;
== SSL-Proxy ==&lt;br /&gt;
https://ssl-account.com/meineDomain.de/&lt;br /&gt;
&lt;br /&gt;
== Pfade ==&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
[[TYPO3 - Sichere Backend und Frontend Benutzer mit rsaauth, ssl und saltedpasswords]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cronjob&amp;diff=27290</id>
		<title>ProcessWire - Cronjob</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cronjob&amp;diff=27290"/>
		<updated>2025-04-03T10:33:47Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Damit ein Cronjob Skript Zugriff auf die ProcessWire Funktionen hat kannst du einfach die index.php inkludieren.&lt;br /&gt;
&lt;br /&gt;
Beachte, dass du bei Selektoren z.B. include=all angeben musst, wenn du auf Templates mit Zugriffsbeschränkungen zugreifst (z.B. wenn diese nur für eine Benutzergruppe zugelassen sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel Archivierungsskript für DEKRA Gewinnspiel:&lt;br /&gt;
&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;
 * job.php&lt;br /&gt;
 * Maintenance tasks called via cronjob&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
//require_once(&amp;#039;../index.php&amp;#039;); // Bootstrapping ProcessWire&lt;br /&gt;
//$pw_path = $_SERVER[&amp;#039;DOCUMENT_ROOT&amp;#039;] . &amp;#039;index.php&amp;#039;;&lt;br /&gt;
$pw_path = __DIR__ . &amp;#039;/../index.php&amp;#039;; // passe den Pfad ggf. an&lt;br /&gt;
require_once($pw_path);&lt;br /&gt;
$archivedCount = moveAnswersToArchive(10);&lt;br /&gt;
echo &amp;quot;Verschobene Antworten: &amp;quot; . $archivedCount . chr(10);&lt;br /&gt;
echo &amp;quot; nomail&amp;quot;; // uncomment if you don&amp;#039;t want cronjob mails&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * moveAnswersToArchive&lt;br /&gt;
 * bewegt Antworten zu Fragen ins Archiv (Checkbox gewählt)&lt;br /&gt;
 * Bewegt nur eine begrenzte Anzahl aus Effizienzgründen&lt;br /&gt;
 * Wird vom export Tool automatisch aufgerufen&lt;br /&gt;
 */&lt;br /&gt;
function moveAnswersToArchive($limit = 3, $parentPage = 30321, $archieveTemplate = &amp;#039;user-archieved-answer&amp;#039;) {&lt;br /&gt;
	$lockedQuestions = pages()-&amp;gt;find(&amp;quot;template=question, checkbox=1, sort=date, limit=3, include=all&amp;quot;); // include ist wichtig, da template zugriff eingeschränkt&lt;br /&gt;
  //var_dump($lockedQuestions);&lt;br /&gt;
	$c = 0;&lt;br /&gt;
	$parent = pages()-&amp;gt;get($parentPage);&lt;br /&gt;
	if($lockedQuestions-&amp;gt;count) {&lt;br /&gt;
			foreach($lockedQuestions as $question) {&lt;br /&gt;
					$answers = pages()-&amp;gt;find(&amp;quot;template=user-answer, pr_question={$question-&amp;gt;id}, sort=date, limit={$limit}&amp;quot;);&lt;br /&gt;
					foreach($answers as $answer) {&lt;br /&gt;
							$answer-&amp;gt;template = $archieveTemplate;&lt;br /&gt;
							$answer-&amp;gt;parent = $parent;&lt;br /&gt;
							if($answer-&amp;gt;save()) {&lt;br /&gt;
									$c++;&lt;br /&gt;
							}&lt;br /&gt;
					}&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Rückgabe der Anzahl der verschobenen Antworten&lt;br /&gt;
  wire(&amp;#039;log&amp;#039;)-&amp;gt;save(&amp;#039;cronjob&amp;#039;, &amp;#039;Antworten archiviert: &amp;#039;. $c);&lt;br /&gt;
	return $c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zugangsschutz:&lt;br /&gt;
&lt;br /&gt;
Hier gibt es verschiedene Methoden. Wenn es bei all-inkl läuft kannst du einfach einen htaccess Passwortschutz auf das Verzeichnis legen (über das kasserver Backend)&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cronjob&amp;diff=27289</id>
		<title>ProcessWire - Cronjob</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Cronjob&amp;diff=27289"/>
		<updated>2025-04-03T10:32:18Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: Die Seite wurde neu angelegt: „Damit ein Cronjob Skript Zugriff auf die ProcessWire Funktionen hat kannst du einfach die index.php inkludieren.  Beachte, dass du bei Selektoren z.B. include=…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Damit ein Cronjob Skript Zugriff auf die ProcessWire Funktionen hat kannst du einfach die index.php inkludieren.&lt;br /&gt;
&lt;br /&gt;
Beachte, dass du bei Selektoren z.B. include=all angeben musst, wenn du auf Templates mit Zugriffsbeschränkungen zugreifst (z.B. wenn diese nur für eine Benutzergruppe zugelassen sind.&lt;br /&gt;
&lt;br /&gt;
Beispiel Archivierungsskript für DEKRA Gewinnspiel:&lt;br /&gt;
&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;
 * job.php&lt;br /&gt;
 * Maintenance tasks called via cronjob&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
//require_once(&amp;#039;../index.php&amp;#039;); // Bootstrapping ProcessWire&lt;br /&gt;
//$pw_path = $_SERVER[&amp;#039;DOCUMENT_ROOT&amp;#039;] . &amp;#039;index.php&amp;#039;;&lt;br /&gt;
$pw_path = __DIR__ . &amp;#039;/../index.php&amp;#039;; // passe den Pfad ggf. an&lt;br /&gt;
require_once($pw_path);&lt;br /&gt;
$archivedCount = moveAnswersToArchive(10);&lt;br /&gt;
echo &amp;quot;Verschobene Antworten: &amp;quot; . $archivedCount . chr(10);&lt;br /&gt;
echo &amp;quot; nomail&amp;quot;; // uncomment if you don&amp;#039;t want cronjob mails&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * moveAnswersToArchive&lt;br /&gt;
 * bewegt Antworten zu Fragen ins Archiv (Checkbox gewählt)&lt;br /&gt;
 * Bewegt nur eine begrenzte Anzahl aus Effizienzgründen&lt;br /&gt;
 * Wird vom export Tool automatisch aufgerufen&lt;br /&gt;
 */&lt;br /&gt;
function moveAnswersToArchive($limit = 3, $parentPage = 30321, $archieveTemplate = &amp;#039;user-archieved-answer&amp;#039;) {&lt;br /&gt;
	$lockedQuestions = pages()-&amp;gt;find(&amp;quot;template=question, checkbox=1, sort=date, limit=3, include=all&amp;quot;); // include ist wichtig, da template zugriff eingeschränkt&lt;br /&gt;
  //var_dump($lockedQuestions);&lt;br /&gt;
	$c = 0;&lt;br /&gt;
	$parent = pages()-&amp;gt;get($parentPage);&lt;br /&gt;
	if($lockedQuestions-&amp;gt;count) {&lt;br /&gt;
			foreach($lockedQuestions as $question) {&lt;br /&gt;
					$answers = pages()-&amp;gt;find(&amp;quot;template=user-answer, pr_question={$question-&amp;gt;id}, sort=date, limit={$limit}&amp;quot;);&lt;br /&gt;
					foreach($answers as $answer) {&lt;br /&gt;
							$answer-&amp;gt;template = $archieveTemplate;&lt;br /&gt;
							$answer-&amp;gt;parent = $parent;&lt;br /&gt;
							if($answer-&amp;gt;save()) {&lt;br /&gt;
									$c++;&lt;br /&gt;
							}&lt;br /&gt;
					}&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Rückgabe der Anzahl der verschobenen Antworten&lt;br /&gt;
  wire(&amp;#039;log&amp;#039;)-&amp;gt;save(&amp;#039;cronjob&amp;#039;, &amp;#039;Antworten archiviert: &amp;#039;. $c);&lt;br /&gt;
	return $c;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27288</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27288"/>
		<updated>2025-03-22T16:00:41Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Lang Attribute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2 (bevorzugt weil schnell):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte. Der Titel für default heißt dann z.B. de und zwar auch in der englischen Übersetzung. &amp;#039;&amp;#039;&amp;#039;Also nicht in der Übersetzung &amp;quot;german&amp;quot; schreiben sondern auch de oder einfach gar nichts.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn du trotzdem irgendwelche ausgeschriebenen Label benötigst kannst du dir von Hand Variablen definieren und Übersetzen (z.B. mit der Übersetzungsfunktion __(&amp;#039;de&amp;#039;) oder_x(&amp;#039;de&amp;#039;, &amp;#039;Label für deutsch&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP-Script für schnelles erstellen eines Schiebeschalters&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Bezieht sich auf das CSS für den fixed width Schalter&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;
 * langtoggle.inc&lt;br /&gt;
 * User is en, show de toggle. User en, show de toggle&lt;br /&gt;
 * Setze das title Feld der jeweiligen Sprache so wie du die Label haben möchtest&lt;br /&gt;
 * &lt;br /&gt;
 * Example SCSS:&lt;br /&gt;
 * https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website#4._Language_Switcher&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$langtoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
$user-&amp;gt;language-&amp;gt;name == &amp;#039;en&amp;#039; ? $targetlangName = &amp;#039;default&amp;#039; : $targetlangName = &amp;#039;en&amp;#039;; //setzt voraus, das die name-Felder der Sprachen en und default sind. default ist immer der name der Standarssprache&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; &lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
    // button für diese Sprache wird nicht benötigt&lt;br /&gt;
    // du könntest hier auch eine gedimmte Version nehmen&lt;br /&gt;
  }else{&lt;br /&gt;
    // URL der aktuellen Seite für die Zielsprache&lt;br /&gt;
    $url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
    //bd($url, &amp;#039;langtoggle: target url&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $langtoggle .= &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; class=&amp;quot;toggle-switch &amp;#039;.$language-&amp;gt;name.&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;#039;;&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;
&amp;#039;&amp;#039;&amp;#039;CSS für fixed width Schiebeschalter mit Parametern&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scss&amp;quot;&amp;gt;&lt;br /&gt;
// Toggle Params&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$switch-label-color: #fff;&lt;br /&gt;
$switch-border-color: rgba(255, 255, 255, 0.642&lt;br /&gt;
);&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
$switch-width: 60px; // change this&lt;br /&gt;
$switch-border-thickness: 2px; // change this&lt;br /&gt;
$knob-gap: 5px; // change this (distance to border)&lt;br /&gt;
$switch-outer-width: $switch-width + 2 * $switch-border-thickness; // compensate border space&lt;br /&gt;
$switch-height: floor(($switch-width + 2 * $switch-border-thickness) / 2);&lt;br /&gt;
$switch-border-radius: ceil($switch-height / 2 + 2 * $switch-border-thickness);&lt;br /&gt;
$switch-label-font-size: floor($switch-height / 2);&lt;br /&gt;
$switch-label-width: floor($switch-width / 2);&lt;br /&gt;
$switch-label-distance: floor($switch-border-radius / 3);&lt;br /&gt;
$knob-height: (&lt;br /&gt;
	floor($switch-width / 2) - ((2 * $knob-gap) + 2px)&lt;br /&gt;
);&lt;br /&gt;
$knob-width: $knob-height;&lt;br /&gt;
&lt;br /&gt;
/* fixed width */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
	// display: flex;&lt;br /&gt;
	// gap: 1rem;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch {&lt;br /&gt;
		text-decoration: none;&lt;br /&gt;
		display: inline-block;&lt;br /&gt;
&lt;br /&gt;
		.switch {&lt;br /&gt;
			position: relative;&lt;br /&gt;
			width: $switch-outer-width;&lt;br /&gt;
			height: $switch-height;&lt;br /&gt;
			background-color: $switch-background-color;&lt;br /&gt;
			border-radius: $switch-border-radius;&lt;br /&gt;
			border: $switch-border-thickness solid $switch-border-color;&lt;br /&gt;
			transition: background-color 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.knob {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: $knob-gap;&lt;br /&gt;
			width: $knob-width;&lt;br /&gt;
			height: $knob-height;&lt;br /&gt;
			background-color: $knob-background-color;&lt;br /&gt;
			border-radius: 50%;&lt;br /&gt;
			border: $switch-border-thickness solid $knob-border-color;&lt;br /&gt;
			transition: all 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: 50%;&lt;br /&gt;
			transform: translateY(-50%);&lt;br /&gt;
			font-size: $switch-label-font-size;&lt;br /&gt;
			font-weight: bold;&lt;br /&gt;
			text-transform: uppercase;&lt;br /&gt;
			color: $switch-label-color;&lt;br /&gt;
			width: $switch-label-width;&lt;br /&gt;
			text-align: center;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Default Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
	.toggle-switch.default {&lt;br /&gt;
		.knob {&lt;br /&gt;
			left: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			right: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
	.toggle-switch.en {&lt;br /&gt;
		.knob {&lt;br /&gt;
			right: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			left: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Hover- und Active-Effekte */&lt;br /&gt;
	.toggle-switch:hover .switch {&lt;br /&gt;
		background-color: $switch-background-color-hover;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch:active .knob {&lt;br /&gt;
		transform: scale(0.95);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Allgemeiner code (Beispiel mit dynamischer Breite enthalten &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&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;scss&amp;quot;&amp;gt;&lt;br /&gt;
// Toggle Params&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$switch-label-color: #fff;&lt;br /&gt;
$switch-border-color: rgba(255, 255, 255, 0.642&lt;br /&gt;
);&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
$switch-width: 60px; // change this&lt;br /&gt;
$switch-border-thickness: 2px; // change this&lt;br /&gt;
$knob-gap: 5px; // change this (distance to border)&lt;br /&gt;
$switch-outer-width: $switch-width + 2 * $switch-border-thickness; // compensate border space&lt;br /&gt;
$switch-height: floor(($switch-width + 2 * $switch-border-thickness) / 2);&lt;br /&gt;
$switch-border-radius: ceil($switch-height / 2 + 2 * $switch-border-thickness);&lt;br /&gt;
$switch-label-font-size: floor($switch-height / 2);&lt;br /&gt;
$switch-label-width: floor($switch-width / 2);&lt;br /&gt;
$switch-label-distance: floor($switch-border-radius / 3);&lt;br /&gt;
$knob-height: (&lt;br /&gt;
	floor($switch-width / 2) - ((2 * $knob-gap) + 2px)&lt;br /&gt;
);&lt;br /&gt;
$knob-width: $knob-height;&lt;br /&gt;
&lt;br /&gt;
/* fixed width */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
	// display: flex;&lt;br /&gt;
	// gap: 1rem;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch {&lt;br /&gt;
		text-decoration: none;&lt;br /&gt;
		display: inline-block;&lt;br /&gt;
&lt;br /&gt;
		.switch {&lt;br /&gt;
			position: relative;&lt;br /&gt;
			width: $switch-outer-width;&lt;br /&gt;
			height: $switch-height;&lt;br /&gt;
			background-color: $switch-background-color;&lt;br /&gt;
			border-radius: $switch-border-radius;&lt;br /&gt;
			border: $switch-border-thickness solid $switch-border-color;&lt;br /&gt;
			transition: background-color 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.knob {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: $knob-gap;&lt;br /&gt;
			width: $knob-width;&lt;br /&gt;
			height: $knob-height;&lt;br /&gt;
			background-color: $knob-background-color;&lt;br /&gt;
			border-radius: 50%;&lt;br /&gt;
			border: $switch-border-thickness solid $knob-border-color;&lt;br /&gt;
			transition: all 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: 50%;&lt;br /&gt;
			transform: translateY(-50%);&lt;br /&gt;
			font-size: $switch-label-font-size;&lt;br /&gt;
			font-weight: bold;&lt;br /&gt;
			text-transform: uppercase;&lt;br /&gt;
			color: $switch-label-color;&lt;br /&gt;
			width: $switch-label-width;&lt;br /&gt;
			text-align: center;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Default Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
	.toggle-switch.default {&lt;br /&gt;
		.knob {&lt;br /&gt;
			left: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			right: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
	.toggle-switch.en {&lt;br /&gt;
		.knob {&lt;br /&gt;
			right: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			left: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Hover- und Active-Effekte */&lt;br /&gt;
	.toggle-switch:hover .switch {&lt;br /&gt;
		background-color: $switch-background-color-hover;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch:active .knob {&lt;br /&gt;
		transform: scale(0.95);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
$language = $user-&amp;gt;language;&lt;br /&gt;
 $page-&amp;gt;getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;); // getLanguageValue kann auf verschiedene Werte des language Objekts zugreifen hier auf die &amp;#039;url&amp;#039; z.B. &amp;quot;/&amp;quot; bei Homepage oder &amp;quot;/en/&amp;quot;&lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id); // Kurzform von oberem Beispiel&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); // Absolute URL z.B. &amp;#039;https://100.dekra-online.de/en/&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27287</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27287"/>
		<updated>2025-03-22T11:51:07Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Language Toggle Schiebeschalter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP-Script für schnelles erstellen eines Schiebeschalters&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Bezieht sich auf das CSS für den fixed width Schalter&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;
 * langtoggle.inc&lt;br /&gt;
 * User is en, show de toggle. User en, show de toggle&lt;br /&gt;
 * Setze das title Feld der jeweiligen Sprache so wie du die Label haben möchtest&lt;br /&gt;
 * &lt;br /&gt;
 * Example SCSS:&lt;br /&gt;
 * https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website#4._Language_Switcher&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$langtoggle = &amp;#039;&amp;#039;;&lt;br /&gt;
$user-&amp;gt;language-&amp;gt;name == &amp;#039;en&amp;#039; ? $targetlangName = &amp;#039;default&amp;#039; : $targetlangName = &amp;#039;en&amp;#039;; //setzt voraus, das die name-Felder der Sprachen en und default sind. default ist immer der name der Standarssprache&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; &lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
    // button für diese Sprache wird nicht benötigt&lt;br /&gt;
    // du könntest hier auch eine gedimmte Version nehmen&lt;br /&gt;
  }else{&lt;br /&gt;
    // URL der aktuellen Seite für die Zielsprache&lt;br /&gt;
    $url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
    //bd($url, &amp;#039;langtoggle: target url&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    $langtoggle .= &amp;#039;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; class=&amp;quot;toggle-switch &amp;#039;.$language-&amp;gt;name.&amp;#039;&amp;quot; title=&amp;quot;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;#039;;&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;
&amp;#039;&amp;#039;&amp;#039;CSS für fixed width Schiebeschalter mit Parametern&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scss&amp;quot;&amp;gt;&lt;br /&gt;
// Toggle Params&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$switch-label-color: #fff;&lt;br /&gt;
$switch-border-color: rgba(255, 255, 255, 0.642&lt;br /&gt;
);&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
$switch-width: 60px; // change this&lt;br /&gt;
$switch-border-thickness: 2px; // change this&lt;br /&gt;
$knob-gap: 5px; // change this (distance to border)&lt;br /&gt;
$switch-outer-width: $switch-width + 2 * $switch-border-thickness; // compensate border space&lt;br /&gt;
$switch-height: floor(($switch-width + 2 * $switch-border-thickness) / 2);&lt;br /&gt;
$switch-border-radius: ceil($switch-height / 2 + 2 * $switch-border-thickness);&lt;br /&gt;
$switch-label-font-size: floor($switch-height / 2);&lt;br /&gt;
$switch-label-width: floor($switch-width / 2);&lt;br /&gt;
$switch-label-distance: floor($switch-border-radius / 3);&lt;br /&gt;
$knob-height: (&lt;br /&gt;
	floor($switch-width / 2) - ((2 * $knob-gap) + 2px)&lt;br /&gt;
);&lt;br /&gt;
$knob-width: $knob-height;&lt;br /&gt;
&lt;br /&gt;
/* fixed width */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
	// display: flex;&lt;br /&gt;
	// gap: 1rem;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch {&lt;br /&gt;
		text-decoration: none;&lt;br /&gt;
		display: inline-block;&lt;br /&gt;
&lt;br /&gt;
		.switch {&lt;br /&gt;
			position: relative;&lt;br /&gt;
			width: $switch-outer-width;&lt;br /&gt;
			height: $switch-height;&lt;br /&gt;
			background-color: $switch-background-color;&lt;br /&gt;
			border-radius: $switch-border-radius;&lt;br /&gt;
			border: $switch-border-thickness solid $switch-border-color;&lt;br /&gt;
			transition: background-color 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.knob {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: $knob-gap;&lt;br /&gt;
			width: $knob-width;&lt;br /&gt;
			height: $knob-height;&lt;br /&gt;
			background-color: $knob-background-color;&lt;br /&gt;
			border-radius: 50%;&lt;br /&gt;
			border: $switch-border-thickness solid $knob-border-color;&lt;br /&gt;
			transition: all 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: 50%;&lt;br /&gt;
			transform: translateY(-50%);&lt;br /&gt;
			font-size: $switch-label-font-size;&lt;br /&gt;
			font-weight: bold;&lt;br /&gt;
			text-transform: uppercase;&lt;br /&gt;
			color: $switch-label-color;&lt;br /&gt;
			width: $switch-label-width;&lt;br /&gt;
			text-align: center;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Default Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
	.toggle-switch.default {&lt;br /&gt;
		.knob {&lt;br /&gt;
			left: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			right: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
	.toggle-switch.en {&lt;br /&gt;
		.knob {&lt;br /&gt;
			right: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			left: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Hover- und Active-Effekte */&lt;br /&gt;
	.toggle-switch:hover .switch {&lt;br /&gt;
		background-color: $switch-background-color-hover;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch:active .knob {&lt;br /&gt;
		transform: scale(0.95);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Allgemeiner code (Beispiel mit dynamischer Breite enthalten &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&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;scss&amp;quot;&amp;gt;&lt;br /&gt;
// Toggle Params&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$switch-label-color: #fff;&lt;br /&gt;
$switch-border-color: rgba(255, 255, 255, 0.642&lt;br /&gt;
);&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
$switch-width: 60px; // change this&lt;br /&gt;
$switch-border-thickness: 2px; // change this&lt;br /&gt;
$knob-gap: 5px; // change this (distance to border)&lt;br /&gt;
$switch-outer-width: $switch-width + 2 * $switch-border-thickness; // compensate border space&lt;br /&gt;
$switch-height: floor(($switch-width + 2 * $switch-border-thickness) / 2);&lt;br /&gt;
$switch-border-radius: ceil($switch-height / 2 + 2 * $switch-border-thickness);&lt;br /&gt;
$switch-label-font-size: floor($switch-height / 2);&lt;br /&gt;
$switch-label-width: floor($switch-width / 2);&lt;br /&gt;
$switch-label-distance: floor($switch-border-radius / 3);&lt;br /&gt;
$knob-height: (&lt;br /&gt;
	floor($switch-width / 2) - ((2 * $knob-gap) + 2px)&lt;br /&gt;
);&lt;br /&gt;
$knob-width: $knob-height;&lt;br /&gt;
&lt;br /&gt;
/* fixed width */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
	// display: flex;&lt;br /&gt;
	// gap: 1rem;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch {&lt;br /&gt;
		text-decoration: none;&lt;br /&gt;
		display: inline-block;&lt;br /&gt;
&lt;br /&gt;
		.switch {&lt;br /&gt;
			position: relative;&lt;br /&gt;
			width: $switch-outer-width;&lt;br /&gt;
			height: $switch-height;&lt;br /&gt;
			background-color: $switch-background-color;&lt;br /&gt;
			border-radius: $switch-border-radius;&lt;br /&gt;
			border: $switch-border-thickness solid $switch-border-color;&lt;br /&gt;
			transition: background-color 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.knob {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: $knob-gap;&lt;br /&gt;
			width: $knob-width;&lt;br /&gt;
			height: $knob-height;&lt;br /&gt;
			background-color: $knob-background-color;&lt;br /&gt;
			border-radius: 50%;&lt;br /&gt;
			border: $switch-border-thickness solid $knob-border-color;&lt;br /&gt;
			transition: all 0.3s ease;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			position: absolute;&lt;br /&gt;
			top: 50%;&lt;br /&gt;
			transform: translateY(-50%);&lt;br /&gt;
			font-size: $switch-label-font-size;&lt;br /&gt;
			font-weight: bold;&lt;br /&gt;
			text-transform: uppercase;&lt;br /&gt;
			color: $switch-label-color;&lt;br /&gt;
			width: $switch-label-width;&lt;br /&gt;
			text-align: center;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Default Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
	.toggle-switch.default {&lt;br /&gt;
		.knob {&lt;br /&gt;
			left: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			right: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
	.toggle-switch.en {&lt;br /&gt;
		.knob {&lt;br /&gt;
			right: $knob-gap;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		.label {&lt;br /&gt;
			left: $switch-label-distance;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Hover- und Active-Effekte */&lt;br /&gt;
	.toggle-switch:hover .switch {&lt;br /&gt;
		background-color: $switch-background-color-hover;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.toggle-switch:active .knob {&lt;br /&gt;
		transform: scale(0.95);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
$language = $user-&amp;gt;language;&lt;br /&gt;
 $page-&amp;gt;getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;); // getLanguageValue kann auf verschiedene Werte des language Objekts zugreifen hier auf die &amp;#039;url&amp;#039; z.B. &amp;quot;/&amp;quot; bei Homepage oder &amp;quot;/en/&amp;quot;&lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id); // Kurzform von oberem Beispiel&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); // Absolute URL z.B. &amp;#039;https://100.dekra-online.de/en/&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27286</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27286"/>
		<updated>2025-03-22T10:07:14Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* URL der Sprache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&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;scss&amp;quot;&amp;gt;&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$label-color: #fff;&lt;br /&gt;
// $border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$switch-border-color: #fff;&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
// $knob-border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
body{&lt;br /&gt;
  font-family: Helvetica, sans-serif;&lt;br /&gt;
  background: #006B52;&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
h2{&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.language-switcher-fixed, .language-switcher-dynamic{&lt;br /&gt;
  padding: 40px;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
/* fixed width */&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
.toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    width: 64px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 3px;&lt;br /&gt;
    width: 24px;&lt;br /&gt;
    height: 24px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 1px solid $knob-border-color;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 50%;&lt;br /&gt;
    transform: translateY(-50%);&lt;br /&gt;
    font-size: 15px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
.toggle-switch.de {&lt;br /&gt;
  .knob {&lt;br /&gt;
    left: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    right: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
.toggle-switch.en {&lt;br /&gt;
  .knob {&lt;br /&gt;
    right: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    left: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* dynamic width */&lt;br /&gt;
.language-switcher-dynamic {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  .toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    display: inline-flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    border-radius: 21px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    padding: 5px 10px;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
    /* Die Breite passt sich automatisch an den Inhalt an */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    width: 26px;&lt;br /&gt;
    height: 26px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    font-size: 0.9rem;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
    margin: 0 5px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Label rechts */&lt;br /&gt;
.toggle-switch.de .switch {&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Label links */&lt;br /&gt;
.toggle-switch.en .switch {&lt;br /&gt;
  flex-direction: row-reverse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
$language = $user-&amp;gt;language;&lt;br /&gt;
 $page-&amp;gt;getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;); // getLanguageValue kann auf verschiedene Werte des language Objekts zugreifen hier auf die &amp;#039;url&amp;#039; z.B. &amp;quot;/&amp;quot; bei Homepage oder &amp;quot;/en/&amp;quot;&lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id); // Kurzform von oberem Beispiel&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); // Absolute URL z.B. &amp;#039;https://100.dekra-online.de/en/&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27285</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27285"/>
		<updated>2025-03-22T09:44:15Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Language Toggle Schiebeschalter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&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;scss&amp;quot;&amp;gt;&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$label-color: #fff;&lt;br /&gt;
// $border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$switch-border-color: #fff;&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
// $knob-border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
body{&lt;br /&gt;
  font-family: Helvetica, sans-serif;&lt;br /&gt;
  background: #006B52;&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
h2{&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.language-switcher-fixed, .language-switcher-dynamic{&lt;br /&gt;
  padding: 40px;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
/* fixed width */&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
.toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    width: 64px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 3px;&lt;br /&gt;
    width: 24px;&lt;br /&gt;
    height: 24px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 1px solid $knob-border-color;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 50%;&lt;br /&gt;
    transform: translateY(-50%);&lt;br /&gt;
    font-size: 15px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
.toggle-switch.de {&lt;br /&gt;
  .knob {&lt;br /&gt;
    left: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    right: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
.toggle-switch.en {&lt;br /&gt;
  .knob {&lt;br /&gt;
    right: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    left: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* dynamic width */&lt;br /&gt;
.language-switcher-dynamic {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  .toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    display: inline-flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    border-radius: 21px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    padding: 5px 10px;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
    /* Die Breite passt sich automatisch an den Inhalt an */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    width: 26px;&lt;br /&gt;
    height: 26px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    font-size: 0.9rem;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
    margin: 0 5px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Label rechts */&lt;br /&gt;
.toggle-switch.de .switch {&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Label links */&lt;br /&gt;
.toggle-switch.en .switch {&lt;br /&gt;
  flex-direction: row-reverse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
 getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); &lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27284</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27284"/>
		<updated>2025-03-22T09:35:02Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Flaggennavi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scss&amp;quot;&amp;gt;&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$label-color: #fff;&lt;br /&gt;
// $border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$switch-border-color: #fff;&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
// $knob-border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
body{&lt;br /&gt;
  font-family: Helvetica, sans-serif;&lt;br /&gt;
  background: #006B52;&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
h2{&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.language-switcher-fixed, .language-switcher-dynamic{&lt;br /&gt;
  padding: 40px;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
/* fixed width */&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
.toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    width: 64px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 3px;&lt;br /&gt;
    width: 24px;&lt;br /&gt;
    height: 24px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 1px solid $knob-border-color;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 50%;&lt;br /&gt;
    transform: translateY(-50%);&lt;br /&gt;
    font-size: 15px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
.toggle-switch.de {&lt;br /&gt;
  .knob {&lt;br /&gt;
    left: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    right: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
.toggle-switch.en {&lt;br /&gt;
  .knob {&lt;br /&gt;
    right: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    left: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* dynamic width */&lt;br /&gt;
.language-switcher-dynamic {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  .toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    display: inline-flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    border-radius: 21px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    padding: 5px 10px;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
    /* Die Breite passt sich automatisch an den Inhalt an */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    width: 26px;&lt;br /&gt;
    height: 26px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    font-size: 0.9rem;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
    margin: 0 5px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Label rechts */&lt;br /&gt;
.toggle-switch.de .switch {&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Label links */&lt;br /&gt;
.toggle-switch.en .switch {&lt;br /&gt;
  flex-direction: row-reverse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
 getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); &lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27283</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27283"/>
		<updated>2025-03-22T09:34:45Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* 4. Language Switcher */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Textnavigation mit first/last etc. Klassen=====&lt;br /&gt;
&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Flaggennavi=====&lt;br /&gt;
 z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Language Toggle Schiebeschalter =====&lt;br /&gt;
Siehe auch Codepen &amp;quot;Kholja&amp;quot;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Fixed width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-fixed&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Englisch: Knopf rechts, Beschriftung links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;en&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Deutsch: Knopf links, Beschriftung rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;label&amp;quot;&amp;gt;de&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Dynamic width label&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;language-switcher-dynamic&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- Deutscher Schalter: Knopf links, Label rechts --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/de&amp;quot; class=&amp;quot;toggle-switch de&amp;quot; title=&amp;quot;Wechsel zu Deutsch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;Deutsch&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Englischer Schalter: Knopf rechts, Label links --&amp;gt;&lt;br /&gt;
  &amp;lt;a href=&amp;quot;/en&amp;quot; class=&amp;quot;toggle-switch en&amp;quot; title=&amp;quot;Wechsel zu Englisch&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;switch&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knob&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;label&amp;quot;&amp;gt;English&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scss&amp;quot;&amp;gt;&lt;br /&gt;
$switch-background-color :#006B52;&lt;br /&gt;
$switch-background-color-hover: #4a9a14;&lt;br /&gt;
$label-color: #fff;&lt;br /&gt;
// $border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$switch-border-color: #fff;&lt;br /&gt;
$knob-color: #006B52;&lt;br /&gt;
// $knob-border-color: rgba(0,0,0,0.5);&lt;br /&gt;
$knob-border-color: transparent;&lt;br /&gt;
$knob-background-color: #fff;&lt;br /&gt;
body{&lt;br /&gt;
  font-family: Helvetica, sans-serif;&lt;br /&gt;
  background: #006B52;&lt;br /&gt;
  color: white;&lt;br /&gt;
}&lt;br /&gt;
h2{&lt;br /&gt;
  text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.language-switcher-fixed, .language-switcher-dynamic{&lt;br /&gt;
  padding: 40px;&lt;br /&gt;
  justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
/* fixed width */&lt;br /&gt;
.language-switcher-fixed {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
.toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    width: 64px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    border-radius: 16px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 3px;&lt;br /&gt;
    width: 24px;&lt;br /&gt;
    height: 24px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    border: 1px solid $knob-border-color;&lt;br /&gt;
    transition: all 0.3s ease;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 50%;&lt;br /&gt;
    transform: translateY(-50%);&lt;br /&gt;
    font-size: 15px;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Beschriftung rechts */&lt;br /&gt;
.toggle-switch.de {&lt;br /&gt;
  .knob {&lt;br /&gt;
    left: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    right: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Beschriftung links */&lt;br /&gt;
.toggle-switch.en {&lt;br /&gt;
  .knob {&lt;br /&gt;
    right: 2px;&lt;br /&gt;
  }&lt;br /&gt;
  .label {&lt;br /&gt;
    left: 8px;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* dynamic width */&lt;br /&gt;
.language-switcher-dynamic {&lt;br /&gt;
  display: flex;&lt;br /&gt;
  gap: 1rem;&lt;br /&gt;
  .toggle-switch {&lt;br /&gt;
  text-decoration: none;&lt;br /&gt;
  display: inline-block;&lt;br /&gt;
&lt;br /&gt;
  .switch {&lt;br /&gt;
    display: inline-flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    border-radius: 21px;&lt;br /&gt;
    border: 1px solid $switch-border-color;&lt;br /&gt;
    background-color: $switch-background-color;&lt;br /&gt;
    padding: 5px 10px;&lt;br /&gt;
    transition: background-color 0.3s ease;&lt;br /&gt;
    /* Die Breite passt sich automatisch an den Inhalt an */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .knob {&lt;br /&gt;
    width: 26px;&lt;br /&gt;
    height: 26px;&lt;br /&gt;
    background-color: $knob-background-color;&lt;br /&gt;
    border-radius: 50%;&lt;br /&gt;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);&lt;br /&gt;
    transition: transform 0.3s ease;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .label {&lt;br /&gt;
    font-size: 0.9rem;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    color: $label-color;&lt;br /&gt;
    margin: 0 5px;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Deutscher Schalter: Knopf links, Label rechts */&lt;br /&gt;
.toggle-switch.de .switch {&lt;br /&gt;
  flex-direction: row;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Englischer Schalter: Knopf rechts, Label links */&lt;br /&gt;
.toggle-switch.en .switch {&lt;br /&gt;
  flex-direction: row-reverse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hover- und Active-Effekte */&lt;br /&gt;
.toggle-switch:hover .switch {&lt;br /&gt;
  background-color: $switch-background-color-hover;&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
.toggle-switch:active .knob {&lt;br /&gt;
  transform: scale(0.95);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
 getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); &lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27282</id>
		<title>ProcessWire - Multilanguage Website</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Multilanguage_Website&amp;diff=27282"/>
		<updated>2025-03-22T08:16:11Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* 4. Language Switcher */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mehrsprachige Websites mit ProcessWire / Andere Default Sprache&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://processwire.com/docs/multi-language-support/&lt;br /&gt;
* https://processwire.com/talk/topic/5518-multi-language-site/&lt;br /&gt;
* http://processwire.com/api/multi-language-support/multi-language-urls/&lt;br /&gt;
* https://processwire.com/talk/topic/9322-change-default-language-for-homepage/ (Modul Solution, mehr zur Anschauung)&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
Es gibt mehrere Bereiche an die man denken muss. Einmal geht es um die Eingabe im Backend, die Ausgabe im Frontend, die Sprachnavigation auf der Website und die Templates:&lt;br /&gt;
* Wie übersetze ich Text in meinen &amp;#039;&amp;#039;&amp;#039;Templates&amp;#039;&amp;#039;&amp;#039; ? Siehe unten i18n&lt;br /&gt;
* Wie übersetze ich &amp;#039;&amp;#039;&amp;#039;Inhalte&amp;#039;&amp;#039;&amp;#039; im Backend ?  Dafür ist das Modul Language Support Fields zuständig&lt;br /&gt;
* Wie sollen meine URLs aussehen ? Prinzipiell kann man jedem User unterschiedliche Sprachen auch ohne andere Domain liefern (über seine Session) aber i.d.R wollen wir die URL anzupassen.&lt;br /&gt;
** &amp;#039;&amp;#039;domain.de/en/meineSeite&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;domain.de/myPage&amp;#039;&amp;#039;&lt;br /&gt;
** Um &amp;#039;&amp;#039;&amp;#039;Seitennamen&amp;#039;&amp;#039;&amp;#039; zu übersetzen oder ein Domainkürzel in der URL voranzustellen benötige ich das Modul &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
== Welche Module benötige ich ==&lt;br /&gt;
Da es einige Module in diesem Zusammenhang gibt hier eine Übersicht. Man findet Sie am besten unter &lt;br /&gt;
 Modules &amp;gt; Core &amp;gt; Language&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support&amp;#039;&amp;#039;&amp;#039; - ProcessWire multi-language support. Basis Modul bracht man für alle Beispiele unten. Reicht aus, wenn man nur die Standard-Sprache ändern will. &amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; In der aktuellen PW3 Version schlägt einem ProcessWire nach Installation des Language Support Moduls gleich die Ergänzenden Module (s.u.) vor und man kann den Installationsprozess ziemlich fix erledigen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Fields&amp;#039;&amp;#039;&amp;#039; Required to use multi-language fields. Basis für mehrsprachige Felder im Backend. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Page Names&amp;#039;&amp;#039;&amp;#039;	(LanguageSupportPageNames) Required to use multi-language page names. Braucht man nur wenn &amp;#039;&amp;#039;&amp;#039;alle Seiten in allen Sprachen unterschiedliche Namen&amp;#039;&amp;#039;&amp;#039; bekommen sollen.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Languages Support - Tabs&amp;#039;&amp;#039;&amp;#039; Organizes multi-language fields into tabs for a cleaner easier to use interface.&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir im Frontend i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; - Sind Felder, die im Backend für jede Sprache eine eigene Eingabe bieten.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; benötigt man, damit man für die Sprachen eigene URLs angeben kann. Z.B. bei Home in Englisch /en/ usw. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
&lt;br /&gt;
== Einsprachige Seite aber Deutsch als Default Sprache ==&lt;br /&gt;
Wenn nur die Standardsprache verändern möchte, aber keine Mehrsprachige Seite benötigt brauchen wir nur das Modul &amp;#039;&amp;#039;&amp;#039;Language Support&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Enable languages support -&amp;gt; &amp;#039;&amp;#039;&amp;#039;Core Module &amp;quot;Language Support&amp;quot; aktivieren&amp;#039;&amp;#039;&amp;#039;. -&amp;gt; Sprachen stehen num im Backend Setup zur Verfügung&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Titel der Default Sprache&amp;#039;&amp;#039;&amp;#039; anpassen (z.B. Deutsch (default) )&lt;br /&gt;
* Language Pack in der default Sprache installieren -&amp;gt; Dies ist ab jetzt die Default Sprache. Nicht vergessen auch den &amp;#039;&amp;#039;&amp;#039;lang Tag im Header&amp;#039;&amp;#039;&amp;#039; zu setzen, damit der Browser die Sprache richtig erkennt.&lt;br /&gt;
&lt;br /&gt;
== Sprachpakete installieren ==&lt;br /&gt;
 https://processwire.com/modules/category/language-pack/&lt;br /&gt;
* Sprache auswählen und dort komplettes zip hochladen.&lt;br /&gt;
* Informell (DU) leider im Moment nicht vorhanden&lt;br /&gt;
&lt;br /&gt;
== Basis-Module für Mehrsprachigkeit im Backend ==&lt;br /&gt;
Für mehrsprachige Seiten benötigen wir i.d.R. folgende Module: &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Language Support Fields&amp;#039;&amp;#039;&amp;#039; für die Backend Übersetzungen und &amp;#039;&amp;#039;&amp;#039;Language Support Page Names&amp;#039;&amp;#039;&amp;#039; für die URLs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FieldtypePageTitleLanguage&amp;#039;&amp;#039;&amp;#039; benötigt man wenn man alle Seitenamen anpassen will (seite1_de seite1_fr ...) Für einen reinen Sprachpfad (/de/Seite) braucht man das nicht.&lt;br /&gt;
* Für weitere Sprachen entsprechend hinzufügen.&lt;br /&gt;
Vorgehen:&lt;br /&gt;
* Language Packs installieren: drop in the none english language pack (for admin backend) into the default language, (e.g. german langpack)&lt;br /&gt;
* As a nice sideeffect every new user in your system gets the native language per default without have it to select from the list.&lt;br /&gt;
&lt;br /&gt;
== Templates für Multilanguage vorbereiten (i18n) ==&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/code-i18n/&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
=== Functional fields ===&lt;br /&gt;
In PW3 kamen die functional Fields hinzu. Mit diesen kann man statischen Text dynamisch im Page Editor ansprechen. D.h. das Functional Field findet Texte im Template und macht sie automatisch editierbar im Page Editor. Das Ganze funktioniert auch Mehrsprachig.&lt;br /&gt;
 [[ProcessWire - Functional Fields]]&lt;br /&gt;
 https://processwire.com/blog/posts/functional-fields/&lt;br /&gt;
Beispiele für die Ausgabe von &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
__text(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__textarea(&amp;#039;your text&amp;#039;);&lt;br /&gt;
__richtext(&amp;#039;&amp;lt;p&amp;gt;your text&amp;lt;/p&amp;gt;&amp;#039;); &lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;) // define a identifier for this text snippet...&lt;br /&gt;
__text(&amp;#039;subscribe&amp;#039;) // ..reuse it this way&lt;br /&gt;
$pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;mytext-&amp;gt;subscribe // reuse from another template&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;Submit button&amp;#039;); // Label for page editor&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;subscribe&amp;#039;, &amp;#039;label=Submit button, notes=Test&amp;#039;); // or use a pw selector&lt;br /&gt;
__text(&amp;#039;Subscribe Now&amp;#039;, &amp;#039;name=subscribe, label=Submit button, notes=Test&amp;#039;); // equivalent to upper&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Standard Multilanguage nach i18n ===&lt;br /&gt;
&lt;br /&gt;
 $out = $this-&amp;gt;_(&amp;quot;Live long and prosper&amp;quot;);  // syntax within a class&lt;br /&gt;
 $out = __(&amp;quot;Live long and prosper!&amp;quot;); // syntax outside of a class&lt;br /&gt;
&lt;br /&gt;
Dann im Backend unter der Sprache &amp;quot;Find files to translate&amp;quot; und die Template Datei auswählen.&lt;br /&gt;
&lt;br /&gt;
=== Variablen in i18n ===&lt;br /&gt;
 $out = sprintf(__(&amp;quot;Created %d pages.&amp;quot;), $count); &lt;br /&gt;
 $out = sprintf(__(&amp;#039;Your city is %1$s, and your zip code is %2$s.&amp;#039;), $city, $zipcode);&lt;br /&gt;
&lt;br /&gt;
=== Plural in Multilanguage Files===&lt;br /&gt;
Hierzu gibt es die _n() Funktion&lt;br /&gt;
 $out = sprintf(_n(&amp;quot;Created %d page.&amp;quot;, &amp;quot;Created %d pages.&amp;quot;, $count), $count);&lt;br /&gt;
=== Unterschiedliche Übersetzungen bei gleichem Wortlaut ===&lt;br /&gt;
Manchmal muss der Begriff in anderen Sprachen unterschiedlich übersetzt werden, obwohl er in der Default Sprache gleich lautet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$label = _x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;); // or $this-&amp;gt;_x(&amp;#039;Comment&amp;#039;, &amp;#039;noun&amp;#039;) in a class&lt;br /&gt;
...&lt;br /&gt;
// some other place in the code&lt;br /&gt;
echo _x(&amp;#039;Comment&amp;#039;, &amp;#039;column name&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kommentare für den Übersetzer und User ===&lt;br /&gt;
 $date = __(&amp;#039;g:i:s a&amp;#039;); // Date string in PHP date() format&lt;br /&gt;
 echo __(&amp;quot;Welcome Guest&amp;quot;); // Headline for guest user // Keep it short (2-3 words)&lt;br /&gt;
=== Regeln ===&lt;br /&gt;
* Eine Zeile ein Paar Anführungszeichen&lt;br /&gt;
* Nur eine Übersetzungsfunktion pro Zeile&lt;br /&gt;
&lt;br /&gt;
== Language Switcher ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// remember what language is set to&lt;br /&gt;
$savedLanguage = $user-&amp;gt;language;&lt;br /&gt;
&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
&lt;br /&gt;
  // if user is already viewing the page in this language, skip it&lt;br /&gt;
  if($language-&amp;gt;id == $savedLanguage-&amp;gt;id) continue;&lt;br /&gt;
&lt;br /&gt;
  // if this page isn&amp;#039;t viewable (active) for the language, skip it&lt;br /&gt;
  if(!$page-&amp;gt;viewable($language)) continue;&lt;br /&gt;
&lt;br /&gt;
  // set the user&amp;#039;s language, so that the $page-&amp;gt;url and any other&lt;br /&gt;
  // fields we access from it will be reflective of the $language&lt;br /&gt;
  $user-&amp;gt;language = $language;&lt;br /&gt;
&lt;br /&gt;
  // output a link to this page in the other language&lt;br /&gt;
  echo &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#039;$page-&amp;gt;url&amp;#039;&amp;gt;$language-&amp;gt;title: $page-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
// restore the original language setting&lt;br /&gt;
$user-&amp;gt;language = $savedLanguage;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Seiten nur in einer Sprache verfügbar ==&lt;br /&gt;
What If I want to create/publish a page only in DE language, and that page should not be available in the default language?&lt;br /&gt;
Default language is required. But you could always add your own checkbox field to the page as a toggle to disable it. Your head.inc or _init.php or whatever your common initialization file is could check: &lt;br /&gt;
&lt;br /&gt;
 if($page-&amp;gt;disable_default_language &amp;amp;&amp;amp; $user-&amp;gt;language-&amp;gt;isDefault()) throw new Wire404Exception(); &lt;br /&gt;
You&amp;#039;d also have to consider it with navigation generation, perhaps skipping over pages that have the toggle set while in the default language, or adding it to your selectors when querying pages. &lt;br /&gt;
&lt;br /&gt;
Edit: you could also just choose to not use the default language at all. &lt;br /&gt;
&lt;br /&gt;
 if($user-&amp;gt;language-&amp;gt;isDefault()) $user-&amp;gt;language = $languages-&amp;gt;get(&amp;quot;en-us&amp;quot;); // or whatever you want your default to be&lt;br /&gt;
&lt;br /&gt;
== Language Alternate Fields ==&lt;br /&gt;
Eine Möglichkeit alle Felder (auch Bilder) in verschiedenen Sprachen zu nutzen.&lt;br /&gt;
 https://processwire.com/docs/multi-language-support/multi-language-fields/#language-alternate-fields&lt;br /&gt;
&lt;br /&gt;
== Probleme lösen ==&lt;br /&gt;
=== Feldtyp nicht als Multilanguagefeld vorhanden - Language Alternate Field ===&lt;br /&gt;
Manche Felder (z.B. AssistedUrl) gibt es nur einsprachig. ProcessWire bietet aber mit den &amp;#039;&amp;#039;&amp;#039;Language Alternate Fields&amp;#039;&amp;#039;&amp;#039; eine Möglichkeit solche Felder mehrsprachig zu nutzen. Dazu braucht man kein Modul. Es ist eine Basis Funktionalität.&lt;br /&gt;
&lt;br /&gt;
Dazu legt man für jede zusätzliche Sprache ein weiteres Feld mit dem selben Namen + der Namenserweiterung _sprachname an. Beispielsweise kann man für ein Feld Namens link ein weiteres Feld Namens &amp;#039;&amp;#039;&amp;#039;link_en&amp;#039;&amp;#039;&amp;#039; anlegen. Dann nutzt ProcessWire automatisch für die Sprache mit dem Namen &amp;#039;&amp;#039;&amp;#039;en&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&lt;br /&gt;
=== Multilanguage Page - Quickstart ===&lt;br /&gt;
&lt;br /&gt;
==== 1. Module ====&lt;br /&gt;
* s.o. alle benötigten installieren&lt;br /&gt;
&lt;br /&gt;
==== 2. Backend ====&lt;br /&gt;
* Default Sprache festlegen&lt;br /&gt;
** Wenn nicht Englisch Sprachpaket installieren&lt;br /&gt;
** Wenn der Titel der Sprache auch der Identifier für den html Tag sein soll muss er &amp;#039;&amp;#039;de, en, fi&amp;#039;&amp;#039;... lauten&lt;br /&gt;
* Weitere Sprachen hinzufügen. Für Englisch benötigt man kein Sprachpaket. Als Name am besten den offiziellen Code (de, en...) vergeben.&lt;br /&gt;
* Die Homepage entscheidet über den Pfad. Wenn Englisch z.B. unter www.meineSeite.com/en/seitenname/ erreichbar sein soll, dann muss für Englisch unter &amp;#039;&amp;#039;&amp;#039;Einstellung &amp;gt; Namen en&amp;#039;&amp;#039;&amp;#039; eingetragen werden.&lt;br /&gt;
* Alle Felder die Übersetzt werden sollen auf Multilanguage Felder umstellen&lt;br /&gt;
&lt;br /&gt;
==== 3. Templates ====&lt;br /&gt;
===== Lang Attribute =====&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;lang Attribut&amp;#039;&amp;#039;&amp;#039; sollte zur Sprache passen. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 1:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Mit der _x Funktion kann PW beliebige Strings in Templates übersetzten. PW findet diese automatisch.&lt;br /&gt;
_main.php (oder header..)&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?php echo _x(&amp;#039;en&amp;#039;, &amp;#039;HTML language code&amp;#039;); ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
Im &amp;#039;&amp;#039;&amp;#039;Backend&amp;#039;&amp;#039;&amp;#039; muss man zunächst für Englisch den &amp;#039;&amp;#039;&amp;#039;Sprachindex aufbauen&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; Englisch&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
Dann kann man nun in den &amp;#039;&amp;#039;&amp;#039;Spracheinstellungen Verwaltung &amp;gt; Sprachen &amp;gt; meineSprache&amp;#039;&amp;#039;&amp;#039; das Label &amp;#039;&amp;#039;HTML language code&amp;#039;&amp;#039; suchen und mit dem passenden lang tag ersetzen.&lt;br /&gt;
&lt;br /&gt;
Das Funktioniert auch mit beliebigen anderen Werten die man im Template hartkodiert hat.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 2:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Man kann auch den Language Title verwenden wenn dieser entsprechend vergeben wurde (en, de,...) . &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Nachteil:&amp;#039;&amp;#039;&amp;#039; Dann kann man aber den Titel nicht mehr frei verändern wenn man ihn auch als Bezeichnung für den Language Switcher nutezn möchte.&lt;br /&gt;
 &amp;lt;html lang=&amp;quot;&amp;lt;?= $user-&amp;gt;language-&amp;gt;title ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Möglichkeit 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Dies hat bei mir nicht funktioniert:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;? $lang = $pages-&amp;gt;get(1)-&amp;gt;getLanguageValue($user-&amp;gt;language, &amp;#039;name&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;&amp;lt;?php echo $lang ?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hier wird einfach der Name der Sprache die der Benutzer im Moment hat (Session) ausgegeben. Der Name der Sprache sollte im Backend entsprechend der Norm gewählt sein. (de, it, fi...). Problem war das man den Namen der default Sprache nicht vergeben kann.&lt;br /&gt;
&lt;br /&gt;
==== 4. Language Switcher ====&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Text Navigation&amp;#039;&amp;#039;&amp;#039; z.B. so:&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Textnavigation mit first/last etc. Klassen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;nav nav-h&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$n = $languages-&amp;gt;count();&lt;br /&gt;
$i = 0;&lt;br /&gt;
&lt;br /&gt;
$separator = &amp;#039;&amp;lt;span class=&amp;quot;separator&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
    $liClass = array();&lt;br /&gt;
    if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
    $i++;&lt;br /&gt;
    if( $i == 1 ) $liClass[] = &amp;quot;first&amp;quot;;&lt;br /&gt;
    if( $i == $n ) $liClass[] = &amp;quot;last&amp;quot;;&lt;br /&gt;
    if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) $liClass[] = &amp;#039;current&amp;#039;;&lt;br /&gt;
    echo &amp;#039;&amp;lt;li class=&amp;quot;&amp;#039;.implode(&amp;#039; &amp;#039;,$liClass).&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot; style=&amp;quot;text-transform:uppercase;&amp;quot;&amp;gt;&amp;#039;.$language-&amp;gt;title.&amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	if( $i &amp;lt; $n ) echo $separator;&lt;br /&gt;
    echo &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flaggennavi&amp;#039;&amp;#039;&amp;#039; z.B. so :&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;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-lang&amp;quot; class=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
foreach($languages as $language){&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
&lt;br /&gt;
		echo &amp;#039;&amp;lt;li class=&amp;quot;current&amp;quot; style=&amp;quot;opacity:0.5;&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;
	$flag = urls()-&amp;gt;templates.&amp;#039;assets/flag-&amp;#039;.$language-&amp;gt;name.&amp;#039;.png&amp;#039;;&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	echo &amp;#039;&amp;lt;a hreflang=&amp;quot;&amp;#039;.$hreflang.&amp;#039;&amp;quot; href=&amp;quot;&amp;#039;.$url.&amp;#039;&amp;quot;&amp;gt;&amp;lt;img class=&amp;quot;flag&amp;quot; src=&amp;quot;&amp;#039;.$flag.&amp;#039;&amp;quot; style=&amp;quot;width: 100px;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;;&lt;br /&gt;
	echo &amp;#039;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; Language Toggle Schiebeschalter &amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scss&amp;quot;&amp;gt;&lt;br /&gt;
#toggle-menu-desktop, #toggle-menu-mobile{&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
  }&lt;br /&gt;
  #toggle-menu-desktop{&lt;br /&gt;
    width: 100px;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-family: $ft-bold;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    line-height: 14px;&lt;br /&gt;
    letter-spacing: 0.05em;&lt;br /&gt;
    color: $blackgreen;&lt;br /&gt;
    margin-left: 30px;&lt;br /&gt;
  }&lt;br /&gt;
  #toggle-menu-mobile{&lt;br /&gt;
    width: 25px;&lt;br /&gt;
    padding-right: 17px;&lt;br /&gt;
  }&lt;br /&gt;
  #toggle-lang{&lt;br /&gt;
    width: 55px;&lt;br /&gt;
    margin-right: 0.5rem;&lt;br /&gt;
  }&lt;br /&gt;
  .langswitch-dark{&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
  .home-button {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    img{&lt;br /&gt;
      height: auto;&lt;br /&gt;
      width: 65px;&lt;br /&gt;
      margin-left: 55px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Prantner ===&lt;br /&gt;
Hauptnavigation mit Flaggen:&lt;br /&gt;
&lt;br /&gt;
language-switcher.inc &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$imgMarkup = &amp;quot;&amp;quot;;&lt;br /&gt;
$out = &amp;quot;&amp;quot;;&lt;br /&gt;
foreach($languages as $language) {&lt;br /&gt;
	if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
	$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
	$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
	$imgUrl = $config-&amp;gt;urls-&amp;gt;templates.&amp;#039;assets/flags/&amp;#039;.$language-&amp;gt;name.&amp;#039;_sq.png&amp;#039;;&lt;br /&gt;
	$imgMarkup = &amp;quot;&amp;lt;img src=\&amp;quot;$imgUrl\&amp;quot; title=\&amp;quot;$language-&amp;gt;title\&amp;quot; alt=\&amp;quot;$language-&amp;gt;title\&amp;quot; class=\&amp;quot;circle z-depth-1\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button current\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
		$out .= &amp;quot;&amp;lt;span class=\&amp;quot;lang-button\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;&amp;lt;a hreflang=\&amp;quot;$hreflang\&amp;quot; href=\&amp;quot;$url\&amp;quot;&amp;gt;$imgMarkup&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$out = &amp;#039;&amp;lt;div id=&amp;quot;nav-lang&amp;quot;&amp;gt;&amp;#039;.$out.&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
echo $out; &lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
language-switcher-mobile.inc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;ul id=&amp;quot;nav-mobile&amp;quot; class=&amp;quot;right hide-on-med-and-down&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
	foreach($languages as $language) {&lt;br /&gt;
		if(!$page-&amp;gt;viewable($language)) continue; // is page viewable in this language?&lt;br /&gt;
		if($language-&amp;gt;id == $user-&amp;gt;language-&amp;gt;id) {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li class=&amp;#039;current&amp;#039;&amp;gt;&amp;quot;;&lt;br /&gt;
		} else {&lt;br /&gt;
			echo &amp;quot;&amp;lt;li&amp;gt;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$url = $page-&amp;gt;localUrl($language);&lt;br /&gt;
		$hreflang = $homepage-&amp;gt;getLanguageValue($language, &amp;#039;name&amp;#039;);&lt;br /&gt;
		echo &amp;quot;&amp;lt;a hreflang=&amp;#039;$hreflang&amp;#039; href=&amp;#039;$url&amp;#039;&amp;gt;$language-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Language Snippets ==&lt;br /&gt;
=== URL der Sprache ===&lt;br /&gt;
 getLanguageValue($language-&amp;gt;id, &amp;#039;url&amp;#039;);&lt;br /&gt;
 $page-&amp;gt;localHttpUrl($language-&amp;gt;id); &lt;br /&gt;
 $page-&amp;gt;localUrl($language-&amp;gt;id);&lt;br /&gt;
&lt;br /&gt;
=== Field Label in aktueller Sprache ===&lt;br /&gt;
 fields($f)-&amp;gt;getLabel()&lt;br /&gt;
Wobei $f ein Feldname sein kann aber auch ein Feldobjekt.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27281</id>
		<title>ProcessWire - OAuth Anmeldung über Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27281"/>
		<updated>2025-03-17T10:49:01Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
# App bei EntraID registrieren&lt;br /&gt;
## Anwendungen&lt;br /&gt;
## ID und Secret werden in der Anwendung benötigt&lt;br /&gt;
## Urls festlegen (Redirect URL / Logout URL)&lt;br /&gt;
# User Template von ProcessWire erweitern. E-Mail und Passwort allein reicht nicht wir gleichen ab anhand:&lt;br /&gt;
## firstname&lt;br /&gt;
## lastname&lt;br /&gt;
## email (bereits vorhanden)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches Vorgehen ==&lt;br /&gt;
&lt;br /&gt;
    Azure App-Registrierung&lt;br /&gt;
        Lege in der Azure App-Registrierung (Azure Active Directory) eine neue Anwendung an.&lt;br /&gt;
        Richte die Umleitungs-URL (Redirect URI) ein, die später auf deine ProcessWire-Instanz zeigt (z. B. https://deinedomain.de/oauth/callback).&lt;br /&gt;
        Notiere dir Client-ID und Client-Secret.&lt;br /&gt;
&lt;br /&gt;
    Authentifizierungsprotokoll auswählen&lt;br /&gt;
        Microsoft Azure AD unterstützt sowohl OAuth2 als auch SAML.&lt;br /&gt;
        Für die meisten Webanwendungen empfiehlt sich die OAuth2 / OpenID Connect-Variante. Damit erhält man später ein JWT (ID-Token bzw. Access-Token), das man in ProcessWire verifizieren kann.&lt;br /&gt;
&lt;br /&gt;
    Custom Module oder Integration in ProcessWire&lt;br /&gt;
        Baue (oder nutze) ein eigenes ProcessWire-Modul, das sich um den OAuth-Flow kümmert. Typischerweise wird dazu nach Microsoft weitergeleitet (Login), und nach Erfolg wird man an die in Azure eingestellte Redirect-URL zurückgeleitet.&lt;br /&gt;
        Im Modul muss das ID-Token (oder Access Token) validiert werden. Anschließend wird der Benutzer in ProcessWire identifiziert (z. B. anhand der E-Mail-Adresse).&lt;br /&gt;
&lt;br /&gt;
    Benutzer-/Rollenverwaltung&lt;br /&gt;
        Bei erfolgreicher Anmeldung musst du entscheiden, ob ein ProcessWire-Benutzer angelegt wird, falls er noch nicht existiert, oder ob nur bestehende User eingelassen werden.&lt;br /&gt;
        Ggfs. kannst du auch eine automatische Rollenzuordnung (z. B. role=editor oder role=client) machen, falls du anhand der Azure-AD-Gruppen oder der Domain („@meineDomain.com“) unterscheiden möchtest.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27280</id>
		<title>ProcessWire - OAuth Anmeldung über Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27280"/>
		<updated>2025-03-17T08:12:32Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
# App bei EntraID registrieren&lt;br /&gt;
## Anwendungen&lt;br /&gt;
## ID und Secret werden in der Anwendung benötigt&lt;br /&gt;
&lt;br /&gt;
== Grundsätzliches Vorgehen ==&lt;br /&gt;
&lt;br /&gt;
    Azure App-Registrierung&lt;br /&gt;
        Lege in der Azure App-Registrierung (Azure Active Directory) eine neue Anwendung an.&lt;br /&gt;
        Richte die Umleitungs-URL (Redirect URI) ein, die später auf deine ProcessWire-Instanz zeigt (z. B. https://deinedomain.de/oauth/callback).&lt;br /&gt;
        Notiere dir Client-ID und Client-Secret.&lt;br /&gt;
&lt;br /&gt;
    Authentifizierungsprotokoll auswählen&lt;br /&gt;
        Microsoft Azure AD unterstützt sowohl OAuth2 als auch SAML.&lt;br /&gt;
        Für die meisten Webanwendungen empfiehlt sich die OAuth2 / OpenID Connect-Variante. Damit erhält man später ein JWT (ID-Token bzw. Access-Token), das man in ProcessWire verifizieren kann.&lt;br /&gt;
&lt;br /&gt;
    Custom Module oder Integration in ProcessWire&lt;br /&gt;
        Baue (oder nutze) ein eigenes ProcessWire-Modul, das sich um den OAuth-Flow kümmert. Typischerweise wird dazu nach Microsoft weitergeleitet (Login), und nach Erfolg wird man an die in Azure eingestellte Redirect-URL zurückgeleitet.&lt;br /&gt;
        Im Modul muss das ID-Token (oder Access Token) validiert werden. Anschließend wird der Benutzer in ProcessWire identifiziert (z. B. anhand der E-Mail-Adresse).&lt;br /&gt;
&lt;br /&gt;
    Benutzer-/Rollenverwaltung&lt;br /&gt;
        Bei erfolgreicher Anmeldung musst du entscheiden, ob ein ProcessWire-Benutzer angelegt wird, falls er noch nicht existiert, oder ob nur bestehende User eingelassen werden.&lt;br /&gt;
        Ggfs. kannst du auch eine automatische Rollenzuordnung (z. B. role=editor oder role=client) machen, falls du anhand der Azure-AD-Gruppen oder der Domain („@meineDomain.com“) unterscheiden möchtest.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27279</id>
		<title>ProcessWire - OAuth Anmeldung über Microsoft365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_OAuth_Anmeldung_%C3%BCber_Microsoft365&amp;diff=27279"/>
		<updated>2025-03-17T07:53:01Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: Die Seite wurde neu angelegt: „== Quickstart == # App bei EntraID registrieren ## Anwendungen ## ID und Secret werden in der Anwendung benötigt“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
# App bei EntraID registrieren&lt;br /&gt;
## Anwendungen&lt;br /&gt;
## ID und Secret werden in der Anwendung benötigt&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27278</id>
		<title>Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27278"/>
		<updated>2025-03-17T07:17:47Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Suche dienen.&lt;br /&gt;
&lt;br /&gt;
== Office auf dem Desktop installieren ==&lt;br /&gt;
Die Downloads sind oft schwer zu finden. &lt;br /&gt;
&lt;br /&gt;
Hier geht es Stand März 2025: &lt;br /&gt;
* Einloggen auf https://www.microsoft365.com&lt;br /&gt;
* Home-Seite&lt;br /&gt;
* Oben rechts &amp;quot;Installieren und mehr&amp;quot; Button&lt;br /&gt;
&lt;br /&gt;
== Was ist was ==&lt;br /&gt;
=== Admin Center ===&lt;br /&gt;
Zentrale Verwaltung, Billing, Benutzerverwaltung&lt;br /&gt;
&lt;br /&gt;
=== Purview ===&lt;br /&gt;
Compliance Center&lt;br /&gt;
&lt;br /&gt;
=== Azure / Entra ===&lt;br /&gt;
Azure AD heißt jetzt Entra. &lt;br /&gt;
&lt;br /&gt;
=== Exchange ===&lt;br /&gt;
Postfächer etc.&lt;br /&gt;
&lt;br /&gt;
=== Defender ===&lt;br /&gt;
Bedrohungen analysieren und reagieren&lt;br /&gt;
&lt;br /&gt;
== Anmeldung ==&lt;br /&gt;
 https://learn.microsoft.com/de-de/entra/identity/authentication/concept-authentication-methods - Einstieg&lt;br /&gt;
 https://mysignins.microsoft.com/security-info // Self-Service Einstellungen&lt;br /&gt;
&lt;br /&gt;
=== Mehrstufige Authentifizierung (MFA) ===&lt;br /&gt;
 https://www.youtube.com/watch?v=qNndxl7gqVM&lt;br /&gt;
 https://aka.ms/MFASetup - Benutzerregistrierung&lt;br /&gt;
 https://go.microsoft.com/fwlink/?LinkId=627442 Handbuch&lt;br /&gt;
==== Telefon und E-Mail als Administrator festlegen ====&lt;br /&gt;
Entra Portal &amp;gt; Benutzer &amp;gt; B&lt;br /&gt;
=== Bedingter Zugriff ===&lt;br /&gt;
=== Kombinierte Anmeldung ===&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
MFA wird erzwungen, obwohl sie deaktiviert ist.&lt;br /&gt;
Mögliche Gründe:&lt;br /&gt;
* Single Sign On&lt;br /&gt;
* Richtlinien für bedingten Zugriff - in Azure können extra Richtlinien unter bestimmten Bedingungen definiert sein (z.b. Anmeldung außerhalb des Unternehmensnetzwerks).&lt;br /&gt;
* Residuale Situationen (alte Richtlinien)&lt;br /&gt;
* Sicherheits (Compliance) Anforderungen Azure / Entra&lt;br /&gt;
&lt;br /&gt;
== OAuth Anmeldung von externer App nutzen ==&lt;br /&gt;
Generell kann man externe kann man User externer Anwendungen anmelden. Dazu muss man eine App in EntraID registrieren.&lt;br /&gt;
=== ProcessWire User über OAuth ===&lt;br /&gt;
[[ProcessWire - OAuth Anmeldung über Microsoft365]]&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27277</id>
		<title>Microsoft 365</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Microsoft_365&amp;diff=27277"/>
		<updated>2025-03-14T08:51:24Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quickstart ==&lt;br /&gt;
In 2023/2024 hat Microsoft die meisten Dienste unter dem Terminus Microsoft 365 zusammengefasst. Diese Seite soll als Startpunkt für die Suche dienen.&lt;br /&gt;
&lt;br /&gt;
== Office auf dem Desktop installieren ==&lt;br /&gt;
Die Downloads sind oft schwer zu finden. &lt;br /&gt;
&lt;br /&gt;
Hier geht es Stand März 2025: &lt;br /&gt;
* Einloggen auf https://www.microsoft365.com&lt;br /&gt;
* Home-Seite&lt;br /&gt;
* Oben rechts &amp;quot;Installieren und mehr&amp;quot; Button&lt;br /&gt;
&lt;br /&gt;
== Was ist was ==&lt;br /&gt;
=== Admin Center ===&lt;br /&gt;
Zentrale Verwaltung, Billing, Benutzerverwaltung&lt;br /&gt;
&lt;br /&gt;
=== Purview ===&lt;br /&gt;
Compliance Center&lt;br /&gt;
&lt;br /&gt;
=== Azure / Entra ===&lt;br /&gt;
Azure AD heißt jetzt Entra. &lt;br /&gt;
&lt;br /&gt;
=== Exchange ===&lt;br /&gt;
Postfächer etc.&lt;br /&gt;
&lt;br /&gt;
=== Defender ===&lt;br /&gt;
Bedrohungen analysieren und reagieren&lt;br /&gt;
&lt;br /&gt;
== Anmeldung ==&lt;br /&gt;
 https://learn.microsoft.com/de-de/entra/identity/authentication/concept-authentication-methods - Einstieg&lt;br /&gt;
 https://mysignins.microsoft.com/security-info // Self-Service Einstellungen&lt;br /&gt;
&lt;br /&gt;
=== Mehrstufige Authentifizierung (MFA) ===&lt;br /&gt;
 https://www.youtube.com/watch?v=qNndxl7gqVM&lt;br /&gt;
 https://aka.ms/MFASetup - Benutzerregistrierung&lt;br /&gt;
 https://go.microsoft.com/fwlink/?LinkId=627442 Handbuch&lt;br /&gt;
==== Telefon und E-Mail als Administrator festlegen ====&lt;br /&gt;
Entra Portal &amp;gt; Benutzer &amp;gt; B&lt;br /&gt;
=== Bedingter Zugriff ===&lt;br /&gt;
=== Kombinierte Anmeldung ===&lt;br /&gt;
Todo&lt;br /&gt;
&lt;br /&gt;
=== Probleme ===&lt;br /&gt;
MFA wird erzwungen, obwohl sie deaktiviert ist.&lt;br /&gt;
Mögliche Gründe:&lt;br /&gt;
* Single Sign On&lt;br /&gt;
* Richtlinien für bedingten Zugriff - in Azure können extra Richtlinien unter bestimmten Bedingungen definiert sein (z.b. Anmeldung außerhalb des Unternehmensnetzwerks).&lt;br /&gt;
* Residuale Situationen (alte Richtlinien)&lt;br /&gt;
* Sicherheits (Compliance) Anforderungen Azure / Entra&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=27276</id>
		<title>ProcessWire - Navigation Snippets</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Navigation_Snippets&amp;diff=27276"/>
		<updated>2025-03-07T11:58:26Z</updated>

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

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

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der TinyMCE Editor ist der Nachfolger des CKE Editor. Er läßt sich deutlich leichter modifizieren.&lt;br /&gt;
&lt;br /&gt;
Styles lassen sich in den Moduleinstellungen anpassen:&lt;br /&gt;
&lt;br /&gt;
Beispiel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Extras h5.accordion { } /* Accordion item heading */&lt;br /&gt;
#Extras h6 { } /* Tab item heading */&lt;br /&gt;
#Extras hr.stop { } /* Stop tabs or accordions */&lt;br /&gt;
#Blocks uk-text-lead {font-size: 1.5em } /* Lead text */&lt;br /&gt;
#Blocks .uk-text-meta { font-size: 14px; color: #999 } /* Meta text */&lt;br /&gt;
#Blocks .uk-text-small { font-size: 14px; } /* Small text */ #Uikit .uk-text-muted { color: #999; } /* Muted text */&lt;br /&gt;
#Inline span.red-text { color: red; } /* Red Text */&lt;br /&gt;
#Blocks p.outline { padding: 20px; border: 1px dotted #ccc; } /* Outline paragraph&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei #Blocks für den Menübereich steht und der Kommentar für das /* Label */&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=27273</id>
		<title>ProcessWire - TinyMCE Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_TinyMCE_Editor&amp;diff=27273"/>
		<updated>2025-03-03T16:53:50Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: Die Seite wurde neu angelegt: „Der TinyMCE Editor ist der Nachfolger des CKE Editor. Er läßt sich deutlich leichter modifizieren.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der TinyMCE Editor ist der Nachfolger des CKE Editor. Er läßt sich deutlich leichter modifizieren.&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=27272</id>
		<title>ProcessWire - Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Editor&amp;diff=27272"/>
		<updated>2025-03-03T16:52:40Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel bezieht sich auf den alten CKEditor. In neueren Versionen wird der TinyMCE Editor verwendet.&lt;br /&gt;
&lt;br /&gt;
[[ProcessWire - TinyMCE Editor]]&lt;br /&gt;
&lt;br /&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;
&lt;br /&gt;
Suchbegriffe: CKEditor Bilder max 1200&lt;br /&gt;
&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>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Installation&amp;diff=27271</id>
		<title>ProcessWire - Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Installation&amp;diff=27271"/>
		<updated>2025-03-01T11:42:15Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Datenbankfehler  COLLATION &amp;#039;utf8_general_ci&amp;#039; is not valid for CHARACTER SET &amp;#039;utf8mb4&amp;#039; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Probleme beim Installieren beheben ==&lt;br /&gt;
&lt;br /&gt;
=== 500 Internal Server Error ===&lt;br /&gt;
Häufigstes Problem ist ein &amp;#039;&amp;#039;&amp;#039;500er Fehler sobald man Unterseiten aufruft&amp;#039;&amp;#039;&amp;#039;. Die Starseite funktioniert aber. In dem Fall müssen die Optionen 19 und 20 in der htaccess angepasst werden (s.u.) Tritt z.B. beim Weiland Hosting auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # 19. Pass control to ProcessWire if all the above directives allow us to this point.&lt;br /&gt;
  # For regular VirtualHosts (most installs)&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # RewriteRule ^(.*)$ index.php?it=$1 [L,QSA]&lt;br /&gt;
&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # 20. If using VirtualDocumentRoot (500 NOTE): comment out the one above and use this one instead&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  RewriteRule ^(.*)$ /index.php?it=$1 [L,QSA]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Filecache und Modulcache leeren ===&lt;br /&gt;
Wenn man die Daten pur auf den Server spielt kann es beim Cachning zu Problemen kommen. Auch hier kann ein 500er Fehler auftauchen.&lt;br /&gt;
&lt;br /&gt;
Wenn auch das nichts hilft einfach alles nochmal hochspielen.&lt;br /&gt;
Inkl. Datenbank /wire /site&lt;br /&gt;
&lt;br /&gt;
=== Datenbankfehler  COLLATION &amp;#039;utf8_general_ci&amp;#039; is not valid for CHARACTER SET &amp;#039;utf8mb4&amp;#039; ===&lt;br /&gt;
 SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION &amp;#039;utf8_general_ci&amp;#039; is not valid for CHARACTER SET &amp;#039;utf8mb4&amp;#039;&lt;br /&gt;
tritt auf wenn die Voreinstellung der Datenbank nicht passt. &lt;br /&gt;
&lt;br /&gt;
Lösung: Im Installer DB Charset auf utf-8 umstellen.&lt;br /&gt;
&lt;br /&gt;
== Installation in Unterordner ==&lt;br /&gt;
You should uncomment this line in .htaccess and change &amp;quot;pw&amp;quot; to the name of your folder&lt;br /&gt;
 RewriteBase /pw/&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Installation&amp;diff=27270</id>
		<title>ProcessWire - Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Installation&amp;diff=27270"/>
		<updated>2025-03-01T11:28:26Z</updated>

		<summary type="html">&lt;p&gt;109.193.152.88: /* Probleme beim Installieren beheben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Probleme beim Installieren beheben ==&lt;br /&gt;
&lt;br /&gt;
=== 500 Internal Server Error ===&lt;br /&gt;
Häufigstes Problem ist ein &amp;#039;&amp;#039;&amp;#039;500er Fehler sobald man Unterseiten aufruft&amp;#039;&amp;#039;&amp;#039;. Die Starseite funktioniert aber. In dem Fall müssen die Optionen 19 und 20 in der htaccess angepasst werden (s.u.) Tritt z.B. beim Weiland Hosting auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # 19. Pass control to ProcessWire if all the above directives allow us to this point.&lt;br /&gt;
  # For regular VirtualHosts (most installs)&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # RewriteRule ^(.*)$ index.php?it=$1 [L,QSA]&lt;br /&gt;
&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  # 20. If using VirtualDocumentRoot (500 NOTE): comment out the one above and use this one instead&lt;br /&gt;
  # -----------------------------------------------------------------------------------------------&lt;br /&gt;
  RewriteRule ^(.*)$ /index.php?it=$1 [L,QSA]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Filecache und Modulcache leeren ===&lt;br /&gt;
Wenn man die Daten pur auf den Server spielt kann es beim Cachning zu Problemen kommen. Auch hier kann ein 500er Fehler auftauchen.&lt;br /&gt;
&lt;br /&gt;
Wenn auch das nichts hilft einfach alles nochmal hochspielen.&lt;br /&gt;
Inkl. Datenbank /wire /site&lt;br /&gt;
&lt;br /&gt;
=== Datenbankfehler  COLLATION &amp;#039;utf8_general_ci&amp;#039; is not valid for CHARACTER SET &amp;#039;utf8mb4&amp;#039; ===&lt;br /&gt;
 SQLSTATE[42000]: Syntax error or access violation: 1253 COLLATION &amp;#039;utf8_general_ci&amp;#039; is not valid for CHARACTER SET &amp;#039;utf8mb4&amp;#039;&lt;br /&gt;
tritt auf wenn die Voreinstellung der Datenbank nicht passt. &lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
&lt;br /&gt;
== Installation in Unterordner ==&lt;br /&gt;
You should uncomment this line in .htaccess and change &amp;quot;pw&amp;quot; to the name of your folder&lt;br /&gt;
 RewriteBase /pw/&lt;/div&gt;</summary>
		<author><name>109.193.152.88</name></author>
	</entry>
</feed>