<?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=93.208.103.149</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=93.208.103.149"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/93.208.103.149"/>
	<updated>2026-05-06T17:04:06Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Gro%C3%9Fe_csv_Dateien_mit_Importieren_(PHP)&amp;diff=23733</id>
		<title>Große csv Dateien mit Importieren (PHP)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Gro%C3%9Fe_csv_Dateien_mit_Importieren_(PHP)&amp;diff=23733"/>
		<updated>2019-03-04T09:01:58Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* CSV Zeilenweise einlesen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Probleme bei großen csv Dateien&lt;br /&gt;
&lt;br /&gt;
* Memory Overflow&lt;br /&gt;
* Timeout&lt;br /&gt;
&lt;br /&gt;
Timeouts lassen sich mit folgenden Strategien vermeiden:&lt;br /&gt;
# Aufgeteilter Import &lt;br /&gt;
# Effizienter Code&lt;br /&gt;
# PHP von der Console (z.B. via Cronjob) starten&lt;br /&gt;
&lt;br /&gt;
Memory Overflows lassen sich so verhindern: &lt;br /&gt;
# Nicht alle Datensätze in den Speicher laden (z.B. nicht in ein Array)&lt;br /&gt;
# Stattdessen Zeilenweise oder in Häppchen verarbeiten (dauert halt länger)&lt;br /&gt;
&lt;br /&gt;
Lösungsansätze in der Praxis&lt;br /&gt;
&lt;br /&gt;
== CSV direkt via MySQL Statement importieren ==&lt;br /&gt;
https://stackoverflow.com/questions/7318768/process-very-big-csv-file-without-timeout-and-memory-error&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$sql = &amp;quot;LOAD DATA LOCAL INFILE &amp;#039;/path/to/file.csv&amp;#039; &lt;br /&gt;
  REPLACE INTO TABLE table_name FIELDS TERMINATED BY &amp;#039;,&amp;#039; &lt;br /&gt;
  ENCLOSED BY &amp;#039;\&amp;quot;&amp;#039; LINES TERMINATED BY &amp;#039;\r\n&amp;#039; IGNORE 1 LINES&amp;quot;;&lt;br /&gt;
$result = $mysqli-&amp;gt;query($sql);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Beispiel (ProcessWire) ===&lt;br /&gt;
Bei fast 30.000 Datensätzen ging der Import hier nur wenige ms!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$table = &amp;#039;dekra_plz&amp;#039;;&lt;br /&gt;
	if(wire()-&amp;gt;db-&amp;gt;query(&amp;quot;SHOW TABLES LIKE &amp;#039;$table&amp;#039;&amp;quot;)-&amp;gt;num_rows &amp;lt; 1){ // no table ?&lt;br /&gt;
		$messageQueue[] = &amp;quot;Create Table $table&amp;quot;;&lt;br /&gt;
		// create...&lt;br /&gt;
		$sql = &amp;quot;CREATE TABLE $table (&lt;br /&gt;
			plz varchar(16) NOT NULL,&lt;br /&gt;
			akz VARCHAR(8),&lt;br /&gt;
			bl_id int(4) UNSIGNED NOT NULL,&lt;br /&gt;
			nl_id int(4) UNSIGNED NOT NULL,&lt;br /&gt;
			as_id int(4) UNSIGNED NOT NULL,&lt;br /&gt;
			gsg_id int(4) UNSIGNED NOT NULL)&amp;quot;;&lt;br /&gt;
		$result = wire()-&amp;gt;db-&amp;gt;query($sql);&lt;br /&gt;
	}&lt;br /&gt;
$sql = &amp;quot;LOAD DATA LOCAL INFILE &amp;#039;data/plz.csv&amp;#039;&lt;br /&gt;
	REPLACE INTO TABLE $table&lt;br /&gt;
	FIELDS TERMINATED BY &amp;#039;;&amp;#039;&lt;br /&gt;
	ENCLOSED BY &amp;#039;\&amp;quot;&amp;#039;&lt;br /&gt;
	LINES TERMINATED BY &amp;#039;\r\n&amp;#039;&lt;br /&gt;
	IGNORE 1 LINES&amp;quot;;&lt;br /&gt;
$result = wire()-&amp;gt;db-&amp;gt;query($sql);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CSV Zeilenweise einlesen ==&lt;br /&gt;
 https://stackoverflow.com/questions/7318768/process-very-big-csv-file-without-timeout-and-memory-error&lt;br /&gt;
&lt;br /&gt;
I&amp;#039;ve used fgetcsv to read a 120MB csv in a stream-wise-manner (is that correct english?). That reads in line by line and then I&amp;#039;ve inserted every line into a database. That way only one line is hold in memory on each iteration. The script still needed 20 min. to run. Maybe I try Python next time… Don&amp;#039;t try to load a huge csv-file into an array, that really would consume a lot of memory.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// WDI_GDF_Data.csv (120.4MB) are the World Bank collection of development indicators:&lt;br /&gt;
// http://data.worldbank.org/data-catalog/world-development-indicators&lt;br /&gt;
if(($handle = fopen(&amp;#039;WDI_GDF_Data.csv&amp;#039;, &amp;#039;r&amp;#039;)) !== false)&lt;br /&gt;
{&lt;br /&gt;
    // get the first row, which contains the column-titles (if necessary)&lt;br /&gt;
    $header = fgetcsv($handle);&lt;br /&gt;
&lt;br /&gt;
    // loop through the file line-by-line&lt;br /&gt;
    while(($data = fgetcsv($handle)) !== false)&lt;br /&gt;
    {&lt;br /&gt;
        // resort/rewrite data and insert into DB here&lt;br /&gt;
        // try to use conditions sparingly here, as those will cause slow-performance&lt;br /&gt;
&lt;br /&gt;
        // I don&amp;#039;t know if this is really necessary, but it couldn&amp;#039;t harm;&lt;br /&gt;
        // see also: http://php.net/manual/en/features.gc.php&lt;br /&gt;
        unset($data);&lt;br /&gt;
    }&lt;br /&gt;
    fclose($handle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23732</id>
		<title>XAMPP auf MacOS installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23732"/>
		<updated>2019-03-03T17:15:15Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* phpmyadmin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
Als praktisch hat es sich erwiesen die eigenen Projekte nicht in htdocs abzulegen. Dann muss man beim Update nicht alles kopieren. Das geht auch ohne virtuelle Server o.ä. Einfach einen Symlink www in htdocs anlegen, der dann auf das eigentliche Webverzeichnis, das man nach Wahl anlegen kann, zeigt.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
=== DMG Archiv normal installieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP&amp;#039;&amp;#039;&amp;#039; konfigurieren&lt;br /&gt;
* etc/php.ini anpassen (mehr execution time und memory)&lt;br /&gt;
&lt;br /&gt;
Webverzeichnes &amp;#039;&amp;#039;&amp;#039;www&amp;#039;&amp;#039;&amp;#039; außerhalb von htdocs.&lt;br /&gt;
&lt;br /&gt;
* Ordner www z.B. in User Verzeichnis erstellen&lt;br /&gt;
* Symlink auf diesen im htdocs Ordner auf dieses Verzeichnis.&lt;br /&gt;
* Evtl. Dateirechte anpassen&lt;br /&gt;
&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
* User und Passwort vergeben (Mit -p Parameter aber Passwort leerlassen. Sonst nimmt er evtl. automatisch das Admin Passwort. Hinweis MariaDB ist der Nachfolger von mySQL. Das Ganze sieht etwa so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /Applications/XAMPP/xampfiles/bin&lt;br /&gt;
sudo su&lt;br /&gt;
./mysql -u root -p&lt;br /&gt;
MariaDB [(none)]&amp;gt; use mysql&lt;br /&gt;
Database changed&lt;br /&gt;
MariaDB [mysql]&amp;gt; update user set Password=password(&amp;#039;meinRootPasswort&amp;#039;) where user=&amp;#039;root&amp;#039;;&lt;br /&gt;
Query OK, 3 rows affected (0,01 sec)&lt;br /&gt;
Rows matched: 3  Changed: 3  Warnings: 0&lt;br /&gt;
MariaDB [mysql]&amp;gt; flush privileges;&lt;br /&gt;
Query OK, 0 rows affected (0,01 sec)&lt;br /&gt;
MariaDB [mysql]&amp;gt; quit&lt;br /&gt;
Bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;mySql Server neu starten.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Besseren User für XAMPP setzen ===&lt;br /&gt;
&lt;br /&gt;
* Standardmäßig ist das &lt;br /&gt;
 deamon:deamon (Gruppe:Owner) &lt;br /&gt;
Die gibt es eigentlich nicht. Sinnvoll wäre vielleicht den eigenen User zu nehmen (meinuser:staff). Dann muss man im Entwicklungsprozess wenig Dateirechte anpassen, wenn php Dateien anlegt (natürlich nur auf dem lokalen Entwicklungsserver). Oder man richtet einen eigenen User dafür ein. Vorgehe siehe unten bei &amp;#039;&amp;#039;&amp;#039;User&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== phpmyadmin ===&lt;br /&gt;
* /Applications/XAMPP/phpMyAdmin für neues mySQL Passwort einrichten (&amp;#039;&amp;#039;&amp;#039;xamppfiles/phpmyadmin/config.inc.php&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
 $cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;meinRootPasswort&amp;#039;;&lt;br /&gt;
* Evtl. Template &amp;#039;&amp;#039;&amp;#039;Fehler in phpmyadmin&amp;#039;&amp;#039;&amp;#039; beseitigen &lt;br /&gt;
 Auf das $cfg[&amp;#039;TempDir&amp;#039;] (./tmp/) kann nicht zugegriffen werden. PhpMyAdmin kann keine Templates zwischenspeichern und ist daher langsam.&lt;br /&gt;
Dazu in &lt;br /&gt;
 /xamppfiles/phpmyadmin &lt;br /&gt;
den Ordner tmp anlegen und die Rechte auf den Apache User legen (siehe oben). Oder zur Not für alle auf lesen und schreiben setzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechte im Webverzeichnis ===&lt;br /&gt;
Wenn du die Gruppe und den Owner des Apache auf deinen User gesetzt hast, kann man einfach:&lt;br /&gt;
 sudo chown -R meinUserName:staff /Applications/XAMPP/htdocs/&lt;br /&gt;
ausführen. Pfad muss natürlich zu deinem Webverzeichnis führen.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Datenbanken sichern (phpmyadmin oder mysqldump)&lt;br /&gt;
* Neues XAMPP installieren&lt;br /&gt;
* Datenbanken zurückspielen (nur die Projekte, nicht mysql und phpmyadmin etc.)&lt;br /&gt;
* Einrichten wie oben&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt XAMPP ==&lt;br /&gt;
Dies kann man erfahren oder auch ändern in:&lt;br /&gt;
&lt;br /&gt;
 In /Applications/XAMPP/xamppfiles/etc/httpd.conf change&lt;br /&gt;
und ist in meinem Fall (7.1 und 7.2)&lt;br /&gt;
 User daemon&lt;br /&gt;
 Group daemon&lt;br /&gt;
&lt;br /&gt;
Ich hatte allerdings danach Probleme mit den Rechten von mysql. Da müsste man mal noch genau checken welche weiteren Anpassungen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt der vorinstallierte Apache auf MacOs ? ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;BE CAREFUL IF CHANGING THIS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;_www user/group is the default for OS X&amp;#039;&amp;#039;&amp;#039;. If you want to run the server as root you&amp;#039;ll need to change this to the appropriate user. For root:&lt;br /&gt;
&lt;br /&gt;
 User root&lt;br /&gt;
 Group wheel&lt;br /&gt;
oder&lt;br /&gt;
 User [meinUserName]&lt;br /&gt;
 Group staff&lt;br /&gt;
Deinen Usernamen bekommst du im Terminal mit &lt;br /&gt;
 whoami&lt;br /&gt;
staff ist die User Standardgruppe auf dem Mac&lt;br /&gt;
&lt;br /&gt;
The plist that describes the Apache service to launchd is at /System/Library/LaunchDaemons/org.apache.httpd.plist -- OS X runs any launchd runs daemons described in this location as root so the server starts with sufficient privledges to change context to another user.&lt;br /&gt;
&lt;br /&gt;
Once you&amp;#039;ve made the changes, restart Apache with:&lt;br /&gt;
&lt;br /&gt;
 sudo /usr/sbin/apachectl restart&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23731</id>
		<title>XAMPP auf MacOS installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23731"/>
		<updated>2019-03-03T17:11:34Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Besseren User für XAMPP setzen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
Als praktisch hat es sich erwiesen die eigenen Projekte nicht in htdocs abzulegen. Dann muss man beim Update nicht alles kopieren. Das geht auch ohne virtuelle Server o.ä. Einfach einen Symlink www in htdocs anlegen, der dann auf das eigentliche Webverzeichnis, das man nach Wahl anlegen kann, zeigt.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
=== DMG Archiv normal installieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP&amp;#039;&amp;#039;&amp;#039; konfigurieren&lt;br /&gt;
* etc/php.ini anpassen (mehr execution time und memory)&lt;br /&gt;
&lt;br /&gt;
Webverzeichnes &amp;#039;&amp;#039;&amp;#039;www&amp;#039;&amp;#039;&amp;#039; außerhalb von htdocs.&lt;br /&gt;
&lt;br /&gt;
* Ordner www z.B. in User Verzeichnis erstellen&lt;br /&gt;
* Symlink auf diesen im htdocs Ordner auf dieses Verzeichnis.&lt;br /&gt;
* Evtl. Dateirechte anpassen&lt;br /&gt;
&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
* User und Passwort vergeben (Mit -p Parameter aber Passwort leerlassen. Sonst nimmt er evtl. automatisch das Admin Passwort. Hinweis MariaDB ist der Nachfolger von mySQL. Das Ganze sieht etwa so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /Applications/XAMPP/xampfiles/bin&lt;br /&gt;
sudo su&lt;br /&gt;
./mysql -u root -p&lt;br /&gt;
MariaDB [(none)]&amp;gt; use mysql&lt;br /&gt;
Database changed&lt;br /&gt;
MariaDB [mysql]&amp;gt; update user set Password=password(&amp;#039;meinRootPasswort&amp;#039;) where user=&amp;#039;root&amp;#039;;&lt;br /&gt;
Query OK, 3 rows affected (0,01 sec)&lt;br /&gt;
Rows matched: 3  Changed: 3  Warnings: 0&lt;br /&gt;
MariaDB [mysql]&amp;gt; flush privileges;&lt;br /&gt;
Query OK, 0 rows affected (0,01 sec)&lt;br /&gt;
MariaDB [mysql]&amp;gt; quit&lt;br /&gt;
Bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;mySql Server neu starten.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Besseren User für XAMPP setzen ===&lt;br /&gt;
&lt;br /&gt;
* Standardmäßig ist das &lt;br /&gt;
 deamon:deamon (Gruppe:Owner) &lt;br /&gt;
Die gibt es eigentlich nicht. Sinnvoll wäre vielleicht den eigenen User zu nehmen (meinuser:staff). Dann muss man im Entwicklungsprozess wenig Dateirechte anpassen, wenn php Dateien anlegt (natürlich nur auf dem lokalen Entwicklungsserver). Oder man richtet einen eigenen User dafür ein. Vorgehe siehe unten bei &amp;#039;&amp;#039;&amp;#039;User&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== phpmyadmin ===&lt;br /&gt;
* /Applications/XAMPP/phpMyAdmin für neues mySQL Passwort einrichten (&amp;#039;&amp;#039;&amp;#039;xamppfiles/phpmyadmin/config.inc.php&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
 $cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;meinRootPasswort&amp;#039;;&lt;br /&gt;
* Evtl. Template Fehler in &amp;#039;&amp;#039;&amp;#039;phpmyadmin&amp;#039;&amp;#039;&amp;#039; beseitigen &lt;br /&gt;
 Auf das $cfg[&amp;#039;TempDir&amp;#039;] (./tmp/) kann nicht zugegriffen werden. PhpMyAdmin kann keine Templates zwischenspeichern und ist daher langsam.&lt;br /&gt;
Dazu in /xamppfiles/phpmyadmin den Ordner tmp anlegen und die Rechte auf den Apache User legen (siehe oben). Oder zur Not für alle auf lesen und schreiben setzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechte im Webverzeichnis ===&lt;br /&gt;
Wenn du die Gruppe und den Owner des Apache auf deinen User gesetzt hast, kann man einfach:&lt;br /&gt;
 sudo chown -R meinUserName:staff /Applications/XAMPP/htdocs/&lt;br /&gt;
ausführen. Pfad muss natürlich zu deinem Webverzeichnis führen.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Datenbanken sichern (phpmyadmin oder mysqldump)&lt;br /&gt;
* Neues XAMPP installieren&lt;br /&gt;
* Datenbanken zurückspielen (nur die Projekte, nicht mysql und phpmyadmin etc.)&lt;br /&gt;
* Einrichten wie oben&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt XAMPP ==&lt;br /&gt;
Dies kann man erfahren oder auch ändern in:&lt;br /&gt;
&lt;br /&gt;
 In /Applications/XAMPP/xamppfiles/etc/httpd.conf change&lt;br /&gt;
und ist in meinem Fall (7.1 und 7.2)&lt;br /&gt;
 User daemon&lt;br /&gt;
 Group daemon&lt;br /&gt;
&lt;br /&gt;
Ich hatte allerdings danach Probleme mit den Rechten von mysql. Da müsste man mal noch genau checken welche weiteren Anpassungen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt der vorinstallierte Apache auf MacOs ? ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;BE CAREFUL IF CHANGING THIS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;_www user/group is the default for OS X&amp;#039;&amp;#039;&amp;#039;. If you want to run the server as root you&amp;#039;ll need to change this to the appropriate user. For root:&lt;br /&gt;
&lt;br /&gt;
 User root&lt;br /&gt;
 Group wheel&lt;br /&gt;
oder&lt;br /&gt;
 User [meinUserName]&lt;br /&gt;
 Group staff&lt;br /&gt;
Deinen Usernamen bekommst du im Terminal mit &lt;br /&gt;
 whoami&lt;br /&gt;
staff ist die User Standardgruppe auf dem Mac&lt;br /&gt;
&lt;br /&gt;
The plist that describes the Apache service to launchd is at /System/Library/LaunchDaemons/org.apache.httpd.plist -- OS X runs any launchd runs daemons described in this location as root so the server starts with sufficient privledges to change context to another user.&lt;br /&gt;
&lt;br /&gt;
Once you&amp;#039;ve made the changes, restart Apache with:&lt;br /&gt;
&lt;br /&gt;
 sudo /usr/sbin/apachectl restart&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23730</id>
		<title>XAMPP auf MacOS installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23730"/>
		<updated>2019-03-03T17:10:58Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
Als praktisch hat es sich erwiesen die eigenen Projekte nicht in htdocs abzulegen. Dann muss man beim Update nicht alles kopieren. Das geht auch ohne virtuelle Server o.ä. Einfach einen Symlink www in htdocs anlegen, der dann auf das eigentliche Webverzeichnis, das man nach Wahl anlegen kann, zeigt.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
=== DMG Archiv normal installieren ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP&amp;#039;&amp;#039;&amp;#039; konfigurieren&lt;br /&gt;
* etc/php.ini anpassen (mehr execution time und memory)&lt;br /&gt;
&lt;br /&gt;
Webverzeichnes &amp;#039;&amp;#039;&amp;#039;www&amp;#039;&amp;#039;&amp;#039; außerhalb von htdocs.&lt;br /&gt;
&lt;br /&gt;
* Ordner www z.B. in User Verzeichnis erstellen&lt;br /&gt;
* Symlink auf diesen im htdocs Ordner auf dieses Verzeichnis.&lt;br /&gt;
* Evtl. Dateirechte anpassen&lt;br /&gt;
&lt;br /&gt;
=== Datenbank ===&lt;br /&gt;
* User und Passwort vergeben (Mit -p Parameter aber Passwort leerlassen. Sonst nimmt er evtl. automatisch das Admin Passwort. Hinweis MariaDB ist der Nachfolger von mySQL. Das Ganze sieht etwa so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /Applications/XAMPP/xampfiles/bin&lt;br /&gt;
sudo su&lt;br /&gt;
./mysql -u root -p&lt;br /&gt;
MariaDB [(none)]&amp;gt; use mysql&lt;br /&gt;
Database changed&lt;br /&gt;
MariaDB [mysql]&amp;gt; update user set Password=password(&amp;#039;meinRootPasswort&amp;#039;) where user=&amp;#039;root&amp;#039;;&lt;br /&gt;
Query OK, 3 rows affected (0,01 sec)&lt;br /&gt;
Rows matched: 3  Changed: 3  Warnings: 0&lt;br /&gt;
MariaDB [mysql]&amp;gt; flush privileges;&lt;br /&gt;
Query OK, 0 rows affected (0,01 sec)&lt;br /&gt;
MariaDB [mysql]&amp;gt; quit&lt;br /&gt;
Bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;mySql Server neu starten.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Besseren User für XAMPP setzen ===&lt;br /&gt;
&lt;br /&gt;
* Standardmäßig ist das deamon:deamon (Gruppe:Owner) Die gibt es eigentlich nicht. Sinnvoll wäre vielleicht den eigenen User zu nehmen (meinuser:staff). Dann muss man im Entwicklungsprozess wenig Dateirechte anpassen, wenn php Dateien anlegt (natürlich nur auf dem lokalen Entwicklungsserver). Oder man richtet einen eigenen User dafür ein. Vorgehe siehe unten bei &amp;#039;&amp;#039;&amp;#039;User&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== phpmyadmin ===&lt;br /&gt;
* /Applications/XAMPP/phpMyAdmin für neues mySQL Passwort einrichten (&amp;#039;&amp;#039;&amp;#039;xamppfiles/phpmyadmin/config.inc.php&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
 $cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;meinRootPasswort&amp;#039;;&lt;br /&gt;
* Evtl. Template Fehler in &amp;#039;&amp;#039;&amp;#039;phpmyadmin&amp;#039;&amp;#039;&amp;#039; beseitigen &lt;br /&gt;
 Auf das $cfg[&amp;#039;TempDir&amp;#039;] (./tmp/) kann nicht zugegriffen werden. PhpMyAdmin kann keine Templates zwischenspeichern und ist daher langsam.&lt;br /&gt;
Dazu in /xamppfiles/phpmyadmin den Ordner tmp anlegen und die Rechte auf den Apache User legen (siehe oben). Oder zur Not für alle auf lesen und schreiben setzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechte im Webverzeichnis ===&lt;br /&gt;
Wenn du die Gruppe und den Owner des Apache auf deinen User gesetzt hast, kann man einfach:&lt;br /&gt;
 sudo chown -R meinUserName:staff /Applications/XAMPP/htdocs/&lt;br /&gt;
ausführen. Pfad muss natürlich zu deinem Webverzeichnis führen.&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Datenbanken sichern (phpmyadmin oder mysqldump)&lt;br /&gt;
* Neues XAMPP installieren&lt;br /&gt;
* Datenbanken zurückspielen (nur die Projekte, nicht mysql und phpmyadmin etc.)&lt;br /&gt;
* Einrichten wie oben&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt XAMPP ==&lt;br /&gt;
Dies kann man erfahren oder auch ändern in:&lt;br /&gt;
&lt;br /&gt;
 In /Applications/XAMPP/xamppfiles/etc/httpd.conf change&lt;br /&gt;
und ist in meinem Fall (7.1 und 7.2)&lt;br /&gt;
 User daemon&lt;br /&gt;
 Group daemon&lt;br /&gt;
&lt;br /&gt;
Ich hatte allerdings danach Probleme mit den Rechten von mysql. Da müsste man mal noch genau checken welche weiteren Anpassungen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt der vorinstallierte Apache auf MacOs ? ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;BE CAREFUL IF CHANGING THIS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;_www user/group is the default for OS X&amp;#039;&amp;#039;&amp;#039;. If you want to run the server as root you&amp;#039;ll need to change this to the appropriate user. For root:&lt;br /&gt;
&lt;br /&gt;
 User root&lt;br /&gt;
 Group wheel&lt;br /&gt;
oder&lt;br /&gt;
 User [meinUserName]&lt;br /&gt;
 Group staff&lt;br /&gt;
Deinen Usernamen bekommst du im Terminal mit &lt;br /&gt;
 whoami&lt;br /&gt;
staff ist die User Standardgruppe auf dem Mac&lt;br /&gt;
&lt;br /&gt;
The plist that describes the Apache service to launchd is at /System/Library/LaunchDaemons/org.apache.httpd.plist -- OS X runs any launchd runs daemons described in this location as root so the server starts with sufficient privledges to change context to another user.&lt;br /&gt;
&lt;br /&gt;
Once you&amp;#039;ve made the changes, restart Apache with:&lt;br /&gt;
&lt;br /&gt;
 sudo /usr/sbin/apachectl restart&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23729</id>
		<title>XAMPP auf MacOS installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=XAMPP_auf_MacOS_installieren&amp;diff=23729"/>
		<updated>2019-03-03T17:05:17Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Welchen User und welche Gruppe nutzt XAMPP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
Als praktisch hat es sich erwiesen die eigenen Projekte nicht in htdocs abzulegen. Dann muss man beim Update nicht alles kopieren. Das geht auch ohne virtuelle Server o.ä. Einfach einen Symlink www in htdocs anlegen, der dann auf das eigentliche Webverzeichnis, das man nach Wahl anlegen kann, zeigt.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;DMG Archiv normal installieren&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;PHP&amp;#039;&amp;#039;&amp;#039; konfigurieren&lt;br /&gt;
* etc/php.ini anpassen (mehr execution time und memory)&lt;br /&gt;
&lt;br /&gt;
Webverzeichnes &amp;#039;&amp;#039;&amp;#039;www&amp;#039;&amp;#039;&amp;#039; außerhalb von htdocs.&lt;br /&gt;
&lt;br /&gt;
* Ordner www z.B. in User Verzeichnis erstellen&lt;br /&gt;
* Symlink auf diesen im htdocs Ordner auf dieses Verzeichnis.&lt;br /&gt;
* Evtl. Dateirechte anpassen&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Datenbank&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* User und Passwort vergeben (Mit -p Parameter aber Passwort leerlassen. Sonst nimmt er evtl. automatisch das Admin Passwort. Hinweis MariaDB ist der Nachfolger von mySQL. Das Ganze sieht etwa so aus:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /Applications/XAMPP/xampfiles/bin&lt;br /&gt;
sudo su&lt;br /&gt;
./mysql -u root -p&lt;br /&gt;
MariaDB [(none)]&amp;gt; use mysql&lt;br /&gt;
Database changed&lt;br /&gt;
MariaDB [mysql]&amp;gt; update user set Password=password(&amp;#039;meinRootPasswort&amp;#039;) where user=&amp;#039;root&amp;#039;;&lt;br /&gt;
Query OK, 3 rows affected (0,01 sec)&lt;br /&gt;
Rows matched: 3  Changed: 3  Warnings: 0&lt;br /&gt;
MariaDB [mysql]&amp;gt; flush privileges;&lt;br /&gt;
Query OK, 0 rows affected (0,01 sec)&lt;br /&gt;
MariaDB [mysql]&amp;gt; quit&lt;br /&gt;
Bye&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;mySql Server neu starten.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Besseren User für XAMPP setzen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* Standardmäßig ist das deamon:deamon (Gruppe:Owner) Die gibt es eigentlich nicht. Sinnvoll wäre vielleicht den eigenen User zu nehmen (meinuser:staff). Dann muss man im Entwicklungsprozess wenig Dateirechte anpassen, wenn php Dateien anlegt (natürlich nur auf dem lokalen Entwicklungsserver). Oder man richtet einen eigenen User dafür ein. Vorgehe siehe unten bei &amp;#039;&amp;#039;&amp;#039;User&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;phpmyadmin&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* /Applications/XAMPP/phpMyAdmin für neues mySQL Passwort einrichten (&amp;#039;&amp;#039;&amp;#039;xamppfiles/phpmyadmin/config.inc.php&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
 $cfg[&amp;#039;Servers&amp;#039;][$i][&amp;#039;password&amp;#039;] = &amp;#039;meinRootPasswort&amp;#039;;&lt;br /&gt;
* Evtl. Template Fehler in &amp;#039;&amp;#039;&amp;#039;phpmyadmin&amp;#039;&amp;#039;&amp;#039; beseitigen &lt;br /&gt;
 Auf das $cfg[&amp;#039;TempDir&amp;#039;] (./tmp/) kann nicht zugegriffen werden. PhpMyAdmin kann keine Templates zwischenspeichern und ist daher langsam.&lt;br /&gt;
Dazu in /xamppfiles/phpmyadmin den Ordner tmp anlegen und die Rechte auf den Apache User legen (siehe oben). Oder zur Not für alle auf lesen und schreiben setzen.&lt;br /&gt;
&lt;br /&gt;
=== Rechte im Webverzeichnis ===&lt;br /&gt;
Wenn du die Gruppe und den Owner des Apache auf deinen User gesetzt hast, kann man einfach:&lt;br /&gt;
 sudo chown -R meinUserName:staff /Applications/XAMPP/htdocs/&lt;br /&gt;
ausführen. Pfad muss natürlich zu deinem Webverzeichnis führen. &lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
* Datenbanken sichern (phpmyadmin oder mysqldump)&lt;br /&gt;
* Neues XAMPP installieren&lt;br /&gt;
* Datenbanken zurückspielen (nur die Projekte, nicht mysql und phpmyadmin etc.)&lt;br /&gt;
* Einrichten wie oben&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt XAMPP ==&lt;br /&gt;
Dies kann man erfahren oder auch ändern in:&lt;br /&gt;
&lt;br /&gt;
 In /Applications/XAMPP/xamppfiles/etc/httpd.conf change&lt;br /&gt;
und ist in meinem Fall (7.1 und 7.2)&lt;br /&gt;
 User daemon&lt;br /&gt;
 Group daemon&lt;br /&gt;
&lt;br /&gt;
Ich hatte allerdings danach Probleme mit den Rechten von mysql. Da müsste man mal noch genau checken welche weiteren Anpassungen notwendig sind.&lt;br /&gt;
&lt;br /&gt;
== Welchen User und welche Gruppe nutzt der vorinstallierte Apache auf MacOs ? ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;BE CAREFUL IF CHANGING THIS&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;#039;&amp;#039;&amp;#039;_www user/group is the default for OS X&amp;#039;&amp;#039;&amp;#039;. If you want to run the server as root you&amp;#039;ll need to change this to the appropriate user. For root:&lt;br /&gt;
&lt;br /&gt;
 User root&lt;br /&gt;
 Group wheel&lt;br /&gt;
oder&lt;br /&gt;
 User [meinUserName]&lt;br /&gt;
 Group staff&lt;br /&gt;
Deinen Usernamen bekommst du im Terminal mit &lt;br /&gt;
 whoami&lt;br /&gt;
staff ist die User Standardgruppe auf dem Mac&lt;br /&gt;
&lt;br /&gt;
The plist that describes the Apache service to launchd is at /System/Library/LaunchDaemons/org.apache.httpd.plist -- OS X runs any launchd runs daemons described in this location as root so the server starts with sufficient privledges to change context to another user.&lt;br /&gt;
&lt;br /&gt;
Once you&amp;#039;ve made the changes, restart Apache with:&lt;br /&gt;
&lt;br /&gt;
 sudo /usr/sbin/apachectl restart&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=MySQL_-_Kommandozeile&amp;diff=23709</id>
		<title>MySQL - Kommandozeile</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=MySQL_-_Kommandozeile&amp;diff=23709"/>
		<updated>2019-02-25T15:51:10Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Datenbank sichern mit mysqldump */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die wichtigsten mySQL Befehle...&lt;br /&gt;
== Dienstprogramm &amp;#039;mysql&amp;#039; starten==&lt;br /&gt;
 mysql -p&amp;lt;Paßwort&amp;gt; -u &amp;lt;Benutzername&amp;gt; &amp;lt;DB-Name&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
 mysql -u &amp;lt;Benutzername&amp;gt; -p &amp;lt;DB-Name&amp;gt;&lt;br /&gt;
 Enter password: ********&lt;br /&gt;
&lt;br /&gt;
=== Datenbank wechseln - use ===&lt;br /&gt;
=== Datenbank erstellen - CREATE DATABASE ===&lt;br /&gt;
CREATE DATABASE dbName;&lt;br /&gt;
=== Dateien abarbeiten ===&lt;br /&gt;
ateien abarbeiten&lt;br /&gt;
Wie oben schon erwähnt, kann man die Befehle auch mit einem ASCII[*]-Editor in eine Datei schreiben und diese dann abarbeiten lassen. Der Aufruf, der das Abarbeiten der Datei startet, ähnelt dem normalen mysql-Aufruf:&lt;br /&gt;
&lt;br /&gt;
 mysql -p{Paßwort} -u{Benutzername} {DB-Name} &amp;lt; dateiname&lt;br /&gt;
&lt;br /&gt;
Alle (Fehler-)Meldungen, die normalerweise angezeigt werden, werden auf den Bildschirm geschrieben.&lt;br /&gt;
=== Backup ===&lt;br /&gt;
z.B. mit mysqldump&lt;br /&gt;
- langsam aber sehr sicher (hohe Portabilität, im laufenden Betrieb)&lt;br /&gt;
 mysqldump -u username -pdbname &amp;gt; dateiname.sql&lt;br /&gt;
 Enter password: xxx&lt;br /&gt;
&lt;br /&gt;
==== wieder einspielen ====&lt;br /&gt;
sql-Datei hochspielen (FTP o.ä.)&lt;br /&gt;
einspielen wie in Dateien abarbeiten beschrieben:&lt;br /&gt;
 mysql -u username -p dbname &amp;lt; dateiname&lt;br /&gt;
&lt;br /&gt;
oder&lt;br /&gt;
&lt;br /&gt;
 mysql -u username -pMeinPasswort dbname &amp;lt; dateiname&lt;br /&gt;
&lt;br /&gt;
== Datenbank sichern mit mysqldump ==&lt;br /&gt;
=== Alle Datenbanken sichern ===&lt;br /&gt;
Basiskommando&lt;br /&gt;
 mysqldump -u root -p --all-databases &amp;gt; alldb.sql&lt;br /&gt;
oder&lt;br /&gt;
 mysqldump -u root -p --opt --all-databases &amp;gt; alldb.sql&lt;br /&gt;
 mysqldump -u root -p --all-databases --skip-lock-tables &amp;gt; alldb.sql&lt;br /&gt;
&lt;br /&gt;
zurückimportieren&lt;br /&gt;
&lt;br /&gt;
 mysql -u root -p &amp;lt; alldb.sql&lt;br /&gt;
&lt;br /&gt;
== Datenbank sichern ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Kurzanleitung zur Anlage einer Database und einer Tabelle in MySQL&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Werden mehrere SQL-Kommandos benötigt, empfiehlt es sich, diese in einer einfachen ASCII-Textdatei abzulegen. Dann können sie leicht editiert und (eventuell geändert) wiederholt eingelesen werden.&lt;br /&gt;
Deshalb erstellen wir eine Datei &amp;#039;MeineDb.sql&amp;#039; mit folgendem Inhalt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- SQL-Datei für MySQL&lt;br /&gt;
-- Beim ersten Laden muss die folgende Zeile auskommentiert sein,&lt;br /&gt;
-- bei wiederholten Versuchen muss sie aktiviert sein (&amp;#039;--&amp;#039; entfernen):&lt;br /&gt;
-- DROP DATABASE MeineDb;&lt;br /&gt;
CREATE DATABASE MeineDb;&lt;br /&gt;
SHOW databases;&lt;br /&gt;
USE MeineDb;&lt;br /&gt;
CREATE TABLE MeineTestTabelle ( i INT, c CHAR(3), s VARCHAR(8), dt DATE );&lt;br /&gt;
CREATE TABLE MeineAdressen ( Name VARCHAR(16), Plz INT, Ort VARCHAR(16) );&lt;br /&gt;
SHOW tables;&lt;br /&gt;
INSERT INTO MeineTestTabelle VALUES ( 11, &amp;#039;ABC&amp;#039;, &amp;#039;Blubb&amp;#039;, &amp;#039;2000-01-01&amp;#039; );&lt;br /&gt;
INSERT INTO MeineTestTabelle VALUES ( 12, &amp;#039;ab&amp;#039;, &amp;#039;Blabla&amp;#039;, &amp;#039;2000-12-31&amp;#039; );&lt;br /&gt;
INSERT INTO MeineTestTabelle VALUES ( 42, &amp;#039;xy&amp;#039;, &amp;#039;äöüß§€&amp;#039;, &amp;#039;2005-06-06&amp;#039; );&lt;br /&gt;
SELECT * FROM MeineTestTabelle;&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Achim&amp;#039;,     52078, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Alexander&amp;#039;, 52134, &amp;#039;Herzogenrath&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Helmut&amp;#039;,    52066, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Josef&amp;#039;,     52070, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Manfred&amp;#039;,   52146, &amp;#039;Würselen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Patrick&amp;#039;,   52074, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Roland&amp;#039;,    52134, &amp;#039;Herzogenrath&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Torsten&amp;#039;,   52072, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
INSERT INTO MeineAdressen VALUES ( &amp;#039;Werner&amp;#039;,    52066, &amp;#039;Aachen&amp;#039; );&lt;br /&gt;
SELECT * FROM MeineAdressen;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausführen:&lt;br /&gt;
 mysql -uroot -pmysqlpwd &amp;lt; MeineDb.sql &lt;br /&gt;
Testen mit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 mysql -uroot -pmysqlpwd MeineDb&lt;br /&gt;
&lt;br /&gt;
  select * from MeineTestTabelle;&lt;br /&gt;
&lt;br /&gt;
  \q&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
ergibt:&lt;br /&gt;
&lt;br /&gt;
 +------+------+--------+------------+&lt;br /&gt;
 | i    | c    | s      | dt         |&lt;br /&gt;
 +------+------+--------+------------+&lt;br /&gt;
 |   11 | ABC  | Blubb  | 2000-01-01 |&lt;br /&gt;
 |   12 | ab   | Blabla | 2000-12-31 |&lt;br /&gt;
 |   42 | xy   | äöüß§€ | 2005-06-06 |&lt;br /&gt;
 +------+------+--------+------------+&lt;br /&gt;
&lt;br /&gt;
Der String &amp;#039;äöüß§€&amp;#039; wird im Kommandozeilenfenster beim üblicherweise eingestellten Characterset falsch dargestellt, ist aber trotzdem korrekt gespeichert.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23708</id>
		<title>Processwire - Leaflet Map Marker Modul</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23708"/>
		<updated>2019-02-24T20:59:14Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* In ProcessWire einbauen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/9745-module-leaflet-map/?page=5 (Forum)&lt;br /&gt;
 https://github.com/gmclelland/FieldtypeLeafletMapMarker/blob/PW3/InputfieldLeafletMapMarker.module (Fork)&lt;br /&gt;
 https://leafletjs.com/ (Leaflet Hauptseite)&lt;br /&gt;
 https://leaflet-extras.github.io/leaflet-providers/preview/index.html (Karten Provider)&lt;br /&gt;
 https://github.com/Leaflet/Leaflet.markercluster (Doku für Cluster Modul)&lt;br /&gt;
== Überblick ==&lt;br /&gt;
Wird aus Zeitgründen vom Entwickler nicht sehr aktiv weitergepflegt. Allerdings gibt es ordentlichen Support im Forum und ein paar Forks auf Github.&lt;br /&gt;
&lt;br /&gt;
Man kann für spezielle Anforderungen auch nur das Feld im Backend nutzen und Leaflet im Frontend selbst aufsetzen bzw. eigene Skripte nutzen. Das JavaScript für die Frontendausgabe im Modul findet man in:&lt;br /&gt;
 MarkupLeafletMap.js (JavaScript für Frontend-Ausgabe)&lt;br /&gt;
 MarkupLeafletMap.module (Inline JS für Frontend ) &lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
* Benötigt die Konfiguration von &amp;#039;&amp;#039;&amp;#039;$additionalHeaderData&amp;#039;&amp;#039;&amp;#039;. Das ist einfach ein String der in &amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039; angelegt und im &amp;#039;&amp;#039;Header eingebunden&amp;#039;&amp;#039; wird. Damit lassen sich Zusätzliche Daten per Template rendern. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Feldname&amp;#039;&amp;#039;&amp;#039; im Backend ist hier &amp;#039;&amp;#039;&amp;#039;map_leaflet&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Achtung Bug (V2.8.1): Immer den Geocoder auf der Seite benutzen. Die Standarddaten aus der Feldkonfiguration werden nicht richtig übernommen (Adressfeld) und es gibt Ausgabefehler.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($page, &amp;#039;map_leaflet ,array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;content_bottom&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Button GM --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Lange+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Map --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col span_12&amp;quot;&amp;gt;&amp;#039;.$mapMarkup.&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daten manuell auslesen und verarbeiten ==&lt;br /&gt;
Einfaches Beispiel das auch bei AJAX Seiten funktioniert und einen Button zur Google Maps Wegbeschreibung enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// If AJAX put this in _init.php else uncomment next two lines&lt;br /&gt;
// $map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
// $additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
&lt;br /&gt;
$myAdress = $page-&amp;gt;map_leaflet-&amp;gt;address;	// outputs the address you entered&lt;br /&gt;
$myLat = $page-&amp;gt;map_leaflet-&amp;gt;lat; 		// outputs the latitude&lt;br /&gt;
$myLng = $page-&amp;gt;map_leaflet-&amp;gt;lng; 		// outputs the longitude&lt;br /&gt;
$myZoom = $page-&amp;gt;map_leaflet-&amp;gt;zoom;		// outputs the zoom level&lt;br /&gt;
&lt;br /&gt;
$mapMarkup = &amp;quot;&lt;br /&gt;
&amp;lt;div id=&amp;#039;mleafletmap1&amp;#039;style=&amp;#039;height:400px;&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var mleafletmap1 = new jsMarkupLeafletMap();&lt;br /&gt;
 mleafletmap1.setOption(&amp;#039;zoom&amp;#039;, $myZoom);&lt;br /&gt;
  mleafletmap1.init(&amp;#039;mleafletmap1&amp;#039;, $myLat, $myLng, &amp;#039;OpenStreetMap.Mapnik&amp;#039;);&lt;br /&gt;
  var default_marker_icon = L.AwesomeMarkers.icon({ icon: &amp;#039;home&amp;#039;, iconColor: &amp;#039;white&amp;#039;, prefix: &amp;#039;fa&amp;#039;, markerColor: &amp;#039;darkblue&amp;#039; });&lt;br /&gt;
  mleafletmap1.addMarkerIcon(default_marker_icon, $myLat, $myLng, &amp;#039;/kontakt/&amp;#039;, &amp;#039;Kontakt&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Meine+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;col-sm-12&amp;quot; style=&amp;quot;height:400px;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    .$mapMarkup.&amp;#039;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Multiple Markers ===&lt;br /&gt;
Die Render Funktion kann auch mit mehreren Seitenobjekten umgehen und erstellt dann eine Karte mit mehreren Markern.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;A SELECTOR THAT GETS YOUR PAGES WITH MARKER FIELDS&amp;quot;);&lt;br /&gt;
echo $map-&amp;gt;render($items, &amp;#039;YOUR MARKER FIELD&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Multiple Markers von selektierten Seiten ===&lt;br /&gt;
Es sollen Orte (LeafletMapMarker) von Unterseiten geholt werden und aus diesen eine Map mit mehreren Markern generiert werden. Viele Marker auf engem Raum werden geclustert.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen im Beispiel&lt;br /&gt;
* die Kindseiten werden über ihr template selektiert. Im Beispiel wird das durch ein Textfeld im Parent Template festgelegt (Feldname template_title)&lt;br /&gt;
* der Leaflet code wird nur bei Bedarf geladen. Das geschieht über eine Switch Anweisung im Repeater&lt;br /&gt;
* Leaflet Dateien sind lokal hinterlegt (siehe js und css Anweisungen).&lt;br /&gt;
 &lt;br /&gt;
mytemplate.php &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$options = array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;);&lt;br /&gt;
$mySelector = &amp;#039;template=event&amp;#039;;&lt;br /&gt;
$places = $pages-&amp;gt;find($mySelector);&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($places, &amp;#039;location&amp;#039; ,$options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Leaflet Skripte lokal einbinden (keine externen Skripte laden) ===&lt;br /&gt;
Dies sind die benötigten Header Zeilen. leaflet.css und leaflet.js sollte dann entsprechend vorhanden sein. Der Rest kommat aus dem Modul Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Font Awesome muß ebenfalls vorhanden sein (Bisher - September 2018, die 4er Version).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData = &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scroll Zoom abschalten ===&lt;br /&gt;
Am einfachsten im Modul (Nachteil: Vorsicht beim Update)&lt;br /&gt;
&lt;br /&gt;
Evtl. fürs Frontend könnte man auch im Nachhinein in einem eigenen Skript abschalten über die Funktion:&lt;br /&gt;
 map.scrollWheelZoom.disable(); // map ist die Mapinstanz. Muß evtl. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==== Im Frontend (Fieldtype)====&lt;br /&gt;
 /site/modules/FieldtypeLeafletMapMarker/MarkupLeafletMap.js&lt;br /&gt;
In MarkupLeafletMap.js die Option hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
this.options = {&lt;br /&gt;
        zoom: 10,&lt;br /&gt;
        center: null,&lt;br /&gt;
        scrollWheelZoom: false, // diese option einfügen&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this._currentURL = &amp;#039;&amp;#039;;&lt;br /&gt;
    this.init = function(mapID, lat, lng, provider) {&lt;br /&gt;
        if(lat != 0) this.map = L.map(mapID, {&lt;br /&gt;
          center: [lat, lng],&lt;br /&gt;
          zoom: this.options.zoom,&lt;br /&gt;
          scrollWheelZoom: this.options.scrollWheelZoom // und dieses wenn nicht vorhanden&lt;br /&gt;
        } );&lt;br /&gt;
        L.tileLayer.provider(provider).addTo(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Im Backend ====&lt;br /&gt;
Hier muß mann den Code des Inputfield anpassen. Direkt in den Optionen hat das bei mir nicht funktioniert. Sieht so aus als ob nur der zoom statt alle Optionen gesetzt wird. Daher einfach nach der Instanzerzeugung der karte den ScrollWheelZoom abschalten:&lt;br /&gt;
&lt;br /&gt;
FieldtypeLeafletMapMarker/InputfieldLeafletMapMarker.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map = L.map(document.getElementById(mapId)). setView([lat, lng], options.zoom); // nach dem hier&lt;br /&gt;
map.scrollWheelZoom.disable(); // dieses einfügen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modul Gesture Handling ===&lt;br /&gt;
 [[Leaflet - Gesture Handling]]&lt;br /&gt;
 https://elmarquis.github.io/Leaflet.GestureHandling/&lt;br /&gt;
 Bildet das Verhalten von Google Maps nach:&lt;br /&gt;
Desktop &lt;br /&gt;
* Karte Ignoriert Mausrad&lt;br /&gt;
* User wird Informiert mit ctrl+scrool Karte zoomen&lt;br /&gt;
Mobile&lt;br /&gt;
* Karte ignoriert Ein Finger Drag&lt;br /&gt;
* User wird über 2 Finger Pan informiert&lt;br /&gt;
&lt;br /&gt;
==== In ProcessWire einbauen ====&lt;br /&gt;
* Unterordner &amp;#039;dist&amp;#039; in &amp;#039;Leaflet.GestureHandling&amp;#039; umbenennen und im FieldtypeLeafletMapMarker Modul unter assets ablegen&lt;br /&gt;
*  anpassen des JS für die Frontendausgabe&lt;br /&gt;
 /site/modules/FieldtypeLeafletMapMarker/MarkupLeafletMap.js&lt;br /&gt;
* Init Funktion anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    this.init = function(mapID, lat, lng, provider) {&lt;br /&gt;
        if(lat != 0) this.map = L.map(mapID, {&lt;br /&gt;
          center: [lat, lng],&lt;br /&gt;
          zoom: this.options.zoom,&lt;br /&gt;
          scrollWheelZoom: this.options.scrollWheelZoom,&lt;br /&gt;
          gestureHandling: true&lt;br /&gt;
        } );&lt;br /&gt;
        L.tileLayer.provider(provider).addTo(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Einbinden von CSS und JS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Gesture Handling --&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/Leaflet.GestureHandling/leaflet-gesture-handling.min.css&amp;quot; type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/Leaflet.GestureHandling/leaflet-gesture-handling.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;#039;map&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var cities = new L.LayerGroup();&lt;br /&gt;
&lt;br /&gt;
	L.marker([39.61, -105.02]).bindPopup(&amp;#039;This is Littleton, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.74, -104.99]).bindPopup(&amp;#039;This is Denver, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.73, -104.8]).bindPopup(&amp;#039;This is Aurora, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.77, -105.23]).bindPopup(&amp;#039;This is Golden, CO.&amp;#039;).addTo(cities);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	var mbAttr = &amp;#039;Map data &amp;amp;copy; &amp;lt;a href=&amp;quot;http://openstreetmap.org&amp;quot;&amp;gt;OpenStreetMap&amp;lt;/a&amp;gt; contributors, &amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;a href=&amp;quot;http://creativecommons.org/licenses/by-sa/2.0/&amp;quot;&amp;gt;CC-BY-SA&amp;lt;/a&amp;gt;, &amp;#039; +&lt;br /&gt;
			&amp;#039;Imagery © &amp;lt;a href=&amp;quot;http://mapbox.com&amp;quot;&amp;gt;Mapbox&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
		mbUrl = &amp;#039;https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var grayscale   = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.light&amp;#039;, attribution: mbAttr}),&lt;br /&gt;
		streets  = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.streets&amp;#039;,   attribution: mbAttr});&lt;br /&gt;
&lt;br /&gt;
	var map = L.map(&amp;#039;map&amp;#039;, {&lt;br /&gt;
		center: [39.73, -104.99],&lt;br /&gt;
		zoom: 10,&lt;br /&gt;
		layers: [grayscale, cities]&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	var baseLayers = {&lt;br /&gt;
		&amp;quot;Grayscale&amp;quot;: grayscale,&lt;br /&gt;
		&amp;quot;Streets&amp;quot;: streets&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var overlays = {&lt;br /&gt;
		&amp;quot;Cities&amp;quot;: cities&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	L.control.layers(baseLayers, overlays).addTo(map);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Feld zeigt an Error Geocoding ===&lt;br /&gt;
File Cache komplett löschen (assets/cache/...)&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23707</id>
		<title>Processwire - Leaflet Map Marker Modul</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23707"/>
		<updated>2019-02-24T20:57:28Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* In ProcessWire einbauen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/9745-module-leaflet-map/?page=5 (Forum)&lt;br /&gt;
 https://github.com/gmclelland/FieldtypeLeafletMapMarker/blob/PW3/InputfieldLeafletMapMarker.module (Fork)&lt;br /&gt;
 https://leafletjs.com/ (Leaflet Hauptseite)&lt;br /&gt;
 https://leaflet-extras.github.io/leaflet-providers/preview/index.html (Karten Provider)&lt;br /&gt;
 https://github.com/Leaflet/Leaflet.markercluster (Doku für Cluster Modul)&lt;br /&gt;
== Überblick ==&lt;br /&gt;
Wird aus Zeitgründen vom Entwickler nicht sehr aktiv weitergepflegt. Allerdings gibt es ordentlichen Support im Forum und ein paar Forks auf Github.&lt;br /&gt;
&lt;br /&gt;
Man kann für spezielle Anforderungen auch nur das Feld im Backend nutzen und Leaflet im Frontend selbst aufsetzen bzw. eigene Skripte nutzen. Das JavaScript für die Frontendausgabe im Modul findet man in:&lt;br /&gt;
 MarkupLeafletMap.js (JavaScript für Frontend-Ausgabe)&lt;br /&gt;
 MarkupLeafletMap.module (Inline JS für Frontend ) &lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
* Benötigt die Konfiguration von &amp;#039;&amp;#039;&amp;#039;$additionalHeaderData&amp;#039;&amp;#039;&amp;#039;. Das ist einfach ein String der in &amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039; angelegt und im &amp;#039;&amp;#039;Header eingebunden&amp;#039;&amp;#039; wird. Damit lassen sich Zusätzliche Daten per Template rendern. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Feldname&amp;#039;&amp;#039;&amp;#039; im Backend ist hier &amp;#039;&amp;#039;&amp;#039;map_leaflet&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Achtung Bug (V2.8.1): Immer den Geocoder auf der Seite benutzen. Die Standarddaten aus der Feldkonfiguration werden nicht richtig übernommen (Adressfeld) und es gibt Ausgabefehler.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($page, &amp;#039;map_leaflet ,array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;content_bottom&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Button GM --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Lange+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Map --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col span_12&amp;quot;&amp;gt;&amp;#039;.$mapMarkup.&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daten manuell auslesen und verarbeiten ==&lt;br /&gt;
Einfaches Beispiel das auch bei AJAX Seiten funktioniert und einen Button zur Google Maps Wegbeschreibung enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// If AJAX put this in _init.php else uncomment next two lines&lt;br /&gt;
// $map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
// $additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
&lt;br /&gt;
$myAdress = $page-&amp;gt;map_leaflet-&amp;gt;address;	// outputs the address you entered&lt;br /&gt;
$myLat = $page-&amp;gt;map_leaflet-&amp;gt;lat; 		// outputs the latitude&lt;br /&gt;
$myLng = $page-&amp;gt;map_leaflet-&amp;gt;lng; 		// outputs the longitude&lt;br /&gt;
$myZoom = $page-&amp;gt;map_leaflet-&amp;gt;zoom;		// outputs the zoom level&lt;br /&gt;
&lt;br /&gt;
$mapMarkup = &amp;quot;&lt;br /&gt;
&amp;lt;div id=&amp;#039;mleafletmap1&amp;#039;style=&amp;#039;height:400px;&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var mleafletmap1 = new jsMarkupLeafletMap();&lt;br /&gt;
 mleafletmap1.setOption(&amp;#039;zoom&amp;#039;, $myZoom);&lt;br /&gt;
  mleafletmap1.init(&amp;#039;mleafletmap1&amp;#039;, $myLat, $myLng, &amp;#039;OpenStreetMap.Mapnik&amp;#039;);&lt;br /&gt;
  var default_marker_icon = L.AwesomeMarkers.icon({ icon: &amp;#039;home&amp;#039;, iconColor: &amp;#039;white&amp;#039;, prefix: &amp;#039;fa&amp;#039;, markerColor: &amp;#039;darkblue&amp;#039; });&lt;br /&gt;
  mleafletmap1.addMarkerIcon(default_marker_icon, $myLat, $myLng, &amp;#039;/kontakt/&amp;#039;, &amp;#039;Kontakt&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Meine+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;col-sm-12&amp;quot; style=&amp;quot;height:400px;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    .$mapMarkup.&amp;#039;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Multiple Markers ===&lt;br /&gt;
Die Render Funktion kann auch mit mehreren Seitenobjekten umgehen und erstellt dann eine Karte mit mehreren Markern.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;A SELECTOR THAT GETS YOUR PAGES WITH MARKER FIELDS&amp;quot;);&lt;br /&gt;
echo $map-&amp;gt;render($items, &amp;#039;YOUR MARKER FIELD&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Multiple Markers von selektierten Seiten ===&lt;br /&gt;
Es sollen Orte (LeafletMapMarker) von Unterseiten geholt werden und aus diesen eine Map mit mehreren Markern generiert werden. Viele Marker auf engem Raum werden geclustert.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen im Beispiel&lt;br /&gt;
* die Kindseiten werden über ihr template selektiert. Im Beispiel wird das durch ein Textfeld im Parent Template festgelegt (Feldname template_title)&lt;br /&gt;
* der Leaflet code wird nur bei Bedarf geladen. Das geschieht über eine Switch Anweisung im Repeater&lt;br /&gt;
* Leaflet Dateien sind lokal hinterlegt (siehe js und css Anweisungen).&lt;br /&gt;
 &lt;br /&gt;
mytemplate.php &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$options = array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;);&lt;br /&gt;
$mySelector = &amp;#039;template=event&amp;#039;;&lt;br /&gt;
$places = $pages-&amp;gt;find($mySelector);&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($places, &amp;#039;location&amp;#039; ,$options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Leaflet Skripte lokal einbinden (keine externen Skripte laden) ===&lt;br /&gt;
Dies sind die benötigten Header Zeilen. leaflet.css und leaflet.js sollte dann entsprechend vorhanden sein. Der Rest kommat aus dem Modul Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Font Awesome muß ebenfalls vorhanden sein (Bisher - September 2018, die 4er Version).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData = &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scroll Zoom abschalten ===&lt;br /&gt;
Am einfachsten im Modul (Nachteil: Vorsicht beim Update)&lt;br /&gt;
&lt;br /&gt;
Evtl. fürs Frontend könnte man auch im Nachhinein in einem eigenen Skript abschalten über die Funktion:&lt;br /&gt;
 map.scrollWheelZoom.disable(); // map ist die Mapinstanz. Muß evtl. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==== Im Frontend (Fieldtype)====&lt;br /&gt;
 /site/modules/FieldtypeLeafletMapMarker/MarkupLeafletMap.js&lt;br /&gt;
In MarkupLeafletMap.js die Option hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
this.options = {&lt;br /&gt;
        zoom: 10,&lt;br /&gt;
        center: null,&lt;br /&gt;
        scrollWheelZoom: false, // diese option einfügen&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this._currentURL = &amp;#039;&amp;#039;;&lt;br /&gt;
    this.init = function(mapID, lat, lng, provider) {&lt;br /&gt;
        if(lat != 0) this.map = L.map(mapID, {&lt;br /&gt;
          center: [lat, lng],&lt;br /&gt;
          zoom: this.options.zoom,&lt;br /&gt;
          scrollWheelZoom: this.options.scrollWheelZoom // und dieses wenn nicht vorhanden&lt;br /&gt;
        } );&lt;br /&gt;
        L.tileLayer.provider(provider).addTo(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Im Backend ====&lt;br /&gt;
Hier muß mann den Code des Inputfield anpassen. Direkt in den Optionen hat das bei mir nicht funktioniert. Sieht so aus als ob nur der zoom statt alle Optionen gesetzt wird. Daher einfach nach der Instanzerzeugung der karte den ScrollWheelZoom abschalten:&lt;br /&gt;
&lt;br /&gt;
FieldtypeLeafletMapMarker/InputfieldLeafletMapMarker.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map = L.map(document.getElementById(mapId)). setView([lat, lng], options.zoom); // nach dem hier&lt;br /&gt;
map.scrollWheelZoom.disable(); // dieses einfügen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modul Gesture Handling ===&lt;br /&gt;
 [[Leaflet - Gesture Handling]]&lt;br /&gt;
 https://elmarquis.github.io/Leaflet.GestureHandling/&lt;br /&gt;
 Bildet das Verhalten von Google Maps nach:&lt;br /&gt;
Desktop &lt;br /&gt;
* Karte Ignoriert Mausrad&lt;br /&gt;
* User wird Informiert mit ctrl+scrool Karte zoomen&lt;br /&gt;
Mobile&lt;br /&gt;
* Karte ignoriert Ein Finger Drag&lt;br /&gt;
* User wird über 2 Finger Pan informiert&lt;br /&gt;
&lt;br /&gt;
==== In ProcessWire einbauen ====&lt;br /&gt;
* Unterordner &amp;#039;dist&amp;#039; in &amp;#039;Leaflet.GestureHandling&amp;#039; umbenennen und im FieldtypeLeafletMapMarker Modul unter assets ablegen&lt;br /&gt;
*  anpassen des JS für die Frontendausgabe&lt;br /&gt;
 /site/modules/FieldtypeLeafletMapMarker/MarkupLeafletMap.js&lt;br /&gt;
* Init Funktion anpassen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    this.init = function(mapID, lat, lng, provider) {&lt;br /&gt;
        if(lat != 0) this.map = L.map(mapID, {&lt;br /&gt;
          center: [lat, lng],&lt;br /&gt;
          zoom: this.options.zoom,&lt;br /&gt;
          scrollWheelZoom: this.options.scrollWheelZoom,&lt;br /&gt;
          gestureHandling: true&lt;br /&gt;
        } );&lt;br /&gt;
        L.tileLayer.provider(provider).addTo(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Einbinden von CSS und JS&lt;br /&gt;
&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;#039;map&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var cities = new L.LayerGroup();&lt;br /&gt;
&lt;br /&gt;
	L.marker([39.61, -105.02]).bindPopup(&amp;#039;This is Littleton, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.74, -104.99]).bindPopup(&amp;#039;This is Denver, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.73, -104.8]).bindPopup(&amp;#039;This is Aurora, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.77, -105.23]).bindPopup(&amp;#039;This is Golden, CO.&amp;#039;).addTo(cities);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	var mbAttr = &amp;#039;Map data &amp;amp;copy; &amp;lt;a href=&amp;quot;http://openstreetmap.org&amp;quot;&amp;gt;OpenStreetMap&amp;lt;/a&amp;gt; contributors, &amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;a href=&amp;quot;http://creativecommons.org/licenses/by-sa/2.0/&amp;quot;&amp;gt;CC-BY-SA&amp;lt;/a&amp;gt;, &amp;#039; +&lt;br /&gt;
			&amp;#039;Imagery © &amp;lt;a href=&amp;quot;http://mapbox.com&amp;quot;&amp;gt;Mapbox&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
		mbUrl = &amp;#039;https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var grayscale   = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.light&amp;#039;, attribution: mbAttr}),&lt;br /&gt;
		streets  = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.streets&amp;#039;,   attribution: mbAttr});&lt;br /&gt;
&lt;br /&gt;
	var map = L.map(&amp;#039;map&amp;#039;, {&lt;br /&gt;
		center: [39.73, -104.99],&lt;br /&gt;
		zoom: 10,&lt;br /&gt;
		layers: [grayscale, cities]&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	var baseLayers = {&lt;br /&gt;
		&amp;quot;Grayscale&amp;quot;: grayscale,&lt;br /&gt;
		&amp;quot;Streets&amp;quot;: streets&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var overlays = {&lt;br /&gt;
		&amp;quot;Cities&amp;quot;: cities&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	L.control.layers(baseLayers, overlays).addTo(map);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Feld zeigt an Error Geocoding ===&lt;br /&gt;
File Cache komplett löschen (assets/cache/...)&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23706</id>
		<title>Processwire - Leaflet Map Marker Modul</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Leaflet_Map_Marker_Modul&amp;diff=23706"/>
		<updated>2019-02-24T20:54:49Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Modul Gesture Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/9745-module-leaflet-map/?page=5 (Forum)&lt;br /&gt;
 https://github.com/gmclelland/FieldtypeLeafletMapMarker/blob/PW3/InputfieldLeafletMapMarker.module (Fork)&lt;br /&gt;
 https://leafletjs.com/ (Leaflet Hauptseite)&lt;br /&gt;
 https://leaflet-extras.github.io/leaflet-providers/preview/index.html (Karten Provider)&lt;br /&gt;
 https://github.com/Leaflet/Leaflet.markercluster (Doku für Cluster Modul)&lt;br /&gt;
== Überblick ==&lt;br /&gt;
Wird aus Zeitgründen vom Entwickler nicht sehr aktiv weitergepflegt. Allerdings gibt es ordentlichen Support im Forum und ein paar Forks auf Github.&lt;br /&gt;
&lt;br /&gt;
Man kann für spezielle Anforderungen auch nur das Feld im Backend nutzen und Leaflet im Frontend selbst aufsetzen bzw. eigene Skripte nutzen. Das JavaScript für die Frontendausgabe im Modul findet man in:&lt;br /&gt;
 MarkupLeafletMap.js (JavaScript für Frontend-Ausgabe)&lt;br /&gt;
 MarkupLeafletMap.module (Inline JS für Frontend ) &lt;br /&gt;
&lt;br /&gt;
== Quickstart ==&lt;br /&gt;
* Benötigt die Konfiguration von &amp;#039;&amp;#039;&amp;#039;$additionalHeaderData&amp;#039;&amp;#039;&amp;#039;. Das ist einfach ein String der in &amp;#039;&amp;#039;_init.php&amp;#039;&amp;#039; angelegt und im &amp;#039;&amp;#039;Header eingebunden&amp;#039;&amp;#039; wird. Damit lassen sich Zusätzliche Daten per Template rendern. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Feldname&amp;#039;&amp;#039;&amp;#039; im Backend ist hier &amp;#039;&amp;#039;&amp;#039;map_leaflet&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Achtung Bug (V2.8.1): Immer den Geocoder auf der Seite benutzen. Die Standarddaten aus der Feldkonfiguration werden nicht richtig übernommen (Adressfeld) und es gibt Ausgabefehler.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($page, &amp;#039;map_leaflet ,array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;content_bottom&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Button GM --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Lange+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Map --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;col span_12&amp;quot;&amp;gt;&amp;#039;.$mapMarkup.&amp;#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Daten manuell auslesen und verarbeiten ==&lt;br /&gt;
Einfaches Beispiel das auch bei AJAX Seiten funktioniert und einen Button zur Google Maps Wegbeschreibung enthält.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// If AJAX put this in _init.php else uncomment next two lines&lt;br /&gt;
// $map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
// $additionalHeaderData = $map-&amp;gt;getLeafletMapHeaderLines();&lt;br /&gt;
&lt;br /&gt;
$myAdress = $page-&amp;gt;map_leaflet-&amp;gt;address;	// outputs the address you entered&lt;br /&gt;
$myLat = $page-&amp;gt;map_leaflet-&amp;gt;lat; 		// outputs the latitude&lt;br /&gt;
$myLng = $page-&amp;gt;map_leaflet-&amp;gt;lng; 		// outputs the longitude&lt;br /&gt;
$myZoom = $page-&amp;gt;map_leaflet-&amp;gt;zoom;		// outputs the zoom level&lt;br /&gt;
&lt;br /&gt;
$mapMarkup = &amp;quot;&lt;br /&gt;
&amp;lt;div id=&amp;#039;mleafletmap1&amp;#039;style=&amp;#039;height:400px;&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var mleafletmap1 = new jsMarkupLeafletMap();&lt;br /&gt;
 mleafletmap1.setOption(&amp;#039;zoom&amp;#039;, $myZoom);&lt;br /&gt;
  mleafletmap1.init(&amp;#039;mleafletmap1&amp;#039;, $myLat, $myLng, &amp;#039;OpenStreetMap.Mapnik&amp;#039;);&lt;br /&gt;
  var default_marker_icon = L.AwesomeMarkers.icon({ icon: &amp;#039;home&amp;#039;, iconColor: &amp;#039;white&amp;#039;, prefix: &amp;#039;fa&amp;#039;, markerColor: &amp;#039;darkblue&amp;#039; });&lt;br /&gt;
  mleafletmap1.addMarkerIcon(default_marker_icon, $myLat, $myLng, &amp;#039;/kontakt/&amp;#039;, &amp;#039;Kontakt&amp;#039;, &amp;#039;&amp;#039;);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$content .= &amp;#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;gmroute&amp;quot; style=&amp;quot;z-index: 30001;position: relative;height: 24px;right: 20px;top: 40px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a class=&amp;quot;gmroute-link&amp;quot; href=&amp;quot;https://www.google.de/maps/dir//Meine+Str.+9+D-72829+Engstingen&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;float: right;&amp;quot;&amp;gt;Route planen&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;col-sm-12&amp;quot; style=&amp;quot;height:400px;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
    .$mapMarkup.&amp;#039;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Multiple Markers ===&lt;br /&gt;
Die Render Funktion kann auch mit mehreren Seitenobjekten umgehen und erstellt dann eine Karte mit mehreren Markern.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$items = $pages-&amp;gt;find(&amp;quot;A SELECTOR THAT GETS YOUR PAGES WITH MARKER FIELDS&amp;quot;);&lt;br /&gt;
echo $map-&amp;gt;render($items, &amp;#039;YOUR MARKER FIELD&amp;#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Multiple Markers von selektierten Seiten ===&lt;br /&gt;
Es sollen Orte (LeafletMapMarker) von Unterseiten geholt werden und aus diesen eine Map mit mehreren Markern generiert werden. Viele Marker auf engem Raum werden geclustert.&lt;br /&gt;
&lt;br /&gt;
Voraussetzungen im Beispiel&lt;br /&gt;
* die Kindseiten werden über ihr template selektiert. Im Beispiel wird das durch ein Textfeld im Parent Template festgelegt (Feldname template_title)&lt;br /&gt;
* der Leaflet code wird nur bei Bedarf geladen. Das geschieht über eine Switch Anweisung im Repeater&lt;br /&gt;
* Leaflet Dateien sind lokal hinterlegt (siehe js und css Anweisungen).&lt;br /&gt;
 &lt;br /&gt;
mytemplate.php &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
$map = wire(&amp;#039;modules&amp;#039;)-&amp;gt;get(&amp;#039;MarkupLeafletMap&amp;#039;);&lt;br /&gt;
$options = array(&amp;#039;markerColour&amp;#039; =&amp;gt; &amp;#039;green&amp;#039;);&lt;br /&gt;
$mySelector = &amp;#039;template=event&amp;#039;;&lt;br /&gt;
$places = $pages-&amp;gt;find($mySelector);&lt;br /&gt;
$mapMarkup = $map-&amp;gt;render($places, &amp;#039;location&amp;#039; ,$options);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Leaflet Skripte lokal einbinden (keine externen Skripte laden) ===&lt;br /&gt;
Dies sind die benötigten Header Zeilen. leaflet.css und leaflet.js sollte dann entsprechend vorhanden sein. Der Rest kommat aus dem Modul Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Font Awesome muß ebenfalls vorhanden sein (Bisher - September 2018, die 4er Version).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalHeaderData = &amp;#039;&lt;br /&gt;
&amp;lt;!-- Styles supporting the use of Leaflet.js --&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/MarkerCluster.css&amp;quot; /&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;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;styles/MarkerCluster.Custom.css&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Scripts supporting the use of Leaflet.js --&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;templates.&amp;#039;vendors/leaflet/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-markercluster/leaflet.markercluster.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-providers/leaflet-providers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/MarkupLeafletMap.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Extend Leaflet with Awesome.Markers --&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;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;&amp;#039;.$config-&amp;gt;urls-&amp;gt;siteModules.&amp;#039;FieldtypeLeafletMapMarker/assets/leaflet-awesome-markers/leaflet.awesome-markers.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scroll Zoom abschalten ===&lt;br /&gt;
Am einfachsten im Modul (Nachteil: Vorsicht beim Update)&lt;br /&gt;
&lt;br /&gt;
Evtl. fürs Frontend könnte man auch im Nachhinein in einem eigenen Skript abschalten über die Funktion:&lt;br /&gt;
 map.scrollWheelZoom.disable(); // map ist die Mapinstanz. Muß evtl. angepasst werden.&lt;br /&gt;
&lt;br /&gt;
==== Im Frontend (Fieldtype)====&lt;br /&gt;
 /site/modules/FieldtypeLeafletMapMarker/MarkupLeafletMap.js&lt;br /&gt;
In MarkupLeafletMap.js die Option hinzufügen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
this.options = {&lt;br /&gt;
        zoom: 10,&lt;br /&gt;
        center: null,&lt;br /&gt;
        scrollWheelZoom: false, // diese option einfügen&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    this._currentURL = &amp;#039;&amp;#039;;&lt;br /&gt;
    this.init = function(mapID, lat, lng, provider) {&lt;br /&gt;
        if(lat != 0) this.map = L.map(mapID, {&lt;br /&gt;
          center: [lat, lng],&lt;br /&gt;
          zoom: this.options.zoom,&lt;br /&gt;
          scrollWheelZoom: this.options.scrollWheelZoom // und dieses wenn nicht vorhanden&lt;br /&gt;
        } );&lt;br /&gt;
        L.tileLayer.provider(provider).addTo(this.map);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Im Backend ====&lt;br /&gt;
Hier muß mann den Code des Inputfield anpassen. Direkt in den Optionen hat das bei mir nicht funktioniert. Sieht so aus als ob nur der zoom statt alle Optionen gesetzt wird. Daher einfach nach der Instanzerzeugung der karte den ScrollWheelZoom abschalten:&lt;br /&gt;
&lt;br /&gt;
FieldtypeLeafletMapMarker/InputfieldLeafletMapMarker.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var map = L.map(document.getElementById(mapId)). setView([lat, lng], options.zoom); // nach dem hier&lt;br /&gt;
map.scrollWheelZoom.disable(); // dieses einfügen.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Modul Gesture Handling ===&lt;br /&gt;
 [[Leaflet - Gesture Handling]]&lt;br /&gt;
 https://elmarquis.github.io/Leaflet.GestureHandling/&lt;br /&gt;
 Bildet das Verhalten von Google Maps nach:&lt;br /&gt;
Desktop &lt;br /&gt;
* Karte Ignoriert Mausrad&lt;br /&gt;
* User wird Informiert mit ctrl+scrool Karte zoomen&lt;br /&gt;
Mobile&lt;br /&gt;
* Karte ignoriert Ein Finger Drag&lt;br /&gt;
* User wird über 2 Finger Pan informiert&lt;br /&gt;
&lt;br /&gt;
==== In ProcessWire einbauen ====&lt;br /&gt;
* Unterordner &amp;#039;dist&amp;#039; in &amp;#039;Leaflet.GestureHandling&amp;#039; umbenennen und im FieldtypeLeafletMapMarker Modul unter assets ablegen&lt;br /&gt;
&lt;br /&gt;
=== Allgemein ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;#039;map&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
	var cities = new L.LayerGroup();&lt;br /&gt;
&lt;br /&gt;
	L.marker([39.61, -105.02]).bindPopup(&amp;#039;This is Littleton, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.74, -104.99]).bindPopup(&amp;#039;This is Denver, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.73, -104.8]).bindPopup(&amp;#039;This is Aurora, CO.&amp;#039;).addTo(cities),&lt;br /&gt;
	L.marker([39.77, -105.23]).bindPopup(&amp;#039;This is Golden, CO.&amp;#039;).addTo(cities);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	var mbAttr = &amp;#039;Map data &amp;amp;copy; &amp;lt;a href=&amp;quot;http://openstreetmap.org&amp;quot;&amp;gt;OpenStreetMap&amp;lt;/a&amp;gt; contributors, &amp;#039; +&lt;br /&gt;
			&amp;#039;&amp;lt;a href=&amp;quot;http://creativecommons.org/licenses/by-sa/2.0/&amp;quot;&amp;gt;CC-BY-SA&amp;lt;/a&amp;gt;, &amp;#039; +&lt;br /&gt;
			&amp;#039;Imagery © &amp;lt;a href=&amp;quot;http://mapbox.com&amp;quot;&amp;gt;Mapbox&amp;lt;/a&amp;gt;&amp;#039;,&lt;br /&gt;
		mbUrl = &amp;#039;https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	var grayscale   = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.light&amp;#039;, attribution: mbAttr}),&lt;br /&gt;
		streets  = L.tileLayer(mbUrl, {id: &amp;#039;mapbox.streets&amp;#039;,   attribution: mbAttr});&lt;br /&gt;
&lt;br /&gt;
	var map = L.map(&amp;#039;map&amp;#039;, {&lt;br /&gt;
		center: [39.73, -104.99],&lt;br /&gt;
		zoom: 10,&lt;br /&gt;
		layers: [grayscale, cities]&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	var baseLayers = {&lt;br /&gt;
		&amp;quot;Grayscale&amp;quot;: grayscale,&lt;br /&gt;
		&amp;quot;Streets&amp;quot;: streets&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var overlays = {&lt;br /&gt;
		&amp;quot;Cities&amp;quot;: cities&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	L.control.layers(baseLayers, overlays).addTo(map);&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probleme beheben ==&lt;br /&gt;
=== Feld zeigt an Error Geocoding ===&lt;br /&gt;
File Cache komplett löschen (assets/cache/...)&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23638</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23638"/>
		<updated>2019-02-12T10:50:42Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
 [[jQuery - FormData Objekt (AJAX)]]&lt;br /&gt;
&lt;br /&gt;
== Erweiterung des Beispiels ProcessWire Upload Formular ==&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
* Im Fehlerfall Fehlermeldungen an passender Stelle ausgeben&lt;br /&gt;
* Im Erfolgsfall Dateien verarbeiten und PW Seiten anlegen&lt;br /&gt;
* Im Erfolgsfall Formular per JavaScript aus der Seite entfernen und Erfolgsmeldung ausgeben&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
Als erstes passen wir die Datei an, die für die Markup-Erzueugung zuständig ist (basic-upload-ajax.php). Im ursprünglichen Beispiel war es basic-upload.php.&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Datei für Verarbeitung der AJAX Requests einbinden===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Markup bei Ajax Requests blockieren ===&lt;br /&gt;
Wir rufen das gleiche Skript bei Ajax Requests auf wie bei normalen. Daher müssen wir aufpassen, das kein unnötiges Markup ausgegeben wird. Da wir beim Ajax Request immer die Variable ajax=1 mitgeben können wir das ganz einfach machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
 &amp;lt;!-- das ganze Markup... --&amp;gt;&lt;br /&gt;
 &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Markup für Fehlerausgaben über AJAX vorbereiten ===&lt;br /&gt;
Damit wir die Fehlerausgaben direkt bei den betreffenden Feldern plazieren können vergeben wir Klassen, die auf den Feldnamen basieren. Später können wir das im JavaScript nutzen und die Labels im Fehlerfall einfärben, sowie eine Meldung an der Input Box ausgeben.&lt;br /&gt;
 &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachrichtenbox unter dem Formular ===&lt;br /&gt;
Am Ende des Formulars bauen wir noch eine Box für Nachrichten ein und einen Upload Indikator. Das machen wir direkt nach dem Formular. Das Formular wird nach erfolgreichem Upload ausgeblendet, dann wollen wir aber trotzdem noch die Möglichkeit für eine Nachricht haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Formular verarbeitung erweitern ==&lt;br /&gt;
Die Verarbeitung liegt in form-process.php Hier müssen wir ebenfalls ein paar Routinen einfügen, die für das AJAX Handling zuständig sind.&lt;br /&gt;
&lt;br /&gt;
=== AjaxResponse ===&lt;br /&gt;
Dafür setzen wir ein &amp;#039;&amp;#039;&amp;#039;mehrdimensionales Array ein. Dies wird später in ein JSON Objekt&amp;#039;&amp;#039;&amp;#039; umgewandelt und an das Skript zurückgeschickt. Es enthält den &amp;#039;&amp;#039;&amp;#039;Status success&amp;#039;&amp;#039;&amp;#039;. Wenn der True ist hat alles geklappt. Dafür können wir also später die ohnehin schon für den nicht AJAX Ablauf vorhandene $success Variable einsetzen.&lt;br /&gt;
&lt;br /&gt;
Das Array errors entspricht ebenfalls der $error Varible, die wir bei der Verarbeitung bisher schon genutzt haben.&lt;br /&gt;
&lt;br /&gt;
Damit wir noch die Möglichkeit für allgemeine Nachrichten haben nehmen wir noch ein zweites Array hinzu nämlich messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&lt;br /&gt;
// neue Variable die unsere AJAX Antworten enthält. &lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
//...&lt;br /&gt;
// nach der POST Vars Validierung geben wir im Fehler Fall über AJAX die Fehler zurück:&lt;br /&gt;
/**&lt;br /&gt;
* if ajax request and we have errors sende errors back&lt;br /&gt;
*/&lt;br /&gt;
if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
   //var_dump($errors);&lt;br /&gt;
   $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
   $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
   echo(json_encode($ajaxResponse));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// ... &lt;br /&gt;
// Wenn alles geklappt hat brauchen wir eine Erfolgsnachricht&lt;br /&gt;
// Deshalb am Ende der PW Seiten Erzeugung im Success Block ein neues Statement:&lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
  echo(json_encode($ajaxResponse));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Auch wenn das Formular korrekt ausgefüllt wurde kann es bei der Verarbeitung noch zu Fehlern kommen. &lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Die Formulardaten konnten leider nicht verarbeitet werden. Versuchen Sie es später noch einmal oder melden sie sich direkt bei uns.&amp;#039;;&lt;br /&gt;
  echo(json_encode($ajaxReponse));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 3 - AJAX Skripte ==&lt;br /&gt;
Das Skript das wir in Schritt 1 eingebaut haben sieht etwa so aus. &lt;br /&gt;
&lt;br /&gt;
Wir fangen den Klick auf den Submit Button ab, lesen die Formulardaten ein und schicken Sie an das PHP Skript. &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel nutzen wir das FormularData Objekt. Das unterstützen alle aktuellen Browser und erspart uns viel Arbeit. Man könnte zur Erweiterung noch einen Test mit Modernizer o.ä. einbauen und im Zweifel das Formular dann doch ohne Ajax absenden.&lt;br /&gt;
&lt;br /&gt;
Die Antwort werten wir aus. Im Erfolgsfall (wenn der Server success=true zurückgibt entfernen wir das form Markup, damit man das Formular nicht nochmal abschickt (das würde einen Fehler ergeben, da das Sicherheitstoken nicht mehr stimmt. Die Seite muss zunächst neu geladen werden (hier könnte man evtl. noch einen Link einbauen, wenn zu erwarten ist, dass das Formular mehrfach hintereinander genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Im Fehlerfall gibt und das PHP Skript das Objekt errors zurück. Das enthält als Schlüssel den Feldnamen und einen Fehlertext. Da wir für die Labels und die Inputfelder zu den Feldnamen passende Klassen gesetzt haben, können wir einfach eine Fehlerklasse für das Label setzen (error) und den Fehlertext beim Inputfeld ausgeben.&lt;br /&gt;
&lt;br /&gt;
Als Extra setzen wir noch einen Upload Indikator. Schicker wäre eine animierte Grafik, die man während des Übermittelns sichtbar macht.&lt;br /&gt;
&lt;br /&gt;
Dann haben wir noch einen Teil in dem wir die ganzen Fehlerklassen und Nachrichten löschen. So wird unser Formular nach dem erneuten absenden resettet, bevor die neuen Meldungen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
		var href;&lt;br /&gt;
		var title;&lt;br /&gt;
		var uploadIndicator = document.getElementById(&amp;#039;upload-indicator&amp;#039;);&lt;br /&gt;
		$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;#submit&amp;#039;,function(e) { // Submit Button clicked&lt;br /&gt;
			// Update button text.&lt;br /&gt;
				uploadIndicator.innerHTML = &amp;#039;Uploading...&amp;#039;;&lt;br /&gt;
				href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
				title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
				// load content via AJAX&lt;br /&gt;
				handleData(href);&lt;br /&gt;
				// prevent click and reload&lt;br /&gt;
				e.preventDefault();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		function handleData(url){&lt;br /&gt;
&lt;br /&gt;
				// variable for ajaxResponse&lt;br /&gt;
				$ajaxResponse = &amp;#039;&amp;#039;;&lt;br /&gt;
				// Form data&lt;br /&gt;
&lt;br /&gt;
				// Not working with images or files:&lt;br /&gt;
				// var data = $(&amp;#039;form&amp;#039;).serialize();&lt;br /&gt;
				// $.post(&amp;#039;url&amp;#039;, data);&lt;br /&gt;
&lt;br /&gt;
				var form = $(&amp;#039;form&amp;#039;)[0]; // You need to use standard javascript object here&lt;br /&gt;
				var fd = new FormData(form);&lt;br /&gt;
				//var myform = document.getElementById(&amp;quot;myform&amp;quot;);&lt;br /&gt;
				//var fd = new FormData(myform);&lt;br /&gt;
				fd.append(&amp;quot;ajax&amp;quot;, &amp;#039;true&amp;#039;);&lt;br /&gt;
				// send Ajax request&lt;br /&gt;
				$.ajax({&lt;br /&gt;
						type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
						url: url,&lt;br /&gt;
						data: fd,&lt;br /&gt;
						cache: false,&lt;br /&gt;
						processData: false,&lt;br /&gt;
						contentType: false,&lt;br /&gt;
						dataType: &amp;#039;json&amp;#039;, // tell jquery json response -&amp;gt; automatic deserialization&lt;br /&gt;
						success: function(response,status){&lt;br /&gt;
							$ajaxResponse = response;// store in $ajaxResponse&lt;br /&gt;
						}&lt;br /&gt;
				}).done(function(){ // when finished and successful&lt;br /&gt;
					// cleanup all messages and errors&lt;br /&gt;
					uploadIndicator.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
					$(&amp;#039;label&amp;#039;).removeClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
					$(&amp;#039;.messages&amp;#039;).html(&amp;#039; &amp;#039;);&lt;br /&gt;
					if($ajaxResponse.success){&lt;br /&gt;
						//success -&amp;gt; remove form and thank you&lt;br /&gt;
						$(&amp;#039;#myform&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
						// Messages&lt;br /&gt;
						$.each($ajaxResponse.messages, function(key,val){&lt;br /&gt;
							$(&amp;#039;#message-box&amp;#039;).append(&amp;#039;&amp;lt;div&amp;gt;&amp;#039; + val + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
						});&lt;br /&gt;
					}else{ // s.th. gone wrong -&amp;gt; handle errors&lt;br /&gt;
						$.each($ajaxResponse.errors, function(key, val) {&lt;br /&gt;
							// set error class&lt;br /&gt;
							console.log(key + &amp;#039; -&amp;gt; &amp;#039; + val);&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-label&amp;#039;).addClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
							// set error messages&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-messages&amp;#039;).html(val);&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				}); // end of ajax().done()&lt;br /&gt;
		} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Skripte komplett ==&lt;br /&gt;
=== basic-upload-ajax.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/head.inc&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;#039;&amp;lt;p class=&amp;quot;message&amp;quot;&amp;gt;Vielen Dank für Ihre Nachricht!&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;,&amp;#039;images&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
  include(&amp;quot;./partials/basic-upload-ajax/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;csrf-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname-label&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;fullname-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot; id=&amp;quot;message-label&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;message-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscibe-label&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;newsletter_subscribe-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot; id=&amp;quot;images-label&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;images-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div id=&amp;quot;upload-indicator&amp;quot; class=&amp;quot;hidden&amp;quot;&amp;gt;Upload Indicator&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;message-box&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/footer-js.inc&amp;#039;);	?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== form-process.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
$messages          = null;&lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
//var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for populating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if ajax request and we have errors sende errors back&lt;br /&gt;
     */&lt;br /&gt;
    if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
      //var_dump($errors);&lt;br /&gt;
      $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
      $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
      echo(json_encode($ajaxResponse));&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						//print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    //var_dump($form_fields[$pf]);&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxResponse));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&lt;br /&gt;
            }&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Bilder konnten nicht gespeichert werden. Versuchen Sie es später noch einmal.&amp;#039;;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxReponse));&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;
== Helferlein ==&lt;br /&gt;
=== Aufräumen von Temporären Files ===&lt;br /&gt;
Durch fehlgelaufene Skripts können sich im temporären Verzeichnis alte Dateien ansammeln. Mit einem Cronjob oder auch bei jedem Anlegen einer neuen Seite, könnte man z.B. ältere Dateien löschen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Delete older files (default 86400s = 24h)- use regularly&lt;br /&gt;
 * string $dir - path to files&lt;br /&gt;
 * int $seconds - all files older then $seconds&lt;br /&gt;
 * string $fileExtension only files with this extension (i.e. .jpg)&lt;br /&gt;
 */&lt;br /&gt;
function deleteOlderFiles( $dir=&amp;#039;temp/&amp;#039;, $seconds=86400, $fileExtension=&amp;#039;&amp;#039; ){&lt;br /&gt;
	foreach (glob($dir.&amp;quot;*&amp;quot;.$fileExtension) as $file) {&lt;br /&gt;
		//For jpg images this would be: glob($dir.&amp;quot;*.jpg&amp;quot;)&lt;br /&gt;
		if(time() - filectime($file) &amp;gt; $seconds){&lt;br /&gt;
			unlink($file);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Alte Seiten löschen ===&lt;br /&gt;
Auch die angelegten Seiten sollte man nach einer gewissen Zeit löschen. Nicht nur um den Server zu schonen, sondern auch aus Datenschutzgründen.&lt;br /&gt;
&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23637</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23637"/>
		<updated>2019-02-12T10:22:13Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
 [[jQuery - FormData Objekt (AJAX)]]&lt;br /&gt;
&lt;br /&gt;
== Erweiterung des Beispiels ProcessWire Upload Formular ==&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
* Im Fehlerfall Fehlermeldungen an passender Stelle ausgeben&lt;br /&gt;
* Im Erfolgsfall Dateien verarbeiten und PW Seiten anlegen&lt;br /&gt;
* Im Erfolgsfall Formular per JavaScript aus der Seite entfernen und Erfolgsmeldung ausgeben&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
Als erstes passen wir die Datei an, die für die Markup-Erzueugung zuständig ist (basic-upload-ajax.php). Im ursprünglichen Beispiel war es basic-upload.php.&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Datei für Verarbeitung der AJAX Requests einbinden===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Markup bei Ajax Requests blockieren ===&lt;br /&gt;
Wir rufen das gleiche Skript bei Ajax Requests auf wie bei normalen. Daher müssen wir aufpassen, das kein unnötiges Markup ausgegeben wird. Da wir beim Ajax Request immer die Variable ajax=1 mitgeben können wir das ganz einfach machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
 &amp;lt;!-- das ganze Markup... --&amp;gt;&lt;br /&gt;
 &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Markup für Fehlerausgaben über AJAX vorbereiten ===&lt;br /&gt;
Damit wir die Fehlerausgaben direkt bei den betreffenden Feldern plazieren können vergeben wir Klassen, die auf den Feldnamen basieren. Später können wir das im JavaScript nutzen und die Labels im Fehlerfall einfärben, sowie eine Meldung an der Input Box ausgeben.&lt;br /&gt;
 &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachrichtenbox unter dem Formular ===&lt;br /&gt;
Am Ende des Formulars bauen wir noch eine Box für Nachrichten ein und einen Upload Indikator. Das machen wir direkt nach dem Formular. Das Formular wird nach erfolgreichem Upload ausgeblendet, dann wollen wir aber trotzdem noch die Möglichkeit für eine Nachricht haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Formular verarbeitung erweitern ==&lt;br /&gt;
Die Verarbeitung liegt in form-process.php Hier müssen wir ebenfalls ein paar Routinen einfügen, die für das AJAX Handling zuständig sind.&lt;br /&gt;
&lt;br /&gt;
=== AjaxResponse ===&lt;br /&gt;
Dafür setzen wir ein &amp;#039;&amp;#039;&amp;#039;mehrdimensionales Array ein. Dies wird später in ein JSON Objekt&amp;#039;&amp;#039;&amp;#039; umgewandelt und an das Skript zurückgeschickt. Es enthält den &amp;#039;&amp;#039;&amp;#039;Status success&amp;#039;&amp;#039;&amp;#039;. Wenn der True ist hat alles geklappt. Dafür können wir also später die ohnehin schon für den nicht AJAX Ablauf vorhandene $success Variable einsetzen.&lt;br /&gt;
&lt;br /&gt;
Das Array errors entspricht ebenfalls der $error Varible, die wir bei der Verarbeitung bisher schon genutzt haben.&lt;br /&gt;
&lt;br /&gt;
Damit wir noch die Möglichkeit für allgemeine Nachrichten haben nehmen wir noch ein zweites Array hinzu nämlich messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&lt;br /&gt;
// neue Variable die unsere AJAX Antworten enthält. &lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
//...&lt;br /&gt;
// nach der POST Vars Validierung geben wir im Fehler Fall über AJAX die Fehler zurück:&lt;br /&gt;
/**&lt;br /&gt;
* if ajax request and we have errors sende errors back&lt;br /&gt;
*/&lt;br /&gt;
if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
   //var_dump($errors);&lt;br /&gt;
   $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
   $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
   echo(json_encode($ajaxResponse));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// ... &lt;br /&gt;
// Wenn alles geklappt hat brauchen wir eine Erfolgsnachricht&lt;br /&gt;
// Deshalb am Ende der PW Seiten Erzeugung im Success Block ein neues Statement:&lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
  echo(json_encode($ajaxResponse));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Auch wenn das Formular korrekt ausgefüllt wurde kann es bei der Verarbeitung noch zu Fehlern kommen. &lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Die Formulardaten konnten leider nicht verarbeitet werden. Versuchen Sie es später noch einmal oder melden sie sich direkt bei uns.&amp;#039;;&lt;br /&gt;
  echo(json_encode($ajaxReponse));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 3 - AJAX Skripte ==&lt;br /&gt;
Das Skript das wir in Schritt 1 eingebaut haben sieht etwa so aus. &lt;br /&gt;
&lt;br /&gt;
Wir fangen den Klick auf den Submit Button ab, lesen die Formulardaten ein und schicken Sie an das PHP Skript. &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel nutzen wir das FormularData Objekt. Das unterstützen alle aktuellen Browser und erspart uns viel Arbeit. Man könnte zur Erweiterung noch einen Test mit Modernizer o.ä. einbauen und im Zweifel das Formular dann doch ohne Ajax absenden.&lt;br /&gt;
&lt;br /&gt;
Die Antwort werten wir aus. Im Erfolgsfall (wenn der Server success=true zurückgibt entfernen wir das form Markup, damit man das Formular nicht nochmal abschickt (das würde einen Fehler ergeben, da das Sicherheitstoken nicht mehr stimmt. Die Seite muss zunächst neu geladen werden (hier könnte man evtl. noch einen Link einbauen, wenn zu erwarten ist, dass das Formular mehrfach hintereinander genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Im Fehlerfall gibt und das PHP Skript das Objekt errors zurück. Das enthält als Schlüssel den Feldnamen und einen Fehlertext. Da wir für die Labels und die Inputfelder zu den Feldnamen passende Klassen gesetzt haben, können wir einfach eine Fehlerklasse für das Label setzen (error) und den Fehlertext beim Inputfeld ausgeben.&lt;br /&gt;
&lt;br /&gt;
Als Extra setzen wir noch einen Upload Indikator. Schicker wäre eine animierte Grafik, die man während des Übermittelns sichtbar macht.&lt;br /&gt;
&lt;br /&gt;
Dann haben wir noch einen Teil in dem wir die ganzen Fehlerklassen und Nachrichten löschen. So wird unser Formular nach dem erneuten absenden resettet, bevor die neuen Meldungen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
		var href;&lt;br /&gt;
		var title;&lt;br /&gt;
		var uploadIndicator = document.getElementById(&amp;#039;upload-indicator&amp;#039;);&lt;br /&gt;
		$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;#submit&amp;#039;,function(e) { // Submit Button clicked&lt;br /&gt;
			// Update button text.&lt;br /&gt;
				uploadIndicator.innerHTML = &amp;#039;Uploading...&amp;#039;;&lt;br /&gt;
				href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
				title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
				// load content via AJAX&lt;br /&gt;
				handleData(href);&lt;br /&gt;
				// prevent click and reload&lt;br /&gt;
				e.preventDefault();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		function handleData(url){&lt;br /&gt;
&lt;br /&gt;
				// variable for ajaxResponse&lt;br /&gt;
				$ajaxResponse = &amp;#039;&amp;#039;;&lt;br /&gt;
				// Form data&lt;br /&gt;
&lt;br /&gt;
				// Not working with images or files:&lt;br /&gt;
				// var data = $(&amp;#039;form&amp;#039;).serialize();&lt;br /&gt;
				// $.post(&amp;#039;url&amp;#039;, data);&lt;br /&gt;
&lt;br /&gt;
				var form = $(&amp;#039;form&amp;#039;)[0]; // You need to use standard javascript object here&lt;br /&gt;
				var fd = new FormData(form);&lt;br /&gt;
				//var myform = document.getElementById(&amp;quot;myform&amp;quot;);&lt;br /&gt;
				//var fd = new FormData(myform);&lt;br /&gt;
				fd.append(&amp;quot;ajax&amp;quot;, &amp;#039;true&amp;#039;);&lt;br /&gt;
				// send Ajax request&lt;br /&gt;
				$.ajax({&lt;br /&gt;
						type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
						url: url,&lt;br /&gt;
						data: fd,&lt;br /&gt;
						cache: false,&lt;br /&gt;
						processData: false,&lt;br /&gt;
						contentType: false,&lt;br /&gt;
						dataType: &amp;#039;json&amp;#039;, // tell jquery json response -&amp;gt; automatic deserialization&lt;br /&gt;
						success: function(response,status){&lt;br /&gt;
							$ajaxResponse = response;// store in $ajaxResponse&lt;br /&gt;
						}&lt;br /&gt;
				}).done(function(){ // when finished and successful&lt;br /&gt;
					// cleanup all messages and errors&lt;br /&gt;
					uploadIndicator.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
					$(&amp;#039;label&amp;#039;).removeClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
					$(&amp;#039;.messages&amp;#039;).html(&amp;#039; &amp;#039;);&lt;br /&gt;
					if($ajaxResponse.success){&lt;br /&gt;
						//success -&amp;gt; remove form and thank you&lt;br /&gt;
						$(&amp;#039;#myform&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
						// Messages&lt;br /&gt;
						$.each($ajaxResponse.messages, function(key,val){&lt;br /&gt;
							$(&amp;#039;#message-box&amp;#039;).append(&amp;#039;&amp;lt;div&amp;gt;&amp;#039; + val + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
						});&lt;br /&gt;
					}else{ // s.th. gone wrong -&amp;gt; handle errors&lt;br /&gt;
						$.each($ajaxResponse.errors, function(key, val) {&lt;br /&gt;
							// set error class&lt;br /&gt;
							console.log(key + &amp;#039; -&amp;gt; &amp;#039; + val);&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-label&amp;#039;).addClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
							// set error messages&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-messages&amp;#039;).html(val);&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				}); // end of ajax().done()&lt;br /&gt;
		} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Skripte komplett ==&lt;br /&gt;
=== basic-upload-ajax.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/head.inc&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;#039;&amp;lt;p class=&amp;quot;message&amp;quot;&amp;gt;Vielen Dank für Ihre Nachricht!&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;,&amp;#039;images&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
  include(&amp;quot;./partials/basic-upload-ajax/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;csrf-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname-label&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;fullname-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot; id=&amp;quot;message-label&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;message-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscibe-label&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;newsletter_subscribe-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot; id=&amp;quot;images-label&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;images-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div id=&amp;quot;upload-indicator&amp;quot; class=&amp;quot;hidden&amp;quot;&amp;gt;Upload Indicator&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;message-box&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/footer-js.inc&amp;#039;);	?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== form-process.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
$messages          = null;&lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
//var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for populating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if ajax request and we have errors sende errors back&lt;br /&gt;
     */&lt;br /&gt;
    if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
      //var_dump($errors);&lt;br /&gt;
      $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
      $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
      echo(json_encode($ajaxResponse));&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						//print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    //var_dump($form_fields[$pf]);&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxResponse));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&lt;br /&gt;
            }&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Bilder konnten nicht gespeichert werden. Versuchen Sie es später noch einmal.&amp;#039;;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxReponse));&lt;br /&gt;
            }&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>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23636</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23636"/>
		<updated>2019-02-12T10:21:23Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
 [[jQuery - FormData Objekt (AJAX)]]&lt;br /&gt;
&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
* Im Fehlerfall Fehlermeldungen an passender Stelle ausgeben&lt;br /&gt;
* Im Erfolgsfall Dateien verarbeiten und PW Seiten anlegen&lt;br /&gt;
* Im Erfolgsfall Formular per JavaScript aus der Seite entfernen und Erfolgsmeldung ausgeben&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
Als erstes passen wir die Datei an, die für die Markup-Erzueugung zuständig ist (basic-upload-ajax.php). Im ursprünglichen Beispiel war es basic-upload.php.&lt;br /&gt;
&lt;br /&gt;
=== JavaScript Datei für Verarbeitung der AJAX Requests einbinden===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ausgabe des Markup bei Ajax Requests blockieren ===&lt;br /&gt;
Wir rufen das gleiche Skript bei Ajax Requests auf wie bei normalen. Daher müssen wir aufpassen, das kein unnötiges Markup ausgegeben wird. Da wir beim Ajax Request immer die Variable ajax=1 mitgeben können wir das ganz einfach machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
 &amp;lt;!-- das ganze Markup... --&amp;gt;&lt;br /&gt;
 &amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Markup für Fehlerausgaben über AJAX vorbereiten ===&lt;br /&gt;
Damit wir die Fehlerausgaben direkt bei den betreffenden Feldern plazieren können vergeben wir Klassen, die auf den Feldnamen basieren. Später können wir das im JavaScript nutzen und die Labels im Fehlerfall einfärben, sowie eine Meldung an der Input Box ausgeben.&lt;br /&gt;
 &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
 &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Nachrichtenbox unter dem Formular ===&lt;br /&gt;
Am Ende des Formulars bauen wir noch eine Box für Nachrichten ein und einen Upload Indikator. Das machen wir direkt nach dem Formular. Das Formular wird nach erfolgreichem Upload ausgeblendet, dann wollen wir aber trotzdem noch die Möglichkeit für eine Nachricht haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Formular verarbeitung erweitern ==&lt;br /&gt;
Die Verarbeitung liegt in form-process.php Hier müssen wir ebenfalls ein paar Routinen einfügen, die für das AJAX Handling zuständig sind.&lt;br /&gt;
&lt;br /&gt;
=== AjaxResponse ===&lt;br /&gt;
Dafür setzen wir ein &amp;#039;&amp;#039;&amp;#039;mehrdimensionales Array ein. Dies wird später in ein JSON Objekt&amp;#039;&amp;#039;&amp;#039; umgewandelt und an das Skript zurückgeschickt. Es enthält den &amp;#039;&amp;#039;&amp;#039;Status success&amp;#039;&amp;#039;&amp;#039;. Wenn der True ist hat alles geklappt. Dafür können wir also später die ohnehin schon für den nicht AJAX Ablauf vorhandene $success Variable einsetzen.&lt;br /&gt;
&lt;br /&gt;
Das Array errors entspricht ebenfalls der $error Varible, die wir bei der Verarbeitung bisher schon genutzt haben.&lt;br /&gt;
&lt;br /&gt;
Damit wir noch die Möglichkeit für allgemeine Nachrichten haben nehmen wir noch ein zweites Array hinzu nämlich messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&lt;br /&gt;
// neue Variable die unsere AJAX Antworten enthält. &lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
//...&lt;br /&gt;
// nach der POST Vars Validierung geben wir im Fehler Fall über AJAX die Fehler zurück:&lt;br /&gt;
/**&lt;br /&gt;
* if ajax request and we have errors sende errors back&lt;br /&gt;
*/&lt;br /&gt;
if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
   //var_dump($errors);&lt;br /&gt;
   $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
   $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
   echo(json_encode($ajaxResponse));&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
// ... &lt;br /&gt;
// Wenn alles geklappt hat brauchen wir eine Erfolgsnachricht&lt;br /&gt;
// Deshalb am Ende der PW Seiten Erzeugung im Success Block ein neues Statement:&lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
  echo(json_encode($ajaxResponse));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Auch wenn das Formular korrekt ausgefüllt wurde kann es bei der Verarbeitung noch zu Fehlern kommen. &lt;br /&gt;
if($ajax){&lt;br /&gt;
  $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
  $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
  $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Die Formulardaten konnten leider nicht verarbeitet werden. Versuchen Sie es später noch einmal oder melden sie sich direkt bei uns.&amp;#039;;&lt;br /&gt;
  echo(json_encode($ajaxReponse));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 3 - AJAX Skripte ==&lt;br /&gt;
Das Skript das wir in Schritt 1 eingebaut haben sieht etwa so aus. &lt;br /&gt;
&lt;br /&gt;
Wir fangen den Klick auf den Submit Button ab, lesen die Formulardaten ein und schicken Sie an das PHP Skript. &lt;br /&gt;
&lt;br /&gt;
In diesem Beispiel nutzen wir das FormularData Objekt. Das unterstützen alle aktuellen Browser und erspart uns viel Arbeit. Man könnte zur Erweiterung noch einen Test mit Modernizer o.ä. einbauen und im Zweifel das Formular dann doch ohne Ajax absenden.&lt;br /&gt;
&lt;br /&gt;
Die Antwort werten wir aus. Im Erfolgsfall (wenn der Server success=true zurückgibt entfernen wir das form Markup, damit man das Formular nicht nochmal abschickt (das würde einen Fehler ergeben, da das Sicherheitstoken nicht mehr stimmt. Die Seite muss zunächst neu geladen werden (hier könnte man evtl. noch einen Link einbauen, wenn zu erwarten ist, dass das Formular mehrfach hintereinander genutzt wird.&lt;br /&gt;
&lt;br /&gt;
Im Fehlerfall gibt und das PHP Skript das Objekt errors zurück. Das enthält als Schlüssel den Feldnamen und einen Fehlertext. Da wir für die Labels und die Inputfelder zu den Feldnamen passende Klassen gesetzt haben, können wir einfach eine Fehlerklasse für das Label setzen (error) und den Fehlertext beim Inputfeld ausgeben.&lt;br /&gt;
&lt;br /&gt;
Als Extra setzen wir noch einen Upload Indikator. Schicker wäre eine animierte Grafik, die man während des Übermittelns sichtbar macht.&lt;br /&gt;
&lt;br /&gt;
Dann haben wir noch einen Teil in dem wir die ganzen Fehlerklassen und Nachrichten löschen. So wird unser Formular nach dem erneuten absenden resettet, bevor die neuen Meldungen gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
		var href;&lt;br /&gt;
		var title;&lt;br /&gt;
		var uploadIndicator = document.getElementById(&amp;#039;upload-indicator&amp;#039;);&lt;br /&gt;
		$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;#submit&amp;#039;,function(e) { // Submit Button clicked&lt;br /&gt;
			// Update button text.&lt;br /&gt;
				uploadIndicator.innerHTML = &amp;#039;Uploading...&amp;#039;;&lt;br /&gt;
				href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
				title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
				// load content via AJAX&lt;br /&gt;
				handleData(href);&lt;br /&gt;
				// prevent click and reload&lt;br /&gt;
				e.preventDefault();&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		function handleData(url){&lt;br /&gt;
&lt;br /&gt;
				// variable for ajaxResponse&lt;br /&gt;
				$ajaxResponse = &amp;#039;&amp;#039;;&lt;br /&gt;
				// Form data&lt;br /&gt;
&lt;br /&gt;
				// Not working with images or files:&lt;br /&gt;
				// var data = $(&amp;#039;form&amp;#039;).serialize();&lt;br /&gt;
				// $.post(&amp;#039;url&amp;#039;, data);&lt;br /&gt;
&lt;br /&gt;
				var form = $(&amp;#039;form&amp;#039;)[0]; // You need to use standard javascript object here&lt;br /&gt;
				var fd = new FormData(form);&lt;br /&gt;
				//var myform = document.getElementById(&amp;quot;myform&amp;quot;);&lt;br /&gt;
				//var fd = new FormData(myform);&lt;br /&gt;
				fd.append(&amp;quot;ajax&amp;quot;, &amp;#039;true&amp;#039;);&lt;br /&gt;
				// send Ajax request&lt;br /&gt;
				$.ajax({&lt;br /&gt;
						type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
						url: url,&lt;br /&gt;
						data: fd,&lt;br /&gt;
						cache: false,&lt;br /&gt;
						processData: false,&lt;br /&gt;
						contentType: false,&lt;br /&gt;
						dataType: &amp;#039;json&amp;#039;, // tell jquery json response -&amp;gt; automatic deserialization&lt;br /&gt;
						success: function(response,status){&lt;br /&gt;
							$ajaxResponse = response;// store in $ajaxResponse&lt;br /&gt;
						}&lt;br /&gt;
				}).done(function(){ // when finished and successful&lt;br /&gt;
					// cleanup all messages and errors&lt;br /&gt;
					uploadIndicator.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
					$(&amp;#039;label&amp;#039;).removeClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
					$(&amp;#039;.messages&amp;#039;).html(&amp;#039; &amp;#039;);&lt;br /&gt;
					if($ajaxResponse.success){&lt;br /&gt;
						//success -&amp;gt; remove form and thank you&lt;br /&gt;
						$(&amp;#039;#myform&amp;#039;).html(&amp;#039;&amp;#039;);&lt;br /&gt;
						// Messages&lt;br /&gt;
						$.each($ajaxResponse.messages, function(key,val){&lt;br /&gt;
							$(&amp;#039;#message-box&amp;#039;).append(&amp;#039;&amp;lt;div&amp;gt;&amp;#039; + val + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
						});&lt;br /&gt;
					}else{ // s.th. gone wrong -&amp;gt; handle errors&lt;br /&gt;
						$.each($ajaxResponse.errors, function(key, val) {&lt;br /&gt;
							// set error class&lt;br /&gt;
							console.log(key + &amp;#039; -&amp;gt; &amp;#039; + val);&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-label&amp;#039;).addClass(&amp;#039;error&amp;#039;);&lt;br /&gt;
							// set error messages&lt;br /&gt;
							$(&amp;#039;#&amp;#039;+key+&amp;#039;-messages&amp;#039;).html(val);&lt;br /&gt;
						});&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				}); // end of ajax().done()&lt;br /&gt;
		} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PHP Skripte komplett ==&lt;br /&gt;
=== basic-upload-ajax.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;de&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/head.inc&amp;#039;); ?&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;#039;&amp;lt;p class=&amp;quot;message&amp;quot;&amp;gt;Vielen Dank für Ihre Nachricht!&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;,&amp;#039;images&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
  include(&amp;quot;./partials/basic-upload-ajax/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;csrf-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname-label&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;fullname-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot; id=&amp;quot;email-label&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;email-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot; id=&amp;quot;message-label&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;message-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscibe-label&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;newsletter_subscribe-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;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;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot; id=&amp;quot;images-label&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;div id=&amp;quot;images-messages&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div id=&amp;quot;upload-indicator&amp;quot; class=&amp;quot;hidden&amp;quot;&amp;gt;Upload Indicator&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div id=&amp;quot;message-box&amp;quot; class=&amp;quot;messages&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&amp;gt;&lt;br /&gt;
&amp;lt;?php include(&amp;#039;partials/footer-js.inc&amp;#039;);	?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== form-process.php ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
$messages          = null;&lt;br /&gt;
$ajaxResponse      = array( &amp;#039;success&amp;#039; =&amp;gt; false, &amp;#039;errors&amp;#039; =&amp;gt; null, &amp;#039;messages&amp;#039; =&amp;gt; array() );&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
//var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for populating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if ajax request and we have errors sende errors back&lt;br /&gt;
     */&lt;br /&gt;
    if($ajax &amp;amp;&amp;amp; !empty($errors)){&lt;br /&gt;
      //var_dump($errors);&lt;br /&gt;
      $ajaxResponse[&amp;#039;success&amp;#039;] = false;&lt;br /&gt;
      $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
      echo(json_encode($ajaxResponse));&lt;br /&gt;
    }&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						//print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    //var_dump($form_fields[$pf]);&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = $success_message;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxResponse));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&lt;br /&gt;
            }&lt;br /&gt;
            if($ajax){&lt;br /&gt;
              $ajaxResponse[&amp;#039;success&amp;#039;] = $success;&lt;br /&gt;
              $ajaxResponse[&amp;#039;errors&amp;#039;] = $errors;&lt;br /&gt;
              $ajaxResponse[&amp;#039;messages&amp;#039;][] = &amp;#039;Bilder konnten nicht gespeichert werden. Versuchen Sie es später noch einmal.&amp;#039;;&lt;br /&gt;
              //var_dump($errors);&lt;br /&gt;
              echo(json_encode($ajaxReponse));&lt;br /&gt;
            }&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>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Browser_-_Compatibility_Detection&amp;diff=23635</id>
		<title>Browser - Compatibility Detection</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Browser_-_Compatibility_Detection&amp;diff=23635"/>
		<updated>2019-02-11T14:11:24Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Browser JavaScript Kompatibilität testen ==&lt;br /&gt;
 https://www.quirksmode.org/js/support.html&lt;br /&gt;
&lt;br /&gt;
Der Trick ist immer auf Arrays oder Objekte zu testen nicht auf Funktionen. Wenn eine Funktion nicht existiert gibt es eine Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
Object detection - Yes&lt;br /&gt;
Instead, we simply look if the browser supports the object (method, array or property) we want to use. Let’s continue with the mouseover example. This script relies on the document.images array, so first and foremost we&amp;#039;ll have to detect if the browser supports it. This is done by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (document.images)&lt;br /&gt;
{&lt;br /&gt;
	do something with the images array&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you have a fail safe method of seeing if any browser can handle mouseovers. The if-statements checks if the array document.images exists. If it does (document.images) is true and the script is executed. If the images array doesn&amp;#039;t exist it becomes false and the script is not executed.&lt;br /&gt;
&lt;br /&gt;
Another common detect is for window.focus. This is a method (a command by which you tell JavaScript to do something for you). If we want to use the method, we&amp;#039;ll have to check first if the browser supports it.&lt;br /&gt;
&lt;br /&gt;
Note the correct way of doing this: you ask for the method without brackets. This code&lt;br /&gt;
&lt;br /&gt;
 if (window.focus)&lt;br /&gt;
means: &amp;quot;If the focus method is supported&amp;quot;, while this code&lt;br /&gt;
&lt;br /&gt;
 if (window.focus())&lt;br /&gt;
means: &amp;quot;If you can put the focus on the window&amp;quot; and assumes that focus is supported. If it isn&amp;#039;t, this line of code creates errors. The brackets () actually execute the focus command, which is not what we want in this case. So we check it without the brackets (see if it exists) and only when the browser passes the check we actually execute the command by adding brackets:&lt;br /&gt;
&lt;br /&gt;
 if (window.focus) window.focus()&lt;br /&gt;
&lt;br /&gt;
== Browser Feature Detection Snippets ==&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Browser_-_Compatibility_Detection&amp;diff=23634</id>
		<title>Browser - Compatibility Detection</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Browser_-_Compatibility_Detection&amp;diff=23634"/>
		<updated>2019-02-11T13:09:55Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „== Browser JavaScript Kompatibilität testen ==  https://www.quirksmode.org/js/support.html  Der Trick ist immer auf Arrays oder Objekte zu testen nicht auf Fu…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Browser JavaScript Kompatibilität testen ==&lt;br /&gt;
 https://www.quirksmode.org/js/support.html&lt;br /&gt;
&lt;br /&gt;
Der Trick ist immer auf Arrays oder Objekte zu testen nicht auf Funktionen. Wenn eine Funktion nicht existiert gibt es eine Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
Object detection - Yes&lt;br /&gt;
Instead, we simply look if the browser supports the object (method, array or property) we want to use. Let’s continue with the mouseover example. This script relies on the document.images array, so first and foremost we&amp;#039;ll have to detect if the browser supports it. This is done by&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (document.images)&lt;br /&gt;
{&lt;br /&gt;
	do something with the images array&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you have a fail safe method of seeing if any browser can handle mouseovers. The if-statements checks if the array document.images exists. If it does (document.images) is true and the script is executed. If the images array doesn&amp;#039;t exist it becomes false and the script is not executed.&lt;br /&gt;
&lt;br /&gt;
Another common detect is for window.focus. This is a method (a command by which you tell JavaScript to do something for you). If we want to use the method, we&amp;#039;ll have to check first if the browser supports it.&lt;br /&gt;
&lt;br /&gt;
Note the correct way of doing this: you ask for the method without brackets. This code&lt;br /&gt;
&lt;br /&gt;
 if (window.focus)&lt;br /&gt;
means: &amp;quot;If the focus method is supported&amp;quot;, while this code&lt;br /&gt;
&lt;br /&gt;
 if (window.focus())&lt;br /&gt;
means: &amp;quot;If you can put the focus on the window&amp;quot; and assumes that focus is supported. If it isn&amp;#039;t, this line of code creates errors. The brackets () actually execute the focus command, which is not what we want in this case. So we check it without the brackets (see if it exists) and only when the browser passes the check we actually execute the command by adding brackets:&lt;br /&gt;
&lt;br /&gt;
 if (window.focus) window.focus()&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Browser_Kompatibilit%C3%A4t&amp;diff=23633</id>
		<title>Browser Kompatibilität</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Browser_Kompatibilit%C3%A4t&amp;diff=23633"/>
		<updated>2019-02-11T13:07:43Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Browser - Compatibility Detection]]&lt;br /&gt;
&lt;br /&gt;
Links und Übersichten. Was funktioniert wo ?&lt;br /&gt;
== SVG / Animation ==&lt;br /&gt;
Quelle: https://blog.kulturbanause.de/2017/04/svg-browsersupport-fuer-animationen-und-interaktionen/#more-16179&lt;br /&gt;
&amp;lt;table width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;Einbindung&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;&amp;lt;p&amp;gt;Browser&amp;lt;/p&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;:hover&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;link&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;keyframe animation&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;SMIL   animation&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;javascript animation&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;th&amp;gt;Media Query&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=&amp;quot;8&amp;quot;&amp;gt;Inline&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Safari&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Chrome&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Firefox&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Opera&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Edge&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-1&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 11&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 10&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 9&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=&amp;quot;8&amp;quot;&amp;gt;Object, Embed, iframe&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Safari&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Chrome&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Firefox&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Opera&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Edge&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-1&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 11&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 10&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 9&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=&amp;quot;8&amp;quot;&amp;gt;&amp;amp;lt;img&amp;amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Safari&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Chrome&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Firefox&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Opera&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Edge&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-1&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 11&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 10&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 9&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=&amp;quot;8&amp;quot;&amp;gt;CSS Background&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Safari&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Chrome&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Firefox&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Opera&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;Edge&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-1&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 11&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 10&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-partial-2&amp;quot;&amp;gt;Teilweise &amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;IE 9&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-con&amp;quot;&amp;gt;nein&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td class=&amp;quot;table-td-pro&amp;quot;&amp;gt;ja, abhängig vom Elternelement&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
1: Opacity und Fill funktionieren, transform nicht. Weiteres wurde nicht geprüft.&lt;br /&gt;
&lt;br /&gt;
2: Opacity funktioniert, transform und Fill nicht. Weiteres wurde nicht geprüft.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_FormData_Objekt_(AJAX)&amp;diff=23632</id>
		<title>JQuery - FormData Objekt (AJAX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_FormData_Objekt_(AJAX)&amp;diff=23632"/>
		<updated>2019-02-11T12:55:32Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://stackoverflow.com/questions/21044798/how-to-use-formdata-for-ajax-file-upload&lt;br /&gt;
For correct form data usage you need to do 2 steps.&lt;br /&gt;
&lt;br /&gt;
Preparations&lt;br /&gt;
&lt;br /&gt;
You can give your whole form to FormData() for processing&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var form = $(&amp;#039;form&amp;#039;)[0]; // You need to use standard javascript object here&lt;br /&gt;
var formData = new FormData(form);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or specify exact data for FormData()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var formData = new FormData();&lt;br /&gt;
formData.append(&amp;#039;section&amp;#039;, &amp;#039;general&amp;#039;);&lt;br /&gt;
formData.append(&amp;#039;action&amp;#039;, &amp;#039;previewImg&amp;#039;);&lt;br /&gt;
// Attach file&lt;br /&gt;
formData.append(&amp;#039;image&amp;#039;, $(&amp;#039;input[type=file]&amp;#039;)[0].files[0]); &lt;br /&gt;
Sending form&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajax request with jquery will looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
    url: &amp;#039;Your url here&amp;#039;,&lt;br /&gt;
    data: formData,&lt;br /&gt;
    type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
    contentType: false, // NEEDED, DON&amp;#039;T OMIT THIS (requires jQuery 1.6+)&lt;br /&gt;
    processData: false, // NEEDED, DON&amp;#039;T OMIT THIS&lt;br /&gt;
    // ... Other options like success and etc&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this it will send ajax request like you submit regular form with enctype=&amp;quot;multipart/form-data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Update: This request cannot work without type:&amp;quot;POST&amp;quot; in options since all files must be sent via POST request.&lt;br /&gt;
&lt;br /&gt;
Note:  contentType: false only available from jQuery 1.6 onwards&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_FormData_Objekt_(AJAX)&amp;diff=23631</id>
		<title>JQuery - FormData Objekt (AJAX)</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_FormData_Objekt_(AJAX)&amp;diff=23631"/>
		<updated>2019-02-11T12:55:12Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „For correct form data usage you need to do 2 steps.  Preparations  You can give your whole form to FormData() for processing &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For correct form data usage you need to do 2 steps.&lt;br /&gt;
&lt;br /&gt;
Preparations&lt;br /&gt;
&lt;br /&gt;
You can give your whole form to FormData() for processing&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var form = $(&amp;#039;form&amp;#039;)[0]; // You need to use standard javascript object here&lt;br /&gt;
var formData = new FormData(form);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or specify exact data for FormData()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var formData = new FormData();&lt;br /&gt;
formData.append(&amp;#039;section&amp;#039;, &amp;#039;general&amp;#039;);&lt;br /&gt;
formData.append(&amp;#039;action&amp;#039;, &amp;#039;previewImg&amp;#039;);&lt;br /&gt;
// Attach file&lt;br /&gt;
formData.append(&amp;#039;image&amp;#039;, $(&amp;#039;input[type=file]&amp;#039;)[0].files[0]); &lt;br /&gt;
Sending form&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ajax request with jquery will looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
    url: &amp;#039;Your url here&amp;#039;,&lt;br /&gt;
    data: formData,&lt;br /&gt;
    type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
    contentType: false, // NEEDED, DON&amp;#039;T OMIT THIS (requires jQuery 1.6+)&lt;br /&gt;
    processData: false, // NEEDED, DON&amp;#039;T OMIT THIS&lt;br /&gt;
    // ... Other options like success and etc&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this it will send ajax request like you submit regular form with enctype=&amp;quot;multipart/form-data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Update: This request cannot work without type:&amp;quot;POST&amp;quot; in options since all files must be sent via POST request.&lt;br /&gt;
&lt;br /&gt;
Note:  contentType: false only available from jQuery 1.6 onwards&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23630</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23630"/>
		<updated>2019-02-11T12:53:07Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
 [[jQuery - FormData Objekt (AJAX)]]&lt;br /&gt;
&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
* Unsichtbare Box für evtl. Fehlermeldungen direkt unter dem Submit Button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - AJAX Verarbeiten ==&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Ajax&amp;diff=23629</id>
		<title>ProcessWire - Ajax</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Ajax&amp;diff=23629"/>
		<updated>2019-02-11T10:16:49Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Man kann mit PW relativ einfach dynamische Webseiten erzeugen. Dabei werden nur die benötigten Teile der Webseite ausgetauscht, anstatt die Seite nach jedem Klick neu zu laden. So entsteht sehr schnell ein &amp;quot;App-Feeling&amp;quot;. ProcessWire unterstützt einen dabei.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/how-to-create-an-ajax-driven-theme-for-processwire--cms-26579 (Kurzanleitung)&lt;br /&gt;
 https://github.com/tutsplus/how-to-create-an-ajax-driven-theme-for-processwire (ProcessWire Profile mit AJAX)&lt;br /&gt;
&lt;br /&gt;
Allgemeines Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Links mit der Klasse ajax-link werden über JavaScript (meist jQuery) abgefangen und über AJAX an den Server geschickt.&lt;br /&gt;
* ProcessWire erkennt anhand der internen System-Variable $ajax dass ein AJAX Request vorliegt&lt;br /&gt;
* Mit einfachen Ifs kann man ProcessWire dazu bringen nur den gewünschten Content zu generieren &lt;br /&gt;
* Den zurückgegebenen HTML Inhalt mit jQuery austauschen. &lt;br /&gt;
&lt;br /&gt;
Natürlich sind auch JSON Antworten denkbar. Das kann man dann alles über JavaScript verarbeiten&lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Beispiel (bessere Struktur wäre wohl die Teile der Seiten in Variablen zu laden und dann die if Statements kompakt zu halten.&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;
// include page structure if not an ajax request&lt;br /&gt;
if(!$ajax):&lt;br /&gt;
    include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
&amp;lt;?php echo $pages-&amp;gt;get(&amp;#039;/&amp;#039;)-&amp;gt;title; ?&amp;gt;&lt;br /&gt;
&amp;lt;nav&amp;gt;&amp;lt;!-- ... --&amp;gt;&amp;lt;/nav&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;content-container cf&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;content current-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; // end if ajax ?&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  // if ajax then only return $content&lt;br /&gt;
  echo $content;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
&amp;lt;?php if(!$ajax): ?&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;?php&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
endif; // end if ajax&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
 &lt;br /&gt;
    var href;&lt;br /&gt;
    var title;&lt;br /&gt;
 &lt;br /&gt;
    $(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;a.ajax-link&amp;#039;,function(e) { // nav link clicked&lt;br /&gt;
 &lt;br /&gt;
        href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
        title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
        // load content via AJAX&lt;br /&gt;
        loadContent(href);&lt;br /&gt;
 &lt;br /&gt;
        // prevent click and reload&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
    });&lt;br /&gt;
 &lt;br /&gt;
    function loadContent(url){ // Load content&lt;br /&gt;
 &lt;br /&gt;
        // variable for page data&lt;br /&gt;
        $pageData = &amp;#039;&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
        // send Ajax request&lt;br /&gt;
        $.ajax({&lt;br /&gt;
            type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
            url: url,&lt;br /&gt;
            data: { ajax: true },&lt;br /&gt;
            success: function(data,status){&lt;br /&gt;
                $pageData = data;&lt;br /&gt;
            }&lt;br /&gt;
        }).done(function(){ // when finished and successful&lt;br /&gt;
 &lt;br /&gt;
            // construct new content&lt;br /&gt;
            $pageData = &amp;#039;&amp;lt;div class=&amp;quot;content no-opacity ajax&amp;quot;&amp;gt;&amp;#039; + $pageData + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
            // add content to page&lt;br /&gt;
            $(&amp;#039;.content-container&amp;#039;).append($pageData);&lt;br /&gt;
 &lt;br /&gt;
            // remove old content&lt;br /&gt;
            $(&amp;#039;.content.current-content&amp;#039;).remove();&lt;br /&gt;
 &lt;br /&gt;
            // show new content and clean up classes&lt;br /&gt;
            $(this).removeClass(&amp;#039;no-opacity&amp;#039;).removeClass(&amp;#039;ajax&amp;#039;).addClass(&amp;#039;current-content&amp;#039;);&lt;br /&gt;
             &lt;br /&gt;
        }); // end of ajax().done()&lt;br /&gt;
    } // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Komplexeres Beispiel mit Einbeziehen der Browser History, verhindern von doppeltem Laden bereits vorhandener Inhalte...&lt;br /&gt;
&lt;br /&gt;
PHP bleibt gleich.&lt;br /&gt;
&lt;br /&gt;
JavaScript&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
	// fitvids for responsivce videos&lt;br /&gt;
	$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
	// light box&lt;br /&gt;
	$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	// flexslider&lt;br /&gt;
	$(&amp;#039;.flexslider&amp;#039;).flexslider({&lt;br /&gt;
		pauseOnHover: true,&lt;br /&gt;
		controlNav: false,&lt;br /&gt;
		prevText: &amp;quot;&amp;quot;,&lt;br /&gt;
		nextText: &amp;quot;&amp;quot;,&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	*   HTML5 pushstate and ajax content&lt;br /&gt;
	*/&lt;br /&gt;
&lt;br /&gt;
	var href;&lt;br /&gt;
	var title;&lt;br /&gt;
&lt;br /&gt;
  	$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;a.ajax-link&amp;#039;,function(e) { // nav link clicked&lt;br /&gt;
&lt;br /&gt;
    	// check to see it contents already accessed&lt;br /&gt;
    	if($(this).hasClass(&amp;#039;current&amp;#039;)){&lt;br /&gt;
&lt;br /&gt;
        	console.log(&amp;#039;current page&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			// prevent click through&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			// exist click function (dont load new content)&lt;br /&gt;
        	return true;&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
      	$(&amp;#039;.current&amp;#039;).removeClass(&amp;#039;current&amp;#039;); // remove .current from active link&lt;br /&gt;
		$(&amp;#039;.parent&amp;#039;).removeClass(&amp;#039;parent&amp;#039;); // remove .current from active link&lt;br /&gt;
      	$(this).addClass(&amp;#039;current&amp;#039;); // add .current&lt;br /&gt;
&lt;br /&gt;
		var parent = $(this).attr(&amp;#039;parent&amp;#039;);&lt;br /&gt;
		if(parent){ // if link page has parent nav&lt;br /&gt;
			$(&amp;#039;nav a[name=&amp;quot;&amp;#039;+parent+&amp;#039;&amp;quot;]&amp;#039;).addClass(&amp;#039;parent&amp;#039;); // add .current&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// add progress spinner on cursor&lt;br /&gt;
      	$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;progress&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		// remove cusor spinner&lt;br /&gt;
		var pointerTimeout = setTimeout(function () {&lt;br /&gt;
			$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;auto&amp;#039;); // progress spinner on cursor&lt;br /&gt;
		}, 1000);&lt;br /&gt;
&lt;br /&gt;
      	href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
      	title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// load content via AJAX&lt;br /&gt;
      	loadContent(href);&lt;br /&gt;
&lt;br /&gt;
		// add new url to html5 history&lt;br /&gt;
      	history.pushState(&amp;#039;&amp;#039;, +href, href); // push url to history&lt;br /&gt;
&lt;br /&gt;
		// change title to new page&lt;br /&gt;
      	$(&amp;#039;title&amp;#039;).html(title);&lt;br /&gt;
&lt;br /&gt;
		// send GA pageview&lt;br /&gt;
      	ga(&amp;#039;send&amp;#039;, &amp;#039;pageview&amp;#039;, href);&lt;br /&gt;
&lt;br /&gt;
		// prevent click and reload&lt;br /&gt;
    	e.preventDefault();&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
    // for back / forwards browser navigation&lt;br /&gt;
    var toggleHistoryVisitNum = 0;&lt;br /&gt;
    function toggleHistory(){&lt;br /&gt;
        window.onpopstate = function(event) {&lt;br /&gt;
            if(window.location.hash == &amp;quot;&amp;quot;){&lt;br /&gt;
                loadContent(location.pathname);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	function loadContent(url){ // Load content&lt;br /&gt;
&lt;br /&gt;
		// variable for page data&lt;br /&gt;
    	$pageData = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// send Ajax request&lt;br /&gt;
    	$.ajax({&lt;br /&gt;
	        type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
	        url: url,&lt;br /&gt;
	        data: { ajax: true },&lt;br /&gt;
	        success: function(data,status){&lt;br /&gt;
				$pageData = data;&lt;br /&gt;
      		}&lt;br /&gt;
    	}).done(function(){ // when finished and successful&lt;br /&gt;
&lt;br /&gt;
			// construct new content&lt;br /&gt;
      		$pageData = &amp;#039;&amp;lt;div class=&amp;quot;content no-opacity ajax&amp;quot;&amp;gt;&amp;#039; + $pageData + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			// add content to page&lt;br /&gt;
			$(&amp;#039;.content-container&amp;#039;).append($pageData);&lt;br /&gt;
&lt;br /&gt;
			// animate the requested content&lt;br /&gt;
	      	$(&amp;#039;.content.current-content&amp;#039;).animate({&lt;br /&gt;
				// animate out old content&lt;br /&gt;
	        	opacity: 0&lt;br /&gt;
	      	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
				$(&amp;#039;.content.current-content&amp;#039;).slideUp(400);&lt;br /&gt;
&lt;br /&gt;
	          	// content animation finished&lt;br /&gt;
	          	$(&amp;#039;.content.ajax&amp;#039;).animate({&lt;br /&gt;
					// animate in new content&lt;br /&gt;
	            	opacity: 1&lt;br /&gt;
	          	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
					// remove old content&lt;br /&gt;
		            $(&amp;#039;.content.current-content&amp;#039;).remove();&lt;br /&gt;
&lt;br /&gt;
					// show new content and clean up classes&lt;br /&gt;
		            $(this).removeClass(&amp;#039;no-opacity&amp;#039;).removeClass(&amp;#039;ajax&amp;#039;).addClass(&amp;#039;current-content&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					/*&lt;br /&gt;
					* run js functions for new content&lt;br /&gt;
					*/&lt;br /&gt;
&lt;br /&gt;
					// fitvids for responsivce videos&lt;br /&gt;
					$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
					// light box&lt;br /&gt;
					$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	          	});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
	      	// toggle use of back and forward buttons on browser&lt;br /&gt;
	      	if(!toggleHistoryVisitNum){&lt;br /&gt;
	        	toggleHistory();&lt;br /&gt;
	      	}&lt;br /&gt;
&lt;br /&gt;
			// keep track of number of Ajax requests&lt;br /&gt;
			toggleHistoryVisitNum++;&lt;br /&gt;
&lt;br /&gt;
    	}); // end of ajax().done()&lt;br /&gt;
  	} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Ajax&amp;diff=23628</id>
		<title>ProcessWire - Ajax</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Ajax&amp;diff=23628"/>
		<updated>2019-02-11T10:10:41Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „Man kann mit PW relativ einfach dynamische Webseiten erzeugen. Dabei werden nur die benötigten Teile der Webseite ausgetauscht, anstatt die Seite nach jedem K…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Man kann mit PW relativ einfach dynamische Webseiten erzeugen. Dabei werden nur die benötigten Teile der Webseite ausgetauscht, anstatt die Seite nach jedem Klick neu zu laden. So entsteht sehr schnell ein &amp;quot;App-Feeling&amp;quot;. ProcessWire unterstützt einen dabei.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
 https://webdesign.tutsplus.com/tutorials/how-to-create-an-ajax-driven-theme-for-processwire--cms-26579 (Kurzanleitung)&lt;br /&gt;
 https://github.com/tutsplus/how-to-create-an-ajax-driven-theme-for-processwire (ProcessWire Profile mit AJAX)&lt;br /&gt;
&lt;br /&gt;
Allgemeines Vorgehen&lt;br /&gt;
&lt;br /&gt;
* Links mit der Klasse ajax-link werden über JavaScript (meist jQuery) abgefangen und über AJAX an den Server geschickt.&lt;br /&gt;
* ProcessWire erkennt anhand der internen System-Variable $ajax dass ein AJAX Request vorliegt&lt;br /&gt;
* Mit einfachen Ifs kann man ProcessWire dazu bringen nur den gewünschten Content zu generieren &lt;br /&gt;
* Den zurückgegebenen HTML Inhalt mit jQuery austauschen. &lt;br /&gt;
&lt;br /&gt;
Natürlich sind auch JSON Antworten denkbar. Das kann man dann alles über JavaScript verarbeiten&lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Beispiel&lt;br /&gt;
&lt;br /&gt;
Komplexeres Beispiel mit Einbeziehen der Browser History, verhindern von doppeltem Laden bereits vorhandener Inhalte...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
&lt;br /&gt;
	// fitvids for responsivce videos&lt;br /&gt;
	$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
	// light box&lt;br /&gt;
	$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	// flexslider&lt;br /&gt;
	$(&amp;#039;.flexslider&amp;#039;).flexslider({&lt;br /&gt;
		pauseOnHover: true,&lt;br /&gt;
		controlNav: false,&lt;br /&gt;
		prevText: &amp;quot;&amp;quot;,&lt;br /&gt;
		nextText: &amp;quot;&amp;quot;,&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	*   HTML5 pushstate and ajax content&lt;br /&gt;
	*/&lt;br /&gt;
&lt;br /&gt;
	var href;&lt;br /&gt;
	var title;&lt;br /&gt;
&lt;br /&gt;
  	$(&amp;#039;body&amp;#039;).on(&amp;#039;click&amp;#039;,&amp;#039;a.ajax-link&amp;#039;,function(e) { // nav link clicked&lt;br /&gt;
&lt;br /&gt;
    	// check to see it contents already accessed&lt;br /&gt;
    	if($(this).hasClass(&amp;#039;current&amp;#039;)){&lt;br /&gt;
&lt;br /&gt;
        	console.log(&amp;#039;current page&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			// prevent click through&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			// exist click function (dont load new content)&lt;br /&gt;
        	return true;&lt;br /&gt;
    	}&lt;br /&gt;
&lt;br /&gt;
      	$(&amp;#039;.current&amp;#039;).removeClass(&amp;#039;current&amp;#039;); // remove .current from active link&lt;br /&gt;
		$(&amp;#039;.parent&amp;#039;).removeClass(&amp;#039;parent&amp;#039;); // remove .current from active link&lt;br /&gt;
      	$(this).addClass(&amp;#039;current&amp;#039;); // add .current&lt;br /&gt;
&lt;br /&gt;
		var parent = $(this).attr(&amp;#039;parent&amp;#039;);&lt;br /&gt;
		if(parent){ // if link page has parent nav&lt;br /&gt;
			$(&amp;#039;nav a[name=&amp;quot;&amp;#039;+parent+&amp;#039;&amp;quot;]&amp;#039;).addClass(&amp;#039;parent&amp;#039;); // add .current&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// add progress spinner on cursor&lt;br /&gt;
      	$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;progress&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		// remove cusor spinner&lt;br /&gt;
		var pointerTimeout = setTimeout(function () {&lt;br /&gt;
			$(&amp;#039;body&amp;#039;).css(&amp;#039;cursor&amp;#039;,&amp;#039;auto&amp;#039;); // progress spinner on cursor&lt;br /&gt;
		}, 1000);&lt;br /&gt;
&lt;br /&gt;
      	href = $(this).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
      	title = $(this).attr(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// load content via AJAX&lt;br /&gt;
      	loadContent(href);&lt;br /&gt;
&lt;br /&gt;
		// add new url to html5 history&lt;br /&gt;
      	history.pushState(&amp;#039;&amp;#039;, +href, href); // push url to history&lt;br /&gt;
&lt;br /&gt;
		// change title to new page&lt;br /&gt;
      	$(&amp;#039;title&amp;#039;).html(title);&lt;br /&gt;
&lt;br /&gt;
		// send GA pageview&lt;br /&gt;
      	ga(&amp;#039;send&amp;#039;, &amp;#039;pageview&amp;#039;, href);&lt;br /&gt;
&lt;br /&gt;
		// prevent click and reload&lt;br /&gt;
    	e.preventDefault();&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
    // for back / forwards browser navigation&lt;br /&gt;
    var toggleHistoryVisitNum = 0;&lt;br /&gt;
    function toggleHistory(){&lt;br /&gt;
        window.onpopstate = function(event) {&lt;br /&gt;
            if(window.location.hash == &amp;quot;&amp;quot;){&lt;br /&gt;
                loadContent(location.pathname);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
	function loadContent(url){ // Load content&lt;br /&gt;
&lt;br /&gt;
		// variable for page data&lt;br /&gt;
    	$pageData = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// send Ajax request&lt;br /&gt;
    	$.ajax({&lt;br /&gt;
	        type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
	        url: url,&lt;br /&gt;
	        data: { ajax: true },&lt;br /&gt;
	        success: function(data,status){&lt;br /&gt;
				$pageData = data;&lt;br /&gt;
      		}&lt;br /&gt;
    	}).done(function(){ // when finished and successful&lt;br /&gt;
&lt;br /&gt;
			// construct new content&lt;br /&gt;
      		$pageData = &amp;#039;&amp;lt;div class=&amp;quot;content no-opacity ajax&amp;quot;&amp;gt;&amp;#039; + $pageData + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			// add content to page&lt;br /&gt;
			$(&amp;#039;.content-container&amp;#039;).append($pageData);&lt;br /&gt;
&lt;br /&gt;
			// animate the requested content&lt;br /&gt;
	      	$(&amp;#039;.content.current-content&amp;#039;).animate({&lt;br /&gt;
				// animate out old content&lt;br /&gt;
	        	opacity: 0&lt;br /&gt;
	      	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
				$(&amp;#039;.content.current-content&amp;#039;).slideUp(400);&lt;br /&gt;
&lt;br /&gt;
	          	// content animation finished&lt;br /&gt;
	          	$(&amp;#039;.content.ajax&amp;#039;).animate({&lt;br /&gt;
					// animate in new content&lt;br /&gt;
	            	opacity: 1&lt;br /&gt;
	          	}, 400, function(){&lt;br /&gt;
&lt;br /&gt;
					// remove old content&lt;br /&gt;
		            $(&amp;#039;.content.current-content&amp;#039;).remove();&lt;br /&gt;
&lt;br /&gt;
					// show new content and clean up classes&lt;br /&gt;
		            $(this).removeClass(&amp;#039;no-opacity&amp;#039;).removeClass(&amp;#039;ajax&amp;#039;).addClass(&amp;#039;current-content&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					/*&lt;br /&gt;
					* run js functions for new content&lt;br /&gt;
					*/&lt;br /&gt;
&lt;br /&gt;
					// fitvids for responsivce videos&lt;br /&gt;
					$(&amp;quot;.content .video&amp;quot;).fitVids();&lt;br /&gt;
&lt;br /&gt;
					// light box&lt;br /&gt;
					$(&amp;#039;.gallery&amp;#039;).Chocolat();&lt;br /&gt;
&lt;br /&gt;
	          	});&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
	      	// toggle use of back and forward buttons on browser&lt;br /&gt;
	      	if(!toggleHistoryVisitNum){&lt;br /&gt;
	        	toggleHistory();&lt;br /&gt;
	      	}&lt;br /&gt;
&lt;br /&gt;
			// keep track of number of Ajax requests&lt;br /&gt;
			toggleHistoryVisitNum++;&lt;br /&gt;
&lt;br /&gt;
    	}); // end of ajax().done()&lt;br /&gt;
  	} // end of loadContent()&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23627</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23627"/>
		<updated>2019-02-11T09:53:24Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Schritt 1 - Formular anpassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
* Unsichtbare Box für evtl. Fehlermeldungen direkt unter dem Submit Button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - AJAX Verarbeiten ==&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23626</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23626"/>
		<updated>2019-02-11T09:53:10Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Schritt 1 - Formular anpassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
* Unsichtbare Box für evtl. Fehlermeldungen direkt unter dem Submit Button.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/sytaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - AJAX Verarbeiten ==&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23625</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23625"/>
		<updated>2019-02-11T09:52:19Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
Siehe auch:&lt;br /&gt;
 [[JQuery - AJAX]]&lt;br /&gt;
&lt;br /&gt;
Wir erweitern das Beispiel folgendermaßen:&lt;br /&gt;
* Formulardaten über jQuery AJAX Funktionen abschicken&lt;br /&gt;
* ProcessWire AJAX Antwort verarbeiten&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Formular anpassen ==&lt;br /&gt;
* Unsichtbare Box für evtl. Fehlermeldungen direkt unter dem Submit Button.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;message-box&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/sytaxhighlight&amp;gt;&lt;br /&gt;
* JavaScript Datei für AJAX Versand hinzufügen&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;partials/basic-upload-ajax/main.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - AJAX Versand ==&lt;br /&gt;
main.js&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23624</id>
		<title>ProcessWire Upload Formular mit AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular_mit_AJAX&amp;diff=23624"/>
		<updated>2019-02-11T09:13:49Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „Basiert auf dem Beispiel in diesem Artikel  ProcessWire Upload Formular“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basiert auf dem Beispiel in diesem Artikel&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23623</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23623"/>
		<updated>2019-02-11T09:13:11Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 [[ProcessWire Upload Formular mit AJAX]]&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire UploadFormular Dropzone Enhanced]]&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Für das Formular kommen aus ProcessWire der Sanitizer, die WireUpload Klasse und Session Tokens zum Einsatz. Das Formular wird validiert. Das Markup für das Formular steht direkt im Template, wird also nicht über die Formularfunktionen von ProcessWire erzeugt. Das ist oft die schnellere Variante, vor allem wenn das Markup sehr individuell ist.&lt;br /&gt;
&lt;br /&gt;
Der Code basiert auf Somatonics Beispiel (s.o.) und wurde leicht angepasst. &lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Dateiupload (Bilder)&lt;br /&gt;
* Formulareingaben als Seiten speichern (inkl. Bilder)&lt;br /&gt;
* Verhindert CRSF Attacken und doppelte Posts durch neu Laden&lt;br /&gt;
* Formular validierung mit Inline Messages&lt;br /&gt;
* Feldvariablen werden durch den Sanitizer bereinigt&lt;br /&gt;
* Kleines jQuery Beispiel um den Submit Button nach Absenden zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
 TEMPLATES&lt;br /&gt;
 basic-upload&lt;br /&gt;
   FELDER: title&lt;br /&gt;
 basic-upload-entry&lt;br /&gt;
   FELDER: title, fullname, email, message, newsletter_subscribe, images&lt;br /&gt;
&lt;br /&gt;
 SEITEN&lt;br /&gt;
 /basic-upload/&lt;br /&gt;
 /basic-upload/[automatisch-erzeugte-seiten]&lt;br /&gt;
&lt;br /&gt;
Das Formular liegt in der Seite &lt;br /&gt;
 /basic-upload/ &lt;br /&gt;
Mit dem Template &amp;#039;basic-upload&amp;#039; (basic-upload.php)&lt;br /&gt;
&lt;br /&gt;
Beim Absenden eines gültigen Formulars werden unterhalb der Formularseite weitere Seiten generiert. Diese erhalten das Template basic-upload-entry. Wenn man die erzeugten Seiten im Frontend anzeigen möchte braucht man natürlich noch ein PHP File für basic-upload-entry. Ansonsten kann man sich die Seiten im Backend anzeigen.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;templates/partials/basic-upload/form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
templates/basic-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./partials/basic-upload/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form.js (jQuery)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23622</id>
		<title>ProcessWire - Formulare</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23622"/>
		<updated>2019-02-11T09:12:39Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Processwire - Forms]] (Beispiel mit ProcessWire Form Objekt -&amp;gt; Inputfelder über PW generieren)&lt;br /&gt;
 [[ProcessWire Upload Formular]]&lt;br /&gt;
 https://processwire.com/talk/topic/2089-create-simple-forms-using-api/ von Soma&lt;br /&gt;
 https://processwire.com/talk/topic/14206-contact-form-tutorial/ Mit Google ReCaptcha&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/4066-activate-user-account-via-email/?page=2 // User Subscription Account via E-Mail verifizierung&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Markup&amp;#039;&amp;#039;&amp;#039; eines Formulars kann man entweder &amp;#039;&amp;#039;&amp;#039;manuell&amp;#039;&amp;#039;&amp;#039; erstellen oder mit einem &amp;#039;&amp;#039;&amp;#039;Formobjekt&amp;#039;&amp;#039;&amp;#039;, das über eine render() Funktion ausgegeben wird. &lt;br /&gt;
&lt;br /&gt;
Zur Auswertung und &amp;#039;&amp;#039;&amp;#039;Validierung&amp;#039;&amp;#039;&amp;#039; stellt PW ebenfalls einige Objekte und Funktionen zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Für das Styling kann man eigene Stile nutzen. Als Inspiration für das Styling kann man inputfields.css aus dem templates-admin Ordner nutzen. Auch das CSS aus wire/modules/InputfieldRadios kann hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Funktionen ===&lt;br /&gt;
 $form-&amp;gt;processInput($input-&amp;gt;post) // prevent CSRF, append a hidden field&lt;br /&gt;
 $form-&amp;gt;getErrors();&lt;br /&gt;
 $form-&amp;gt;render();&lt;br /&gt;
 $form-&amp;gt;setMarkup();&lt;br /&gt;
&lt;br /&gt;
==== Hooks ====&lt;br /&gt;
Über Hooks lassen sich eigene Validierungen und vieles mehr realisieren.&lt;br /&gt;
&lt;br /&gt;
== Formular-Objekt und Felder definieren ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formular rendering konfigurieren ==&lt;br /&gt;
Mit der Funktion setMarkup(array()) kann man die Ausgabe von $form-&amp;gt;render() konfigurieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$form-&amp;gt;setMarkup(array(&lt;br /&gt;
   &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formulardaten auswerten ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get und Post Daten holen und für Suchselektoren nutzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords); // Sanizize user input&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;; // %= search parts // create a selector for later&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value); // &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Whitelist und der Sanitizer ==&lt;br /&gt;
 https://processwire.com/api/ref/sanitizer/&lt;br /&gt;
 https://processwire.com/api/ref/input/#api-sanitizer&lt;br /&gt;
 https://processwire.com/api/ref/input/whitelist/&lt;br /&gt;
&lt;br /&gt;
Den Sanitizer nutzt man um sich gegen manipulierte User-Eingaben zu schützen.&lt;br /&gt;
&lt;br /&gt;
Wenn man Variablen Sanitized hat, kann man sie in die Whitlist legen, das bedeutet diesen Variablen wird vertraut. Manche Funktionen in PW nutzen die Whitelist. Z.B. gibt das MarkupPagerNav Modul die Variablen darin weiter wenn man die Seite über den Seitenbrowser wechselt.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a &amp;quot;q&amp;quot; GET variable, sanitize and output&lt;br /&gt;
// Example request URL: domain.com/path/to/page/?q=TEST&lt;br /&gt;
$q = $input-&amp;gt;get(&amp;#039;q&amp;#039;); // retrieve value&lt;br /&gt;
$q = $sanitizer-&amp;gt;text($q); // sanitize input as 1-line text&lt;br /&gt;
echo $sanitizer-&amp;gt;entities($q); // sanitize for output, outputs &amp;quot;TEST&amp;quot;&lt;br /&gt;
// You can also combine $input and one $sanitizer call, replacing&lt;br /&gt;
// the &amp;quot;text&amp;quot; method call with any $sanitizer method:&lt;br /&gt;
$q = $input-&amp;gt;get-&amp;gt;text(&amp;#039;q&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a GET variable, sanitize/validate it, and populate to whitelist&lt;br /&gt;
$limit = (int) $input-&amp;gt;get(&amp;#039;limit&amp;#039;);&lt;br /&gt;
if($limit &amp;lt; 10 || $limit &amp;gt; 100) $limit = 25; // validate&lt;br /&gt;
$input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;, $limit); &lt;br /&gt;
// Retrieve a variable from the whitelist&lt;br /&gt;
$limit = $input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Suchformular ===&lt;br /&gt;
&lt;br /&gt;
=== Get Variablen auswerten (Genbänkle) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// SEARCH&lt;br /&gt;
// most of the code in this template file is here to build this selector string&lt;br /&gt;
// it will contain the search query that gets sent to $sortList&lt;br /&gt;
$selector = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// we use this to store the info that generates the summary of what was searched for&lt;br /&gt;
// the summary will appear above the search results&lt;br /&gt;
$summary = array(&lt;br /&gt;
	&amp;quot;keywords&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_id&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_red_list&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_wild_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_rare&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_winter_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_useful_ornamental&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_bw_typical&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
//var_dump($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Stichwort&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SORTS_ID&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_id) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_id);&lt;br /&gt;
	$selector .= &amp;quot;pr_types=$value, &amp;quot;;&lt;br /&gt;
  $p = $pages-&amp;gt;get($sanitizer-&amp;gt;entities($value));&lt;br /&gt;
	$summary[&amp;quot;Art&amp;quot;] = $p-&amp;gt;title;&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_id&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// PROPERTIES&lt;br /&gt;
// Checkbox names&lt;br /&gt;
$properties = array(&lt;br /&gt;
 &amp;#039;sort_red_list&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_bw_typical&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_rare&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_wild_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_winter_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_useful_ornamental&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
foreach ($properties as $k){&lt;br /&gt;
  $label = $pages-&amp;gt;fields-&amp;gt;get($k)-&amp;gt;label;&lt;br /&gt;
  if($input-&amp;gt;get-&amp;gt;{$k}) {&lt;br /&gt;
  	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;{$k});&lt;br /&gt;
    $selector .= &amp;quot;$k=1, &amp;quot;;&lt;br /&gt;
  	$summary[&amp;quot;$label&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
  	$input-&amp;gt;whitelist($k, $value);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// RED LIST&lt;br /&gt;
/*&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_red_list) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_red_list);&lt;br /&gt;
	//$selector .= &amp;quot;sort_properties=1, &amp;quot;; // 1 = red_list&lt;br /&gt;
  $selector .= &amp;quot;sort_red_list=1, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Rote Liste&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_red_list&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// SEARCH SUMMARY&lt;br /&gt;
$content = &amp;#039;&amp;lt;h5&amp;gt;Ihre Suche&amp;lt;/h5&amp;gt;&amp;lt;ul id=&amp;quot;search_summary&amp;quot; class=&amp;quot;uk-list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$browserTitle = &amp;quot;Sorten - &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($summary as $key =&amp;gt; $value) {&lt;br /&gt;
	if(!$value) continue;&lt;br /&gt;
	$key = ucfirst($key);&lt;br /&gt;
	$content .= &amp;quot;\n\t&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;$key:&amp;lt;/strong&amp;gt; $value&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	$browserTitle .= &amp;quot;$key: $value, &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$content .= &amp;quot;\n&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// FINAL OUTPUT&lt;br /&gt;
$content .= renderSortList(findSorts($selector)); &lt;br /&gt;
$browserTitle = rtrim($browserTitle, &amp;quot;, &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$content = $layoutBlocks.$content;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;content&amp;quot; class=&amp;quot;sort-search uk-width-expand&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?=$content?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;aside id=&amp;#039;sidebar&amp;#039; class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;#039;&amp;gt;&lt;br /&gt;
		&amp;lt;?php include(&amp;quot;./includes/search_form_big.php&amp;quot;); ?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;uk-margin&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?=$page-&amp;gt;sidebar?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/aside&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Beispiel von Soma ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// create email field&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;E-Mail&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;email&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field&lt;br /&gt;
&lt;br /&gt;
// you get the idea&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldPassword&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Passwort&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;pass&amp;quot;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
echo $out;&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Formular mit E-Mail versand (ohne Spamschutz)===&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;
function renderContactForm($backend_email, $subject) {&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  $modules = wire(&amp;#039;modules&amp;#039;); // get access to pw modules object&lt;br /&gt;
  $input = wire(&amp;#039;input&amp;#039;);&lt;br /&gt;
  $sanitizer = wire(&amp;#039;sanitizer&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  // Create the new &amp;lt;form&amp;gt;&lt;br /&gt;
  $form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;); // get InputfieldForm Object&lt;br /&gt;
  $form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;contact-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// Set markup for form elements&lt;br /&gt;
  $form-&amp;gt;setMarkup(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    //&amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;lt;label for=&amp;#039;{for}&amp;#039;&amp;gt;{out}&amp;lt;/label&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;quot;, // no label markup for this form&lt;br /&gt;
    &amp;#039;item_content&amp;#039; =&amp;gt; &amp;quot;{out}&amp;quot;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=\&amp;quot;error\&amp;quot;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_description&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_head&amp;#039; =&amp;gt; &amp;quot;&amp;lt;h2&amp;gt;{out}&amp;lt;/h2&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_notes&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;notes&amp;#039;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// Set classes for form elements&lt;br /&gt;
  $form-&amp;gt;setClasses(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;#039;form-list&amp;#039;,&lt;br /&gt;
    &amp;#039;list_clearfix&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;#039;{class}&amp;#039;,&lt;br /&gt;
    &amp;#039;item_required&amp;#039; =&amp;gt; &amp;#039;required&amp;#039;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_collapsed&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width_first&amp;#039; =&amp;gt; &amp;#039;&amp;#039;&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// New field: First name&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Name&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;name&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihr Name&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: E-Mail&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;E-mail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre E-Mail Adresse&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Phone&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Telefon&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;phone&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Telefonnummer&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Message&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldTextarea&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Nachricht&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;message&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Nachricht&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // SUBMIT button!&lt;br /&gt;
  $submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;class&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
  // POST request, process the form&lt;br /&gt;
  if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
      $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
      $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;firstname);&lt;br /&gt;
      $email = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;email);&lt;br /&gt;
      $message = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;message);&lt;br /&gt;
      $phone = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;phone);&lt;br /&gt;
&lt;br /&gt;
      // ERRORS...&lt;br /&gt;
      if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
      } else {&lt;br /&gt;
        // FORM OK...&lt;br /&gt;
      	// Process the form here!&lt;br /&gt;
&lt;br /&gt;
        $mail = wireMail();&lt;br /&gt;
        $mail-&amp;gt;to($backend_email)-&amp;gt;from($email);&lt;br /&gt;
        $mail-&amp;gt;subject($subject);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        $body = &amp;quot;Name: &amp;quot; . $firstname . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;E-Mail: &amp;quot; . $email . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Telefon: &amp;quot; . $phone . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Nachricht:\n&amp;quot; . $message;&lt;br /&gt;
&lt;br /&gt;
        $mail-&amp;gt;body($body);&lt;br /&gt;
&lt;br /&gt;
        echo &amp;#039;&amp;lt;pre&amp;gt;&amp;#039;.$body.&amp;#039;&amp;lt;/pre&amp;gt;&amp;#039;;&lt;br /&gt;
        $numSent = $mail-&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;&amp;#039;.__(&amp;quot;Vielen Dank für Ihre Nachricht! Wir melden uns so bald wie möglich.&amp;quot;).&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
  } else {&lt;br /&gt;
      // GET request, simply show the form&lt;br /&gt;
      $out .= $form-&amp;gt;render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formular mit Upload Funktion (von Soma) ===&lt;br /&gt;
[[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
=== CSRF in eigenen Formularen ===&lt;br /&gt;
 [[ProcessWire - Formulare mit CSRF Schutz]]&lt;br /&gt;
&lt;br /&gt;
Formulare mit Token und Sessionfunktionen von ProcessWire ausstatten. Das geht auch mit selbst erstelltem Markup.&lt;br /&gt;
 https://processwire-recipes.com/recipes/use-csrf-in-your-own-forms/&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Forms&amp;diff=23621</id>
		<title>Processwire - Forms</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Forms&amp;diff=23621"/>
		<updated>2019-02-11T09:11:55Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[ProcessWire - Formulare]]&lt;br /&gt;
* https://processwire.com/talk/topic/2089-create-simple-forms-using-api/&lt;br /&gt;
* https://processwire.com/talk/topic/5631-creating-a-form/&lt;br /&gt;
* https://gist.github.com/somatonic/5233338 (Mit Token Validation und File Upload)&lt;br /&gt;
* https://gist.github.com/somatonic/5011926 (Fields from Backend)&lt;br /&gt;
* https://processwire.com/api/ref/inputfield/&lt;br /&gt;
&lt;br /&gt;
== Beispiel von Leonid Letzner ==&lt;br /&gt;
* https://www.youtube.com/watch?v=iscObJTesNI&lt;br /&gt;
* https://github.com/leonidlezner/pwtemplate/wiki/Rendering-a-simple-contact-form-in-ProcessWire&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function renderCatalogForm($backend_email, $subject) {&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  $modules = wire(&amp;#039;modules&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  $input = wire(&amp;#039;input&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  $sanitizer = wire(&amp;#039;sanitizer&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  // Create the new &amp;lt;form&amp;gt;&lt;br /&gt;
  $form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
  $form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;contact-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    // Set markup for form elements&lt;br /&gt;
  $form-&amp;gt;setMarkup(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;lt;label for=&amp;#039;{for}&amp;#039;&amp;gt;{out}&amp;lt;/label&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_content&amp;#039; =&amp;gt; &amp;quot;{out}&amp;quot;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=\&amp;quot;error\&amp;quot;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_description&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_head&amp;#039; =&amp;gt; &amp;quot;&amp;lt;h2&amp;gt;{out}&amp;lt;/h2&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_notes&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;notes&amp;#039;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
    // Set classes for form elements&lt;br /&gt;
  $form-&amp;gt;setClasses(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;#039;form-list&amp;#039;,&lt;br /&gt;
    &amp;#039;list_clearfix&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;#039;{class}&amp;#039;,&lt;br /&gt;
    &amp;#039;item_required&amp;#039; =&amp;gt; &amp;#039;required&amp;#039;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_collapsed&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width_first&amp;#039; =&amp;gt; &amp;#039;&amp;#039;&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
    // New field: First name&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;First name&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;firstname&amp;#039;);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
    // New field: Last name&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Last name&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;lastname&amp;#039;);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
    // New field: E-Mail&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;E-mail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;email&amp;#039;);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
    // New field: Phone&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Your phone&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;phone&amp;#039;);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
    // New field: Message&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldTextarea&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Message&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr(&amp;#039;id+name&amp;#039;, &amp;#039;message&amp;#039;);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
  // Submit button!&lt;br /&gt;
  $submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
  // POST request, process the form&lt;br /&gt;
  if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
      $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
      $firstname = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;firstname);&lt;br /&gt;
      $lastname = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;lastname);&lt;br /&gt;
      $email = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;email);&lt;br /&gt;
      $message = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;message);&lt;br /&gt;
      $phone = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;phone);&lt;br /&gt;
&lt;br /&gt;
      if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
      } else {&lt;br /&gt;
        // Process the form here!&lt;br /&gt;
&lt;br /&gt;
        $mail = wireMail();&lt;br /&gt;
        $mail-&amp;gt;to($backend_email)-&amp;gt;from($email);&lt;br /&gt;
        $mail-&amp;gt;subject($subject);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        $body = &amp;quot;First name: &amp;quot; . $firstname . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Last name: &amp;quot; . $lastname . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;E-Mail: &amp;quot; . $email . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Phone: &amp;quot; . $phone . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Message:\n&amp;quot; . $message;&lt;br /&gt;
&lt;br /&gt;
        $mail-&amp;gt;body($body);&lt;br /&gt;
&lt;br /&gt;
        echo &amp;#039;&amp;lt;pre&amp;gt;&amp;#039;.$body.&amp;#039;&amp;lt;/pre&amp;gt;&amp;#039;;&lt;br /&gt;
        #$numSent = $mail-&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;&amp;#039;.__(&amp;quot;You submission was completed! Thanks for your time&amp;quot;).&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
  } else {&lt;br /&gt;
      // GET request, simply show the form&lt;br /&gt;
      $out .= $form-&amp;gt;render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anwendung im Template:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form = renderCatalogForm(&amp;quot;info@xyz.abc&amp;quot;, &amp;quot;Contact via my new ProcessWire page&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23620</id>
		<title>ProcessWire - Formulare</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23620"/>
		<updated>2019-02-11T09:11:27Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 [[Processwire - Forms]] (Beispiel mit ProcessWire Form Objekt -&amp;gt; Inputfelder über PW generieren)&lt;br /&gt;
 https://processwire.com/talk/topic/2089-create-simple-forms-using-api/ von Soma&lt;br /&gt;
 https://processwire.com/talk/topic/14206-contact-form-tutorial/ Mit Google ReCaptcha&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/4066-activate-user-account-via-email/?page=2 // User Subscription Account via E-Mail verifizierung&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Markup&amp;#039;&amp;#039;&amp;#039; eines Formulars kann man entweder &amp;#039;&amp;#039;&amp;#039;manuell&amp;#039;&amp;#039;&amp;#039; erstellen oder mit einem &amp;#039;&amp;#039;&amp;#039;Formobjekt&amp;#039;&amp;#039;&amp;#039;, das über eine render() Funktion ausgegeben wird. &lt;br /&gt;
&lt;br /&gt;
Zur Auswertung und &amp;#039;&amp;#039;&amp;#039;Validierung&amp;#039;&amp;#039;&amp;#039; stellt PW ebenfalls einige Objekte und Funktionen zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Für das Styling kann man eigene Stile nutzen. Als Inspiration für das Styling kann man inputfields.css aus dem templates-admin Ordner nutzen. Auch das CSS aus wire/modules/InputfieldRadios kann hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Funktionen ===&lt;br /&gt;
 $form-&amp;gt;processInput($input-&amp;gt;post) // prevent CSRF, append a hidden field&lt;br /&gt;
 $form-&amp;gt;getErrors();&lt;br /&gt;
 $form-&amp;gt;render();&lt;br /&gt;
 $form-&amp;gt;setMarkup();&lt;br /&gt;
&lt;br /&gt;
==== Hooks ====&lt;br /&gt;
Über Hooks lassen sich eigene Validierungen und vieles mehr realisieren.&lt;br /&gt;
&lt;br /&gt;
== Formular-Objekt und Felder definieren ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formular rendering konfigurieren ==&lt;br /&gt;
Mit der Funktion setMarkup(array()) kann man die Ausgabe von $form-&amp;gt;render() konfigurieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$form-&amp;gt;setMarkup(array(&lt;br /&gt;
   &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formulardaten auswerten ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get und Post Daten holen und für Suchselektoren nutzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords); // Sanizize user input&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;; // %= search parts // create a selector for later&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value); // &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Whitelist und der Sanitizer ==&lt;br /&gt;
 https://processwire.com/api/ref/sanitizer/&lt;br /&gt;
 https://processwire.com/api/ref/input/#api-sanitizer&lt;br /&gt;
 https://processwire.com/api/ref/input/whitelist/&lt;br /&gt;
&lt;br /&gt;
Den Sanitizer nutzt man um sich gegen manipulierte User-Eingaben zu schützen.&lt;br /&gt;
&lt;br /&gt;
Wenn man Variablen Sanitized hat, kann man sie in die Whitlist legen, das bedeutet diesen Variablen wird vertraut. Manche Funktionen in PW nutzen die Whitelist. Z.B. gibt das MarkupPagerNav Modul die Variablen darin weiter wenn man die Seite über den Seitenbrowser wechselt.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a &amp;quot;q&amp;quot; GET variable, sanitize and output&lt;br /&gt;
// Example request URL: domain.com/path/to/page/?q=TEST&lt;br /&gt;
$q = $input-&amp;gt;get(&amp;#039;q&amp;#039;); // retrieve value&lt;br /&gt;
$q = $sanitizer-&amp;gt;text($q); // sanitize input as 1-line text&lt;br /&gt;
echo $sanitizer-&amp;gt;entities($q); // sanitize for output, outputs &amp;quot;TEST&amp;quot;&lt;br /&gt;
// You can also combine $input and one $sanitizer call, replacing&lt;br /&gt;
// the &amp;quot;text&amp;quot; method call with any $sanitizer method:&lt;br /&gt;
$q = $input-&amp;gt;get-&amp;gt;text(&amp;#039;q&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a GET variable, sanitize/validate it, and populate to whitelist&lt;br /&gt;
$limit = (int) $input-&amp;gt;get(&amp;#039;limit&amp;#039;);&lt;br /&gt;
if($limit &amp;lt; 10 || $limit &amp;gt; 100) $limit = 25; // validate&lt;br /&gt;
$input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;, $limit); &lt;br /&gt;
// Retrieve a variable from the whitelist&lt;br /&gt;
$limit = $input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Suchformular ===&lt;br /&gt;
&lt;br /&gt;
=== Get Variablen auswerten (Genbänkle) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// SEARCH&lt;br /&gt;
// most of the code in this template file is here to build this selector string&lt;br /&gt;
// it will contain the search query that gets sent to $sortList&lt;br /&gt;
$selector = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// we use this to store the info that generates the summary of what was searched for&lt;br /&gt;
// the summary will appear above the search results&lt;br /&gt;
$summary = array(&lt;br /&gt;
	&amp;quot;keywords&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_id&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_red_list&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_wild_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_rare&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_winter_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_useful_ornamental&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_bw_typical&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
//var_dump($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Stichwort&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SORTS_ID&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_id) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_id);&lt;br /&gt;
	$selector .= &amp;quot;pr_types=$value, &amp;quot;;&lt;br /&gt;
  $p = $pages-&amp;gt;get($sanitizer-&amp;gt;entities($value));&lt;br /&gt;
	$summary[&amp;quot;Art&amp;quot;] = $p-&amp;gt;title;&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_id&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// PROPERTIES&lt;br /&gt;
// Checkbox names&lt;br /&gt;
$properties = array(&lt;br /&gt;
 &amp;#039;sort_red_list&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_bw_typical&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_rare&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_wild_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_winter_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_useful_ornamental&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
foreach ($properties as $k){&lt;br /&gt;
  $label = $pages-&amp;gt;fields-&amp;gt;get($k)-&amp;gt;label;&lt;br /&gt;
  if($input-&amp;gt;get-&amp;gt;{$k}) {&lt;br /&gt;
  	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;{$k});&lt;br /&gt;
    $selector .= &amp;quot;$k=1, &amp;quot;;&lt;br /&gt;
  	$summary[&amp;quot;$label&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
  	$input-&amp;gt;whitelist($k, $value);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// RED LIST&lt;br /&gt;
/*&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_red_list) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_red_list);&lt;br /&gt;
	//$selector .= &amp;quot;sort_properties=1, &amp;quot;; // 1 = red_list&lt;br /&gt;
  $selector .= &amp;quot;sort_red_list=1, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Rote Liste&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_red_list&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// SEARCH SUMMARY&lt;br /&gt;
$content = &amp;#039;&amp;lt;h5&amp;gt;Ihre Suche&amp;lt;/h5&amp;gt;&amp;lt;ul id=&amp;quot;search_summary&amp;quot; class=&amp;quot;uk-list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$browserTitle = &amp;quot;Sorten - &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($summary as $key =&amp;gt; $value) {&lt;br /&gt;
	if(!$value) continue;&lt;br /&gt;
	$key = ucfirst($key);&lt;br /&gt;
	$content .= &amp;quot;\n\t&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;$key:&amp;lt;/strong&amp;gt; $value&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	$browserTitle .= &amp;quot;$key: $value, &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$content .= &amp;quot;\n&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// FINAL OUTPUT&lt;br /&gt;
$content .= renderSortList(findSorts($selector)); &lt;br /&gt;
$browserTitle = rtrim($browserTitle, &amp;quot;, &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$content = $layoutBlocks.$content;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;content&amp;quot; class=&amp;quot;sort-search uk-width-expand&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?=$content?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;aside id=&amp;#039;sidebar&amp;#039; class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;#039;&amp;gt;&lt;br /&gt;
		&amp;lt;?php include(&amp;quot;./includes/search_form_big.php&amp;quot;); ?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;uk-margin&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?=$page-&amp;gt;sidebar?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/aside&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Beispiel von Soma ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// create email field&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;E-Mail&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;email&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field&lt;br /&gt;
&lt;br /&gt;
// you get the idea&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldPassword&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Passwort&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;pass&amp;quot;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
echo $out;&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Formular mit E-Mail versand (ohne Spamschutz)===&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;
function renderContactForm($backend_email, $subject) {&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  $modules = wire(&amp;#039;modules&amp;#039;); // get access to pw modules object&lt;br /&gt;
  $input = wire(&amp;#039;input&amp;#039;);&lt;br /&gt;
  $sanitizer = wire(&amp;#039;sanitizer&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  // Create the new &amp;lt;form&amp;gt;&lt;br /&gt;
  $form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;); // get InputfieldForm Object&lt;br /&gt;
  $form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;contact-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// Set markup for form elements&lt;br /&gt;
  $form-&amp;gt;setMarkup(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    //&amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;lt;label for=&amp;#039;{for}&amp;#039;&amp;gt;{out}&amp;lt;/label&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;quot;, // no label markup for this form&lt;br /&gt;
    &amp;#039;item_content&amp;#039; =&amp;gt; &amp;quot;{out}&amp;quot;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=\&amp;quot;error\&amp;quot;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_description&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_head&amp;#039; =&amp;gt; &amp;quot;&amp;lt;h2&amp;gt;{out}&amp;lt;/h2&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_notes&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;notes&amp;#039;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// Set classes for form elements&lt;br /&gt;
  $form-&amp;gt;setClasses(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;#039;form-list&amp;#039;,&lt;br /&gt;
    &amp;#039;list_clearfix&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;#039;{class}&amp;#039;,&lt;br /&gt;
    &amp;#039;item_required&amp;#039; =&amp;gt; &amp;#039;required&amp;#039;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_collapsed&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width_first&amp;#039; =&amp;gt; &amp;#039;&amp;#039;&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// New field: First name&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Name&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;name&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihr Name&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: E-Mail&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;E-mail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre E-Mail Adresse&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Phone&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Telefon&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;phone&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Telefonnummer&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Message&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldTextarea&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Nachricht&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;message&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Nachricht&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // SUBMIT button!&lt;br /&gt;
  $submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;class&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
  // POST request, process the form&lt;br /&gt;
  if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
      $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
      $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;firstname);&lt;br /&gt;
      $email = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;email);&lt;br /&gt;
      $message = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;message);&lt;br /&gt;
      $phone = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;phone);&lt;br /&gt;
&lt;br /&gt;
      // ERRORS...&lt;br /&gt;
      if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
      } else {&lt;br /&gt;
        // FORM OK...&lt;br /&gt;
      	// Process the form here!&lt;br /&gt;
&lt;br /&gt;
        $mail = wireMail();&lt;br /&gt;
        $mail-&amp;gt;to($backend_email)-&amp;gt;from($email);&lt;br /&gt;
        $mail-&amp;gt;subject($subject);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        $body = &amp;quot;Name: &amp;quot; . $firstname . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;E-Mail: &amp;quot; . $email . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Telefon: &amp;quot; . $phone . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Nachricht:\n&amp;quot; . $message;&lt;br /&gt;
&lt;br /&gt;
        $mail-&amp;gt;body($body);&lt;br /&gt;
&lt;br /&gt;
        echo &amp;#039;&amp;lt;pre&amp;gt;&amp;#039;.$body.&amp;#039;&amp;lt;/pre&amp;gt;&amp;#039;;&lt;br /&gt;
        $numSent = $mail-&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;&amp;#039;.__(&amp;quot;Vielen Dank für Ihre Nachricht! Wir melden uns so bald wie möglich.&amp;quot;).&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
  } else {&lt;br /&gt;
      // GET request, simply show the form&lt;br /&gt;
      $out .= $form-&amp;gt;render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formular mit Upload Funktion (von Soma) ===&lt;br /&gt;
[[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
=== CSRF in eigenen Formularen ===&lt;br /&gt;
 [[ProcessWire - Formulare mit CSRF Schutz]]&lt;br /&gt;
&lt;br /&gt;
Formulare mit Token und Sessionfunktionen von ProcessWire ausstatten. Das geht auch mit selbst erstelltem Markup.&lt;br /&gt;
 https://processwire-recipes.com/recipes/use-csrf-in-your-own-forms/&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Drag_n_Drop_Upload&amp;diff=23619</id>
		<title>HTML5 - Drag n Drop Upload</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Drag_n_Drop_Upload&amp;diff=23619"/>
		<updated>2019-02-09T16:34:30Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 https://makitweb.com/drag-and-drop-file-upload-with-jquery-and-ajax/&lt;br /&gt;
 https://css-tricks.com/drag-and-drop-file-uploading/&lt;br /&gt;
 https://bitwiser.in/2015/08/08/creating-dropzone-for-drag-drop-file.html&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für einen komfortableren Upload über eine Dropzone machen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare_mit_CSRF_Schutz&amp;diff=23618</id>
		<title>ProcessWire - Formulare mit CSRF Schutz</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare_mit_CSRF_Schutz&amp;diff=23618"/>
		<updated>2019-02-09T16:34:17Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „Use CSRF in your own forms Problem  If you do not wish to create forms via the ProcessWire API, but still aiming to use PW&amp;#039;s form features, you can use its CRS…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Use CSRF in your own forms&lt;br /&gt;
Problem&lt;br /&gt;
&lt;br /&gt;
If you do not wish to create forms via the ProcessWire API, but still aiming to use PW&amp;#039;s form features, you can use its CRSF (Cross-Site Request Forgery) preventing features like so:&lt;br /&gt;
&lt;br /&gt;
Solution&lt;br /&gt;
 https://processwire-recipes.com/recipes/use-csrf-in-your-own-forms/&lt;br /&gt;
&lt;br /&gt;
First you need to create a token and a token name, you do that as following:&lt;br /&gt;
&lt;br /&gt;
 $tokenName = $this-&amp;gt;session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 $tokenValue = $this-&amp;gt;session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
&lt;br /&gt;
Now what you want to do is create a hidden input field like this:&lt;br /&gt;
&lt;br /&gt;
 $html .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;_post_token&amp;quot; name=&amp;quot;&amp;#039; . $tokenName . &amp;#039;&amp;quot; value=&amp;quot;&amp;#039; . $tokenValue . &amp;#039;&amp;quot;/&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
Now this will generate something that will look like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;input type=&amp;quot;hidden&amp;quot; id=&amp;quot;_post_token&amp;quot; name=&amp;quot;TOKEN1470842875&amp;quot; value=&amp;quot;fe8ce9c1b9e6b9e361830df3525c49317a35332fbf626aa8793777a3b705824a&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You are done on the form side.&lt;br /&gt;
&lt;br /&gt;
You can now go to the part where you are receiving the post. Then use:&lt;br /&gt;
&lt;br /&gt;
 $session-&amp;gt;CSRF-&amp;gt;validate();&lt;br /&gt;
&lt;br /&gt;
This will return true (1) on a valid request and an exception on a bad request. You can test this out to open up your Firebug/Chrome debug console and change the value of the textbox to something else.&lt;br /&gt;
&lt;br /&gt;
Basicly what this does is set a session variable with a name (getTokenName) and gives it a hashed value. If a request has a token in it it has to have the same value or it is not send from the correct form.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23617</id>
		<title>ProcessWire - Formulare</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Formulare&amp;diff=23617"/>
		<updated>2019-02-09T16:33:33Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* CSRF in eigenen Formularen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
 https://processwire.com/talk/topic/2089-create-simple-forms-using-api/ von Soma&lt;br /&gt;
 https://processwire.com/talk/topic/14206-contact-form-tutorial/ Mit Google ReCaptcha&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 https://processwire.com/talk/topic/4066-activate-user-account-via-email/?page=2 // User Subscription Account via E-Mail verifizierung&lt;br /&gt;
&lt;br /&gt;
== Allgemeines ==&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Markup&amp;#039;&amp;#039;&amp;#039; eines Formulars kann man entweder &amp;#039;&amp;#039;&amp;#039;manuell&amp;#039;&amp;#039;&amp;#039; erstellen oder mit einem &amp;#039;&amp;#039;&amp;#039;Formobjekt&amp;#039;&amp;#039;&amp;#039;, das über eine render() Funktion ausgegeben wird. &lt;br /&gt;
&lt;br /&gt;
Zur Auswertung und &amp;#039;&amp;#039;&amp;#039;Validierung&amp;#039;&amp;#039;&amp;#039; stellt PW ebenfalls einige Objekte und Funktionen zur Verfügung. &lt;br /&gt;
&lt;br /&gt;
Für das Styling kann man eigene Stile nutzen. Als Inspiration für das Styling kann man inputfields.css aus dem templates-admin Ordner nutzen. Auch das CSS aus wire/modules/InputfieldRadios kann hilfreich sein.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Funktionen ===&lt;br /&gt;
 $form-&amp;gt;processInput($input-&amp;gt;post) // prevent CSRF, append a hidden field&lt;br /&gt;
 $form-&amp;gt;getErrors();&lt;br /&gt;
 $form-&amp;gt;render();&lt;br /&gt;
 $form-&amp;gt;setMarkup();&lt;br /&gt;
&lt;br /&gt;
==== Hooks ====&lt;br /&gt;
Über Hooks lassen sich eigene Validierungen und vieles mehr realisieren.&lt;br /&gt;
&lt;br /&gt;
== Formular-Objekt und Felder definieren ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formular rendering konfigurieren ==&lt;br /&gt;
Mit der Funktion setMarkup(array()) kann man die Ausgabe von $form-&amp;gt;render() konfigurieren.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$form-&amp;gt;setMarkup(array(&lt;br /&gt;
   &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
   &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formulardaten auswerten ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get und Post Daten holen und für Suchselektoren nutzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords); // Sanizize user input&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;; // %= search parts // create a selector for later&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value); // &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Die Whitelist und der Sanitizer ==&lt;br /&gt;
 https://processwire.com/api/ref/sanitizer/&lt;br /&gt;
 https://processwire.com/api/ref/input/#api-sanitizer&lt;br /&gt;
 https://processwire.com/api/ref/input/whitelist/&lt;br /&gt;
&lt;br /&gt;
Den Sanitizer nutzt man um sich gegen manipulierte User-Eingaben zu schützen.&lt;br /&gt;
&lt;br /&gt;
Wenn man Variablen Sanitized hat, kann man sie in die Whitlist legen, das bedeutet diesen Variablen wird vertraut. Manche Funktionen in PW nutzen die Whitelist. Z.B. gibt das MarkupPagerNav Modul die Variablen darin weiter wenn man die Seite über den Seitenbrowser wechselt.&lt;br /&gt;
&lt;br /&gt;
Beispiele&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a &amp;quot;q&amp;quot; GET variable, sanitize and output&lt;br /&gt;
// Example request URL: domain.com/path/to/page/?q=TEST&lt;br /&gt;
$q = $input-&amp;gt;get(&amp;#039;q&amp;#039;); // retrieve value&lt;br /&gt;
$q = $sanitizer-&amp;gt;text($q); // sanitize input as 1-line text&lt;br /&gt;
echo $sanitizer-&amp;gt;entities($q); // sanitize for output, outputs &amp;quot;TEST&amp;quot;&lt;br /&gt;
// You can also combine $input and one $sanitizer call, replacing&lt;br /&gt;
// the &amp;quot;text&amp;quot; method call with any $sanitizer method:&lt;br /&gt;
$q = $input-&amp;gt;get-&amp;gt;text(&amp;#039;q&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Retrieve a GET variable, sanitize/validate it, and populate to whitelist&lt;br /&gt;
$limit = (int) $input-&amp;gt;get(&amp;#039;limit&amp;#039;);&lt;br /&gt;
if($limit &amp;lt; 10 || $limit &amp;gt; 100) $limit = 25; // validate&lt;br /&gt;
$input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;, $limit); &lt;br /&gt;
// Retrieve a variable from the whitelist&lt;br /&gt;
$limit = $input-&amp;gt;whitelist(&amp;#039;limit&amp;#039;); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Suchformular ===&lt;br /&gt;
&lt;br /&gt;
=== Get Variablen auswerten (Genbänkle) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// SEARCH&lt;br /&gt;
// most of the code in this template file is here to build this selector string&lt;br /&gt;
// it will contain the search query that gets sent to $sortList&lt;br /&gt;
$selector = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// we use this to store the info that generates the summary of what was searched for&lt;br /&gt;
// the summary will appear above the search results&lt;br /&gt;
$summary = array(&lt;br /&gt;
	&amp;quot;keywords&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_id&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	&amp;quot;sort_red_list&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_wild_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_rare&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_winter_plant&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_useful_ornamental&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
  &amp;quot;sort_bw_typical&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
//var_dump($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
&lt;br /&gt;
// if there are KEYWORDS, look in the title and body fields for the words&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;keywords) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;keywords);&lt;br /&gt;
	$selector .= &amp;quot;title|body|summary%=$value, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Stichwort&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;keywords&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SORTS_ID&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_id) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_id);&lt;br /&gt;
	$selector .= &amp;quot;pr_types=$value, &amp;quot;;&lt;br /&gt;
  $p = $pages-&amp;gt;get($sanitizer-&amp;gt;entities($value));&lt;br /&gt;
	$summary[&amp;quot;Art&amp;quot;] = $p-&amp;gt;title;&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_id&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// PROPERTIES&lt;br /&gt;
// Checkbox names&lt;br /&gt;
$properties = array(&lt;br /&gt;
 &amp;#039;sort_red_list&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_bw_typical&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_rare&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_wild_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_winter_plant&amp;#039;,&lt;br /&gt;
 &amp;#039;sort_useful_ornamental&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
foreach ($properties as $k){&lt;br /&gt;
  $label = $pages-&amp;gt;fields-&amp;gt;get($k)-&amp;gt;label;&lt;br /&gt;
  if($input-&amp;gt;get-&amp;gt;{$k}) {&lt;br /&gt;
  	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;{$k});&lt;br /&gt;
    $selector .= &amp;quot;$k=1, &amp;quot;;&lt;br /&gt;
  	$summary[&amp;quot;$label&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
  	$input-&amp;gt;whitelist($k, $value);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// RED LIST&lt;br /&gt;
/*&lt;br /&gt;
if($input-&amp;gt;get-&amp;gt;sort_red_list) {&lt;br /&gt;
	$value = $sanitizer-&amp;gt;selectorValue($input-&amp;gt;get-&amp;gt;sort_red_list);&lt;br /&gt;
	//$selector .= &amp;quot;sort_properties=1, &amp;quot;; // 1 = red_list&lt;br /&gt;
  $selector .= &amp;quot;sort_red_list=1, &amp;quot;;&lt;br /&gt;
	$summary[&amp;quot;Rote Liste&amp;quot;] = $sanitizer-&amp;gt;entities($value);&lt;br /&gt;
	$input-&amp;gt;whitelist(&amp;#039;sort_red_list&amp;#039;, $value);&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// SEARCH SUMMARY&lt;br /&gt;
$content = &amp;#039;&amp;lt;h5&amp;gt;Ihre Suche&amp;lt;/h5&amp;gt;&amp;lt;ul id=&amp;quot;search_summary&amp;quot; class=&amp;quot;uk-list&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
$browserTitle = &amp;quot;Sorten - &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach($summary as $key =&amp;gt; $value) {&lt;br /&gt;
	if(!$value) continue;&lt;br /&gt;
	$key = ucfirst($key);&lt;br /&gt;
	$content .= &amp;quot;\n\t&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;$key:&amp;lt;/strong&amp;gt; $value&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
	$browserTitle .= &amp;quot;$key: $value, &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$content .= &amp;quot;\n&amp;lt;/ul&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// FINAL OUTPUT&lt;br /&gt;
$content .= renderSortList(findSorts($selector)); &lt;br /&gt;
$browserTitle = rtrim($browserTitle, &amp;quot;, &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
$content = $layoutBlocks.$content;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;content&amp;quot; class=&amp;quot;sort-search uk-width-expand&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;?=$content?&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;aside id=&amp;#039;sidebar&amp;#039; class=&amp;#039;uk-width-1-3@m&amp;#039;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;#039;uk-card uk-card-muted uk-card-hover uk-card-body uk-margin-medium-top&amp;#039;&amp;gt;&lt;br /&gt;
		&amp;lt;?php include(&amp;quot;./includes/search_form_big.php&amp;quot;); ?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;uk-margin&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;?=$page-&amp;gt;sidebar?&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/aside&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Beispiel von Soma ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// create a new form field (also field wrapper)&lt;br /&gt;
$form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;);&lt;br /&gt;
$form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
$form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
$form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;subscribe-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// create a text input&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Name&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;name&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field to the form&lt;br /&gt;
&lt;br /&gt;
// create email field&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;E-Mail&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;#039;id+name&amp;#039;,&amp;#039;email&amp;#039;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field); // append the field&lt;br /&gt;
&lt;br /&gt;
// you get the idea&lt;br /&gt;
$field = $modules-&amp;gt;get(&amp;quot;InputfieldPassword&amp;quot;);&lt;br /&gt;
$field-&amp;gt;label = &amp;quot;Passwort&amp;quot;;&lt;br /&gt;
$field-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;pass&amp;quot;);&lt;br /&gt;
$field-&amp;gt;required = 1;&lt;br /&gt;
$form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
// oh a submit button!&lt;br /&gt;
$submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;value&amp;quot;,&amp;quot;Subscribe&amp;quot;);&lt;br /&gt;
$submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;quot;submit&amp;quot;);&lt;br /&gt;
$form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
// form was submitted so we process the form&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
&lt;br /&gt;
    // user submitted the form, process it and check for errors&lt;br /&gt;
    $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
    // here is a good point for extra/custom validation and manipulate fields&lt;br /&gt;
    $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if($email &amp;amp;&amp;amp; (strpos($email-&amp;gt;value,&amp;#039;@hotmail&amp;#039;) !== FALSE)){        // attach an error to the field&lt;br /&gt;
        // and it will get displayed along the field&lt;br /&gt;
        $email-&amp;gt;error(&amp;quot;Sorry we don&amp;#039;t accept hotmail addresses for now.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        // the form is processed and populated&lt;br /&gt;
        // but contains errors&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        // do with the form what you like, create and save it as page&lt;br /&gt;
        // or send emails. to get the values you can use&lt;br /&gt;
        // $email = $form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $name = $form-&amp;gt;get(&amp;quot;name&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        // $pass = $form-&amp;gt;get(&amp;quot;pass&amp;quot;)-&amp;gt;value;&lt;br /&gt;
        //&lt;br /&gt;
        // to sanitize input&lt;br /&gt;
        // $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;name);&lt;br /&gt;
        // $email = $sanitizer-&amp;gt;email($form-&amp;gt;get(&amp;quot;email&amp;quot;)-&amp;gt;value);&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;quot;&amp;lt;p&amp;gt;Thanks! Your submission was successful.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
} else {&lt;br /&gt;
    // render out form without processing&lt;br /&gt;
    $out .= $form-&amp;gt;render();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
echo $out;&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einfaches Formular mit E-Mail versand (ohne Spamschutz)===&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;
function renderContactForm($backend_email, $subject) {&lt;br /&gt;
  $out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
  $modules = wire(&amp;#039;modules&amp;#039;); // get access to pw modules object&lt;br /&gt;
  $input = wire(&amp;#039;input&amp;#039;);&lt;br /&gt;
  $sanitizer = wire(&amp;#039;sanitizer&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  // Create the new &amp;lt;form&amp;gt;&lt;br /&gt;
  $form = $modules-&amp;gt;get(&amp;quot;InputfieldForm&amp;quot;); // get InputfieldForm Object&lt;br /&gt;
  $form-&amp;gt;action = &amp;quot;./&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;method = &amp;quot;post&amp;quot;;&lt;br /&gt;
  $form-&amp;gt;attr(&amp;quot;id+name&amp;quot;,&amp;#039;contact-form&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// Set markup for form elements&lt;br /&gt;
  $form-&amp;gt;setMarkup(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;quot;&amp;lt;div {attrs}&amp;gt;{out}&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
    //&amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;lt;label for=&amp;#039;{for}&amp;#039;&amp;gt;{out}&amp;lt;/label&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_label&amp;#039; =&amp;gt; &amp;quot;&amp;quot;, // no label markup for this form&lt;br /&gt;
    &amp;#039;item_content&amp;#039; =&amp;gt; &amp;quot;{out}&amp;quot;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=\&amp;quot;error\&amp;quot;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_description&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_head&amp;#039; =&amp;gt; &amp;quot;&amp;lt;h2&amp;gt;{out}&amp;lt;/h2&amp;gt;&amp;quot;,&lt;br /&gt;
    &amp;#039;item_notes&amp;#039; =&amp;gt; &amp;quot;&amp;lt;p class=&amp;#039;notes&amp;#039;&amp;gt;{out}&amp;lt;/p&amp;gt;&amp;quot;,&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// Set classes for form elements&lt;br /&gt;
  $form-&amp;gt;setClasses(array(&lt;br /&gt;
    &amp;#039;list&amp;#039; =&amp;gt; &amp;#039;form-list&amp;#039;,&lt;br /&gt;
    &amp;#039;list_clearfix&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item&amp;#039; =&amp;gt; &amp;#039;{class}&amp;#039;,&lt;br /&gt;
    &amp;#039;item_required&amp;#039; =&amp;gt; &amp;#039;required&amp;#039;,&lt;br /&gt;
    &amp;#039;item_error&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_collapsed&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;item_column_width_first&amp;#039; =&amp;gt; &amp;#039;&amp;#039;&lt;br /&gt;
  ));&lt;br /&gt;
&lt;br /&gt;
	// New field: First name&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Name&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;name&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihr Name&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: E-Mail&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldEmail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;E-mail&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre E-Mail Adresse&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Phone&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldText&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Telefon&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;phone&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Telefonnummer&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
	// New field: Message&lt;br /&gt;
  $field = $modules-&amp;gt;get(&amp;quot;InputfieldTextarea&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;label = __(&amp;quot;Nachricht&amp;quot;);&lt;br /&gt;
  $field-&amp;gt;attr([&lt;br /&gt;
    &amp;#039;id+name&amp;#039; =&amp;gt; &amp;#039;message&amp;#039;,&lt;br /&gt;
    &amp;#039;placeholder&amp;#039; =&amp;gt; &amp;#039;Ihre Nachricht&amp;#039;,&lt;br /&gt;
    &amp;#039;class&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;&lt;br /&gt;
    ]);&lt;br /&gt;
  $field-&amp;gt;required = 1;&lt;br /&gt;
  $form-&amp;gt;append($field);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // SUBMIT button!&lt;br /&gt;
  $submit = $modules-&amp;gt;get(&amp;quot;InputfieldSubmit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;id+name&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $submit-&amp;gt;attr(&amp;quot;class&amp;quot;, &amp;quot;submit&amp;quot;);&lt;br /&gt;
  $form-&amp;gt;append($submit);&lt;br /&gt;
&lt;br /&gt;
  // POST request, process the form&lt;br /&gt;
  if($input-&amp;gt;post-&amp;gt;submit) {&lt;br /&gt;
      $form-&amp;gt;processInput($input-&amp;gt;post);&lt;br /&gt;
&lt;br /&gt;
      $name = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;firstname);&lt;br /&gt;
      $email = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;email);&lt;br /&gt;
      $message = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;message);&lt;br /&gt;
      $phone = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;phone);&lt;br /&gt;
&lt;br /&gt;
      // ERRORS...&lt;br /&gt;
      if($form-&amp;gt;getErrors()) {&lt;br /&gt;
        $out .= $form-&amp;gt;render();&lt;br /&gt;
      } else {&lt;br /&gt;
        // FORM OK...&lt;br /&gt;
      	// Process the form here!&lt;br /&gt;
&lt;br /&gt;
        $mail = wireMail();&lt;br /&gt;
        $mail-&amp;gt;to($backend_email)-&amp;gt;from($email);&lt;br /&gt;
        $mail-&amp;gt;subject($subject);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        $body = &amp;quot;Name: &amp;quot; . $firstname . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;E-Mail: &amp;quot; . $email . &amp;quot;\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Telefon: &amp;quot; . $phone . &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
        $body .= &amp;quot;Nachricht:\n&amp;quot; . $message;&lt;br /&gt;
&lt;br /&gt;
        $mail-&amp;gt;body($body);&lt;br /&gt;
&lt;br /&gt;
        echo &amp;#039;&amp;lt;pre&amp;gt;&amp;#039;.$body.&amp;#039;&amp;lt;/pre&amp;gt;&amp;#039;;&lt;br /&gt;
        $numSent = $mail-&amp;gt;send();&lt;br /&gt;
&lt;br /&gt;
        $out .= &amp;#039;&amp;lt;p&amp;gt;&amp;#039;.__(&amp;quot;Vielen Dank für Ihre Nachricht! Wir melden uns so bald wie möglich.&amp;quot;).&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
      }&lt;br /&gt;
  } else {&lt;br /&gt;
      // GET request, simply show the form&lt;br /&gt;
      $out .= $form-&amp;gt;render();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return $out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Formular mit Upload Funktion (von Soma) ===&lt;br /&gt;
[[ProcessWire Upload Formular]]&lt;br /&gt;
&lt;br /&gt;
=== CSRF in eigenen Formularen ===&lt;br /&gt;
 [[ProcessWire - Formulare mit CSRF Schutz]]&lt;br /&gt;
&lt;br /&gt;
Formulare mit Token und Sessionfunktionen von ProcessWire ausstatten. Das geht auch mit selbst erstelltem Markup.&lt;br /&gt;
 https://processwire-recipes.com/recipes/use-csrf-in-your-own-forms/&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23616</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23616"/>
		<updated>2019-02-09T16:25:32Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch&lt;br /&gt;
&lt;br /&gt;
 [[HTML5 - Drag n Drop Upload]]&lt;br /&gt;
 https://gist.github.com/lokomotivan/36505531e2644db3f9f270415e2d7a35&lt;br /&gt;
&lt;br /&gt;
Hinweis - funktioniert noch nicht wahrscheinlich muß noch die Übergabe an ProcessWire überarbeitet werden. Für moderne Browser ist es wahrscheinlich ohnehin besser die HTML5 Funktionalitäten zu nutzen. (siehe HTML5 Drag n Drop Upload&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Das Formular für Dropzone einrichten ==&lt;br /&gt;
Standardmäßig legt man mit Dropzonejs ein eigenes Form-Tag an. Bilder werden automatisch hochgeladen. Wir wollen aber ein etwas anderes Verhalten erreichen.&lt;br /&gt;
* Über das Dropzone.options Objekt können wir ein beliebiges Div für die Dropzone nutzen. Dazu Instanziiert man für eine div mit der id myDropzone etwa so:&lt;br /&gt;
 Dropzone.options.myDropzone= {...&lt;br /&gt;
* Damit Dropzone die Dateien nicht sofort hochlädt deaktivieren wir die Option autoProcessQueue&lt;br /&gt;
* Wenn der Submit Button geklickt wird fangen wir das Standardverhalten des Browsers, hängen die Daten des Formulars an die Dropzonedaten und lssen Dropzone alles absenden.&lt;br /&gt;
&lt;br /&gt;
Das Skript sieht dann etwa so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Dropzone.options.myDropzone= {&lt;br /&gt;
    url: &amp;#039;./&amp;#039;,&lt;br /&gt;
    autoProcessQueue: false,&lt;br /&gt;
    uploadMultiple: true,&lt;br /&gt;
    parallelUploads: 5,&lt;br /&gt;
    maxFiles: 5,&lt;br /&gt;
    maxFilesize: 1,&lt;br /&gt;
    acceptedFiles: &amp;#039;image/*&amp;#039;,&lt;br /&gt;
    addRemoveLinks: true,&lt;br /&gt;
    init: function() {&lt;br /&gt;
        dzClosure = this; // Makes sure that &amp;#039;this&amp;#039; is understood inside the functions below.&lt;br /&gt;
&lt;br /&gt;
        // for Dropzone to process the queue (instead of default form behavior):&lt;br /&gt;
        document.getElementById(&amp;quot;submit-form&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
            // Make sure that the form isn&amp;#039;t actually being sent.&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            dzClosure.processQueue();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Send all form fields along with images&lt;br /&gt;
        this.on(&amp;quot;sendingmultiple&amp;quot;, function(data, xhr, formData) {&lt;br /&gt;
            formData.append(&amp;quot;fullname&amp;quot;, jQuery(&amp;quot;#fullname&amp;quot;).val());&lt;br /&gt;
            formData.append(&amp;quot;email&amp;quot;, jQuery(&amp;quot;#email&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;message&amp;quot;, jQuery(&amp;quot;#message&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;newsletter_subscribe&amp;quot;, jQuery(&amp;quot;#newsletter_subscribe&amp;quot;).val());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Häh ? ===&lt;br /&gt;
So geht das in der Praxis...&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23615</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23615"/>
		<updated>2019-02-09T16:22:23Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch&lt;br /&gt;
&lt;br /&gt;
[[HTML5 - Drag n Drop Upload]]&lt;br /&gt;
&lt;br /&gt;
Hinweis - funktioniert noch nicht wahrscheinlich muß noch die Übergabe an ProcessWire überarbeitet werden. Für moderne Browser ist es wahrscheinlich ohnehin besser die HTML5 Funktionalitäten zu nutzen. (siehe HTML5 Drag n Drop Upload&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Das Formular für Dropzone einrichten ==&lt;br /&gt;
Standardmäßig legt man mit Dropzonejs ein eigenes Form-Tag an. Bilder werden automatisch hochgeladen. Wir wollen aber ein etwas anderes Verhalten erreichen.&lt;br /&gt;
* Über das Dropzone.options Objekt können wir ein beliebiges Div für die Dropzone nutzen. Dazu Instanziiert man für eine div mit der id myDropzone etwa so:&lt;br /&gt;
 Dropzone.options.myDropzone= {...&lt;br /&gt;
* Damit Dropzone die Dateien nicht sofort hochlädt deaktivieren wir die Option autoProcessQueue&lt;br /&gt;
* Wenn der Submit Button geklickt wird fangen wir das Standardverhalten des Browsers, hängen die Daten des Formulars an die Dropzonedaten und lssen Dropzone alles absenden.&lt;br /&gt;
&lt;br /&gt;
Das Skript sieht dann etwa so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Dropzone.options.myDropzone= {&lt;br /&gt;
    url: &amp;#039;./&amp;#039;,&lt;br /&gt;
    autoProcessQueue: false,&lt;br /&gt;
    uploadMultiple: true,&lt;br /&gt;
    parallelUploads: 5,&lt;br /&gt;
    maxFiles: 5,&lt;br /&gt;
    maxFilesize: 1,&lt;br /&gt;
    acceptedFiles: &amp;#039;image/*&amp;#039;,&lt;br /&gt;
    addRemoveLinks: true,&lt;br /&gt;
    init: function() {&lt;br /&gt;
        dzClosure = this; // Makes sure that &amp;#039;this&amp;#039; is understood inside the functions below.&lt;br /&gt;
&lt;br /&gt;
        // for Dropzone to process the queue (instead of default form behavior):&lt;br /&gt;
        document.getElementById(&amp;quot;submit-form&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
            // Make sure that the form isn&amp;#039;t actually being sent.&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            dzClosure.processQueue();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Send all form fields along with images&lt;br /&gt;
        this.on(&amp;quot;sendingmultiple&amp;quot;, function(data, xhr, formData) {&lt;br /&gt;
            formData.append(&amp;quot;fullname&amp;quot;, jQuery(&amp;quot;#fullname&amp;quot;).val());&lt;br /&gt;
            formData.append(&amp;quot;email&amp;quot;, jQuery(&amp;quot;#email&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;message&amp;quot;, jQuery(&amp;quot;#message&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;newsletter_subscribe&amp;quot;, jQuery(&amp;quot;#newsletter_subscribe&amp;quot;).val());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Häh ? ===&lt;br /&gt;
So geht das in der Praxis...&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23614</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23614"/>
		<updated>2019-02-09T16:09:16Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Schritt 2 - Das Formular für Dropzone einrichten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch&lt;br /&gt;
&lt;br /&gt;
[[HTML5 - Drag n Drop Upload]]&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Das Formular für Dropzone einrichten ==&lt;br /&gt;
Standardmäßig legt man mit Dropzonejs ein eigenes Form-Tag an. Bilder werden automatisch hochgeladen. Wir wollen aber ein etwas anderes Verhalten erreichen.&lt;br /&gt;
* Über das Dropzone.options Objekt können wir ein beliebiges Div für die Dropzone nutzen. Dazu Instanziiert man für eine div mit der id myDropzone etwa so:&lt;br /&gt;
 Dropzone.options.myDropzone= {...&lt;br /&gt;
* Damit Dropzone die Dateien nicht sofort hochlädt deaktivieren wir die Option autoProcessQueue&lt;br /&gt;
* Wenn der Submit Button geklickt wird fangen wir das Standardverhalten des Browsers, hängen die Daten des Formulars an die Dropzonedaten und lssen Dropzone alles absenden.&lt;br /&gt;
&lt;br /&gt;
Das Skript sieht dann etwa so aus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
Dropzone.options.myDropzone= {&lt;br /&gt;
    url: &amp;#039;./&amp;#039;,&lt;br /&gt;
    autoProcessQueue: false,&lt;br /&gt;
    uploadMultiple: true,&lt;br /&gt;
    parallelUploads: 5,&lt;br /&gt;
    maxFiles: 5,&lt;br /&gt;
    maxFilesize: 1,&lt;br /&gt;
    acceptedFiles: &amp;#039;image/*&amp;#039;,&lt;br /&gt;
    addRemoveLinks: true,&lt;br /&gt;
    init: function() {&lt;br /&gt;
        dzClosure = this; // Makes sure that &amp;#039;this&amp;#039; is understood inside the functions below.&lt;br /&gt;
&lt;br /&gt;
        // for Dropzone to process the queue (instead of default form behavior):&lt;br /&gt;
        document.getElementById(&amp;quot;submit-form&amp;quot;).addEventListener(&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
            // Make sure that the form isn&amp;#039;t actually being sent.&lt;br /&gt;
            e.preventDefault();&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            dzClosure.processQueue();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Send all form fields along with images&lt;br /&gt;
        this.on(&amp;quot;sendingmultiple&amp;quot;, function(data, xhr, formData) {&lt;br /&gt;
            formData.append(&amp;quot;fullname&amp;quot;, jQuery(&amp;quot;#fullname&amp;quot;).val());&lt;br /&gt;
            formData.append(&amp;quot;email&amp;quot;, jQuery(&amp;quot;#email&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;message&amp;quot;, jQuery(&amp;quot;#message&amp;quot;).val());&lt;br /&gt;
						formData.append(&amp;quot;newsletter_subscribe&amp;quot;, jQuery(&amp;quot;#newsletter_subscribe&amp;quot;).val());&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Häh ? ===&lt;br /&gt;
So geht das in der Praxis...&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Drag_n_Drop_Upload&amp;diff=23613</id>
		<title>HTML5 - Drag n Drop Upload</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=HTML5_-_Drag_n_Drop_Upload&amp;diff=23613"/>
		<updated>2019-02-09T15:53:47Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „  https://makitweb.com/drag-and-drop-file-upload-with-jquery-and-ajax/  https://css-tricks.com/drag-and-drop-file-uploading/  https://bitwiser.in/2015/08/08/cr…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 https://makitweb.com/drag-and-drop-file-upload-with-jquery-and-ajax/&lt;br /&gt;
 https://css-tricks.com/drag-and-drop-file-uploading/&lt;br /&gt;
 https://bitwiser.in/2015/08/08/creating-dropzone-for-drag-drop-file.html&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23612</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23612"/>
		<updated>2019-02-09T15:50:57Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Siehe auch&lt;br /&gt;
&lt;br /&gt;
[[HTML5 - Drag n Drop Upload]]&lt;br /&gt;
&lt;br /&gt;
Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Das Formular für Dropzone einrichten ==&lt;br /&gt;
Der auf Dropzonejs.com beschriebene Standardweg ist ein eigenes Form Tag mit der Klasse dropzone auszustatten. Doof aber wenn man aber die Daten des eigenen Forms gleichzeitig bearbeiten will. Daher gehen wir folgendermaßen vor:&lt;br /&gt;
# Wir nutzen unser Formular das bereits ein Upload Feld und die passenden Argumente hat. &lt;br /&gt;
# Wir nutzen ein eigenes div für die Dropzone und setzen eine id. Mit dieser id sagen wir dropzone wo es ansetzen soll.&lt;br /&gt;
# In Dropzones Optionen deaktivieren wir autoProcessQueue, damit die Dateien erst übermittelt werden, wenn wir das Formular absenden. Außerdem erlauben wir multiple Uploads.&lt;br /&gt;
# Wir nutzen die init function um selbst die Ausführung zu übernehmen. Hier können wir dann das sendingmultiple eventhandler nutzen um alles abzuschicken. &lt;br /&gt;
# Auf diese Weise können wir wie vorher ohne dropbox die Files über $_POST und $_FILES bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Häh ? ===&lt;br /&gt;
So geht das in der Praxis...&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23611</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23611"/>
		<updated>2019-02-09T14:20:38Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um Spambots einzufangen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;br /&gt;
&lt;br /&gt;
== Schritt 2 - Das Formular für Dropzone einrichten ==&lt;br /&gt;
Der auf Dropzonejs.com beschriebene Standardweg ist ein eigenes Form Tag mit der Klasse dropzone auszustatten. Doof aber wenn man aber die Daten des eigenen Forms gleichzeitig bearbeiten will. Daher gehen wir folgendermaßen vor:&lt;br /&gt;
# Wir nutzen unser Formular das bereits ein Upload Feld und die passenden Argumente hat. &lt;br /&gt;
# Wir nutzen ein eigenes div für die Dropzone und setzen eine id. Mit dieser id sagen wir dropzone wo es ansetzen soll.&lt;br /&gt;
# In Dropzones Optionen deaktivieren wir autoProcessQueue, damit die Dateien erst übermittelt werden, wenn wir das Formular absenden. Außerdem erlauben wir multiple Uploads.&lt;br /&gt;
# Wir nutzen die init function um selbst die Ausführung zu übernehmen. Hier können wir dann das sendingmultiple eventhandler nutzen um alles abzuschicken. &lt;br /&gt;
# Auf diese Weise können wir wie vorher ohne dropbox die Files über $_POST und $_FILES bearbeiten.&lt;br /&gt;
&lt;br /&gt;
=== Häh ? ===&lt;br /&gt;
So geht das in der Praxis...&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23610</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23610"/>
		<updated>2019-02-09T14:11:10Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Schritt 1 - Dropzone Skripte einbinden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um automatisierte Uploads zu verhindern.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dropzone ist jetzt bereits aktiv und kann über window.dropzone angesprochen werden.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23609</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23609"/>
		<updated>2019-02-09T14:03:04Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Schritt 1 - Dropzone Skripte einbinden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um automatisierte Uploads zu verhindern.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;br /&gt;
Im Footerbereich des Templates (ich nutze dazu immer eine Variable) binden wir das Skript ein. Dazu im Head auch gleich das mitgelieferte Basis CSS, damit wir uns etwas Arbeit sparen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$additionalHeaderData .= &amp;#039;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/basic.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
$additionalFooterData .= &amp;#039;&lt;br /&gt;
&amp;lt;script src=&amp;quot;&amp;#039;.urls()-&amp;gt;templates.&amp;#039;vendors/dropzone/dropzone.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23608</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23608"/>
		<updated>2019-02-09T13:31:12Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen. Außerdem wäre ein Honeypot nicht schlecht um automatisierte Uploads zu verhindern.&lt;br /&gt;
&lt;br /&gt;
== Schritt 1 - Dropzone Skripte einbinden ==&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23607</id>
		<title>ProcessWire UploadFormular Dropzone Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_UploadFormular_Dropzone_Enhanced&amp;diff=23607"/>
		<updated>2019-02-09T13:29:08Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: Die Seite wurde neu angelegt: „Dieses Beispiel basiert auf: ProcessWire Upload Formular. Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieses Beispiel basiert auf: [[ProcessWire Upload Formular]].&lt;br /&gt;
Wir möchten für eine komfortablere User Eingabe DropzoneJS nutzen. Die Konfiguration soll sehr sicher sein, daher werden wir etliche Features voraussichtlich nicht nutzen.&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23606</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23606"/>
		<updated>2019-02-09T13:27:40Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire UploadFormular Dropzone Enhanced]]&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Für das Formular kommen aus ProcessWire der Sanitizer, die WireUpload Klasse und Session Tokens zum Einsatz. Das Formular wird validiert. Das Markup für das Formular steht direkt im Template, wird also nicht über die Formularfunktionen von ProcessWire erzeugt. Das ist oft die schnellere Variante, vor allem wenn das Markup sehr individuell ist.&lt;br /&gt;
&lt;br /&gt;
Der Code basiert auf Somatonics Beispiel (s.o.) und wurde leicht angepasst. &lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Dateiupload (Bilder)&lt;br /&gt;
* Formulareingaben als Seiten speichern (inkl. Bilder)&lt;br /&gt;
* Verhindert CRSF Attacken und doppelte Posts durch neu Laden&lt;br /&gt;
* Formular validierung mit Inline Messages&lt;br /&gt;
* Feldvariablen werden durch den Sanitizer bereinigt&lt;br /&gt;
* Kleines jQuery Beispiel um den Submit Button nach Absenden zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
 TEMPLATES&lt;br /&gt;
 basic-upload&lt;br /&gt;
   FELDER: title&lt;br /&gt;
 basic-upload-entry&lt;br /&gt;
   FELDER: title, fullname, email, message, newsletter_subscribe, images&lt;br /&gt;
&lt;br /&gt;
 SEITEN&lt;br /&gt;
 /basic-upload/&lt;br /&gt;
 /basic-upload/[automatisch-erzeugte-seiten]&lt;br /&gt;
&lt;br /&gt;
Das Formular liegt in der Seite &lt;br /&gt;
 /basic-upload/ &lt;br /&gt;
Mit dem Template &amp;#039;basic-upload&amp;#039; (basic-upload.php)&lt;br /&gt;
&lt;br /&gt;
Beim Absenden eines gültigen Formulars werden unterhalb der Formularseite weitere Seiten generiert. Diese erhalten das Template basic-upload-entry. Wenn man die erzeugten Seiten im Frontend anzeigen möchte braucht man natürlich noch ein PHP File für basic-upload-entry. Ansonsten kann man sich die Seiten im Backend anzeigen.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;templates/partials/basic-upload/form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
templates/basic-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./partials/basic-upload/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form.js (jQuery)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23605</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23605"/>
		<updated>2019-02-09T13:26:47Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Für das Formular kommen aus ProcessWire der Sanitizer, die WireUpload Klasse und Session Tokens zum Einsatz. Das Formular wird validiert. Das Markup für das Formular steht direkt im Template, wird also nicht über die Formularfunktionen von ProcessWire erzeugt. Das ist oft die schnellere Variante, vor allem wenn das Markup sehr individuell ist.&lt;br /&gt;
&lt;br /&gt;
Der Code basiert auf Somatonics Beispiel (s.o.) und wurde leicht angepasst. &lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
* Dateiupload (Bilder)&lt;br /&gt;
* Formulareingaben als Seiten speichern (inkl. Bilder)&lt;br /&gt;
* Verhindert CRSF Attacken und doppelte Posts durch neu Laden&lt;br /&gt;
* Formular validierung mit Inline Messages&lt;br /&gt;
* Feldvariablen werden durch den Sanitizer bereinigt&lt;br /&gt;
* Kleines jQuery Beispiel um den Submit Button nach Absenden zu deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
 TEMPLATES&lt;br /&gt;
 basic-upload&lt;br /&gt;
   FELDER: title&lt;br /&gt;
 basic-upload-entry&lt;br /&gt;
   FELDER: title, fullname, email, message, newsletter_subscribe, images&lt;br /&gt;
&lt;br /&gt;
 SEITEN&lt;br /&gt;
 /basic-upload/&lt;br /&gt;
 /basic-upload/[automatisch-erzeugte-seiten]&lt;br /&gt;
&lt;br /&gt;
Das Formular liegt in der Seite &lt;br /&gt;
 /basic-upload/ &lt;br /&gt;
Mit dem Template &amp;#039;basic-upload&amp;#039; (basic-upload.php)&lt;br /&gt;
&lt;br /&gt;
Beim Absenden eines gültigen Formulars werden unterhalb der Formularseite weitere Seiten generiert. Diese erhalten das Template basic-upload-entry. Wenn man die erzeugten Seiten im Frontend anzeigen möchte braucht man natürlich noch ein PHP File für basic-upload-entry. Ansonsten kann man sich die Seiten im Backend anzeigen.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;templates/partials/basic-upload/form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
templates/basic-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./partials/basic-upload/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form.js (jQuery)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23604</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23604"/>
		<updated>2019-02-09T13:20:53Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Siehe auch ==&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Für das Formular kommen aus ProcessWire der Sanitizer, die WireUpload Klasse und Session Tokens zum Einsatz. Das Formular wird validiert. Das Markup für das Formular steht direkt im Template, wird also nicht über die Formularfunktionen von ProcessWire erzeugt. Das ist oft die schnellere Variante, vor allem wenn das Markup sehr individuell ist.&lt;br /&gt;
&lt;br /&gt;
Der Code basiert auf Somatonics Beispiel (s.o.) und wurde leicht angepasst.&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
 TEMPLATES&lt;br /&gt;
 basic-upload&lt;br /&gt;
   FELDER: title&lt;br /&gt;
 basic-upload-entry&lt;br /&gt;
   FELDER: title, fullname, email, message, newsletter_subscribe, images&lt;br /&gt;
&lt;br /&gt;
 SEITEN&lt;br /&gt;
 /basic-upload/&lt;br /&gt;
 /basic-upload/[automatisch-erzeugte-seiten]&lt;br /&gt;
&lt;br /&gt;
Das Formular liegt in der Seite &lt;br /&gt;
 /basic-upload/ &lt;br /&gt;
Mit dem Template &amp;#039;basic-upload&amp;#039; (basic-upload.php)&lt;br /&gt;
&lt;br /&gt;
Beim Absenden eines gültigen Formulars werden unterhalb der Formularseite weitere Seiten generiert. Diese erhalten das Template basic-upload-entry. Wenn man die erzeugten Seiten im Frontend anzeigen möchte braucht man natürlich noch ein PHP File für basic-upload-entry. Ansonsten kann man sich die Seiten im Backend anzeigen.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;templates/partials/basic-upload/form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
templates/basic-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./partials/basic-upload/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form.js (jQuery)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23603</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23603"/>
		<updated>2019-02-09T13:09:26Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Für das Formular kommen aus ProcessWire der Sanitizer, die WireUpload Klasse und Session Tokens zum Einsatz. Das Formular wird validiert.&lt;br /&gt;
&lt;br /&gt;
Der Code basiert auf Somatonics Beispiel (s.u.)&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;templates/partials/basic-upload/form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
						print_r($template);&lt;br /&gt;
						//var_dump($parent);&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;Y-m-d_H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
templates/basic-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace ProcessWire;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
$success = false;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 2*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;basic-upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/basic-upload/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./partials/basic-upload/form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;Creates Pages in Backend from Form including upload field.&amp;lt;/p&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form.js (jQuery)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23602</id>
		<title>ProcessWire Upload Formular</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_Upload_Formular&amp;diff=23602"/>
		<updated>2019-02-09T12:29:51Z</updated>

		<summary type="html">&lt;p&gt;93.208.103.149: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Übersicht ==&lt;br /&gt;
Ein einfaches Upload Formular mit dem der Benutzer Dateien übermitteln kann. Einige Sicherheitsrichtlinien werden hier bereits beachtet.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
 https://gist.github.com/somatonic/5233338&lt;br /&gt;
 [[ProcessWire - File Upload mit Blueimp jQueryFileUpload]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;form-process.php&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
$errors            = null;&lt;br /&gt;
$success           = false;&lt;br /&gt;
&lt;br /&gt;
// helper function to format form errors&lt;br /&gt;
function showError($e){&lt;br /&gt;
    return &amp;quot;&amp;lt;p class=&amp;#039;error&amp;#039;&amp;gt;$e&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// dump some variables&lt;br /&gt;
// var_dump($_FILES,$_POST,$_SESSION);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Cast and save field values in array $form_fields&lt;br /&gt;
 * this is also done even form not submited to make populating the form later easier.&lt;br /&gt;
 *&lt;br /&gt;
 * Also used for pupulating page when form was valid&lt;br /&gt;
 */&lt;br /&gt;
$required_fields = array();&lt;br /&gt;
foreach($form_fields as $key =&amp;gt; $f){&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;text($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;textarea($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = $sanitizer-&amp;gt;email($input-&amp;gt;post-&amp;gt;$key);&lt;br /&gt;
    }&lt;br /&gt;
    if($f[&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
        $form_fields[$key][&amp;#039;value&amp;#039;] = isset($input-&amp;gt;post-&amp;gt;$key) ? 1 : 0;&lt;br /&gt;
    }&lt;br /&gt;
    // store required fields in array&lt;br /&gt;
    if($f[&amp;#039;required&amp;#039;]) $required_fields[] = $key;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * form was submitted, start processing the form&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
if($input-&amp;gt;post-&amp;gt;action == &amp;#039;send&amp;#039;){&lt;br /&gt;
&lt;br /&gt;
    // validate CSRF token first to check if it&amp;#039;s a valid request&lt;br /&gt;
    if(!$session-&amp;gt;CSRF-&amp;gt;hasValidToken()){&lt;br /&gt;
        $errors[&amp;#039;csrf&amp;#039;] = &amp;quot;Form submit was not valid, please try again.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Ceck for required fields and make sure they have a value&lt;br /&gt;
     */&lt;br /&gt;
    foreach($required_fields as $req){&lt;br /&gt;
&lt;br /&gt;
        // required upload file field&lt;br /&gt;
        if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;file&amp;#039;){&lt;br /&gt;
            if(empty($_FILES[$req][&amp;#039;name&amp;#039;][0])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Select files to upload.&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired checkbox fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;checkbox&amp;#039;){&lt;br /&gt;
            if($form_fields[$req][&amp;#039;value&amp;#039;] == 0){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        // reqired text fields&lt;br /&gt;
        } else if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;text&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;textarea&amp;#039;&lt;br /&gt;
                  || $form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
            if(!strlen($form_fields[$req][&amp;#039;value&amp;#039;])){&lt;br /&gt;
                $errors[$req] = &amp;quot;Field required&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            // reqired email fields&lt;br /&gt;
            if($form_fields[$req][&amp;#039;type&amp;#039;] == &amp;#039;email&amp;#039;){&lt;br /&gt;
                if($form_fields[$req][&amp;#039;value&amp;#039;] != $input-&amp;gt;post-&amp;gt;$req){&lt;br /&gt;
                    $errors[$req] = &amp;quot;Please enter a valid Email address.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * if no required errors found yet continue file upload form processing&lt;br /&gt;
     */&lt;br /&gt;
    if(empty($errors)) {&lt;br /&gt;
&lt;br /&gt;
        // RC: create temp path if it isn&amp;#039;t there already&lt;br /&gt;
        if(!is_dir($upload_path)) {&lt;br /&gt;
            if(!wireMkdir($upload_path)) throw new WireException(&amp;quot;No upload path!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // setup new wire upload&lt;br /&gt;
        $u = new WireUpload($file_field);&lt;br /&gt;
        $u-&amp;gt;setMaxFiles($max_files);&lt;br /&gt;
        $u-&amp;gt;setMaxFileSize($max_upload_size);&lt;br /&gt;
        $u-&amp;gt;setOverwrite($overwrite);&lt;br /&gt;
        $u-&amp;gt;setDestinationPath($upload_path);&lt;br /&gt;
        $u-&amp;gt;setValidExtensions($file_extensions);&lt;br /&gt;
&lt;br /&gt;
        // start the upload of the files&lt;br /&gt;
        $files = $u-&amp;gt;execute();&lt;br /&gt;
&lt;br /&gt;
        // if no errors when uploading files&lt;br /&gt;
        if(!$u-&amp;gt;getErrors()){&lt;br /&gt;
&lt;br /&gt;
            // create the new page to add field values and uploaded images&lt;br /&gt;
            $uploadpage = new Page();&lt;br /&gt;
            $uploadpage-&amp;gt;template = $template;&lt;br /&gt;
            $uploadpage-&amp;gt;parent = $parent;&lt;br /&gt;
&lt;br /&gt;
            // add title/name and make it unique with time and uniqid&lt;br /&gt;
            $uploadpage-&amp;gt;title = date(&amp;quot;d-m-Y H:i:s&amp;quot;) . &amp;quot; - &amp;quot; . uniqid();&lt;br /&gt;
&lt;br /&gt;
            // populate page fields with values using $page_fields array&lt;br /&gt;
            foreach($page_fields as $pf){&lt;br /&gt;
                if($templates-&amp;gt;get($template)-&amp;gt;hasField($pf)){&lt;br /&gt;
                    $uploadpage-&amp;gt;$pf = $form_fields[$pf][&amp;#039;value&amp;#039;];&lt;br /&gt;
                } else {&lt;br /&gt;
                    throw new WireException(&amp;quot;Template &amp;#039;$template&amp;#039; has no field: $pf&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // RC: for safety, only add user uploaded files to an unpublished page, for later approval&lt;br /&gt;
            // RC: also ensure that using v2.3+, and $config-&amp;gt;pagefileSecure=true; in your /site/config.php&lt;br /&gt;
            $uploadpage-&amp;gt;addStatus(Page::statusUnpublished);&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // Now page is created we can add images upload to the page file field&lt;br /&gt;
            foreach($files as $filename) {&lt;br /&gt;
                $uploadpage-&amp;gt;$file_field = $upload_path . $filename;&lt;br /&gt;
                // remove tmp file uploaded&lt;br /&gt;
                unlink($upload_path . $filename);&lt;br /&gt;
            }&lt;br /&gt;
            $uploadpage-&amp;gt;save();&lt;br /&gt;
&lt;br /&gt;
            // $success_message .= &amp;quot;&amp;lt;p&amp;gt;Page created: &amp;lt;a href=&amp;#039;$uploadpage-&amp;gt;url&amp;#039;&amp;gt;$uploadpage-&amp;gt;title&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
            $success = true;&lt;br /&gt;
&lt;br /&gt;
            // reset the token so no double posts happen&lt;br /&gt;
            // also prevent submit button to from double clicking is a good pratice&lt;br /&gt;
            $session-&amp;gt;CSRF-&amp;gt;resetToken();&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
            // errors found&lt;br /&gt;
            $success = false;&lt;br /&gt;
&lt;br /&gt;
            // remove files uploaded&lt;br /&gt;
            foreach($files as $filename) unlink($upload_path . $filename);&lt;br /&gt;
&lt;br /&gt;
            // get the errors&lt;br /&gt;
            if(count($u-&amp;gt;getErrors()) &amp;gt; 1){ // if multiple error&lt;br /&gt;
                foreach($u-&amp;gt;getErrors() as $e) {&lt;br /&gt;
                    $errors[$file_field][] = $e;&lt;br /&gt;
                }&lt;br /&gt;
            } else { // if single error&lt;br /&gt;
                $errors[$file_field] = $u-&amp;gt;getErrors();&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;
&lt;br /&gt;
form-upload.php&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * ### Example front-end form template with file upload and fields ###&lt;br /&gt;
 *&lt;br /&gt;
 * - with files (images) upload to page field&lt;br /&gt;
 * - adds new page on the fly and adds uploaded images&lt;br /&gt;
 * - prevents CRSF attacks, this also prevents double post by refresh page after submit&lt;br /&gt;
 * - has required fields with error messages inline&lt;br /&gt;
 * - sanitizing and saving values to a page&lt;br /&gt;
 * - jquery example with disabled submit button on form submit&lt;br /&gt;
 *&lt;br /&gt;
 * Edit add or remove form markup below and configure this section according to what you need.&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Configuration ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
// --- Some default variables ---&lt;br /&gt;
$success_message   = &amp;quot;&amp;lt;p class=&amp;#039;message&amp;#039;&amp;gt;Thanks for your message!&amp;lt;/p&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// --- All form fields as nested array ---&lt;br /&gt;
// using html form field name =&amp;gt; template field nam, from the page you&amp;#039;re going to create&lt;br /&gt;
$form_fields = array(&lt;br /&gt;
    &amp;#039;fullname&amp;#039;              =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;text&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;email&amp;#039;                 =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;email&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;message&amp;#039;               =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;textarea&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; &amp;#039;&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true),&lt;br /&gt;
    &amp;#039;newsletter_subscribe&amp;#039;  =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;checkbox&amp;#039;, &amp;#039;value&amp;#039; =&amp;gt; 0, &amp;#039;required&amp;#039; =&amp;gt; false),&lt;br /&gt;
    &amp;#039;images&amp;#039;                =&amp;gt; array(&amp;#039;type&amp;#039; =&amp;gt; &amp;#039;file&amp;#039;, &amp;#039;required&amp;#039; =&amp;gt; true)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// --- WireUpload settings ---&lt;br /&gt;
$upload_path        = $config-&amp;gt;paths-&amp;gt;assets . &amp;quot;files/.tmp_uploads/&amp;quot;; // tmp upload folder&lt;br /&gt;
$file_extensions    = array(&amp;#039;jpg&amp;#039;, &amp;#039;jpeg&amp;#039;, &amp;#039;gif&amp;#039;, &amp;#039;png&amp;#039;);&lt;br /&gt;
$max_files          = 3;&lt;br /&gt;
$max_upload_size    = 1*1024*1024; // make sure PHP&amp;#039;s upload and post max size is also set to a reasonable size&lt;br /&gt;
$overwrite          = false;&lt;br /&gt;
&lt;br /&gt;
// --- Page creation settings ---&lt;br /&gt;
$template           = &amp;quot;upload-entry&amp;quot;; // the template used to create the page&lt;br /&gt;
$parent             = $pages-&amp;gt;get(&amp;quot;/uploads/&amp;quot;);&lt;br /&gt;
$file_field         = &amp;quot;images&amp;quot;;&lt;br /&gt;
$page_fields        = array(&amp;#039;fullname&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;message&amp;#039;,&amp;#039;newsletter_subscribe&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
// $page_fields = define the fields (except file) you want to save value to a page&lt;br /&gt;
// this is for the form process to populate page fields.&lt;br /&gt;
// Your page template must have the same field names existent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// ------------------------------ FORM Processing ---------------------------------------&lt;br /&gt;
&lt;br /&gt;
include(&amp;quot;./form-process.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ========================= FORM HTML markup  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Some vars used on the form markup for error and population of fields&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[fieldname]; to get errors&lt;br /&gt;
 * $form_fields[fieldname][&amp;#039;value&amp;#039;];&lt;br /&gt;
 *&lt;br /&gt;
 * Some helper function to get error markup&lt;br /&gt;
 * echo showError(string);&lt;br /&gt;
 *&lt;br /&gt;
 * Prevent CSRF attacks by adding hidden field with name and value&lt;br /&gt;
 * you an get by using $session-&amp;gt;CSRF&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenName();&lt;br /&gt;
 * $session-&amp;gt;CSRF-&amp;gt;getTokenValue();&lt;br /&gt;
 *&lt;br /&gt;
 * $errors[&amp;#039;csrf&amp;#039;]; used to check for CSRF error&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;h2&amp;gt;Upload Images to Page Example Form&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php if(!$success) : ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;?php if(!empty($errors)) echo showError(&amp;quot;Form contains errors&amp;quot;); ?&amp;gt;&lt;br /&gt;
    &amp;lt;?php if(!empty($errors[&amp;#039;csrf&amp;#039;])) echo showError($errors[&amp;#039;csrf&amp;#039;]); ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;form name=&amp;quot;myform&amp;quot; class=&amp;quot;myform&amp;quot; id=&amp;quot;myform&amp;quot; method=&amp;quot;post&amp;quot; action=&amp;quot;./&amp;quot; enctype=&amp;quot;multipart/form-data&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenName(); ?&amp;gt;&amp;quot; value=&amp;quot;&amp;lt;?php echo $session-&amp;gt;CSRF-&amp;gt;getTokenValue(); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;fullname&amp;quot;&amp;gt;Name* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fullname&amp;quot; id=&amp;quot;fullname&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;fullname&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;fullname&amp;#039;])) echo showError($errors[&amp;#039;fullname&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;email&amp;quot;&amp;gt;Email* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; id=&amp;quot;email&amp;quot; value=&amp;quot;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;email&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;email&amp;#039;])) echo showError($errors[&amp;#039;email&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;message&amp;quot;&amp;gt;Message* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;textarea type=&amp;quot;text&amp;quot; name=&amp;quot;message&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;?php echo $sanitizer-&amp;gt;entities($form_fields[&amp;#039;message&amp;#039;][&amp;#039;value&amp;#039;]); ?&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;message&amp;#039;])) echo showError($errors[&amp;#039;message&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;newsletter_subscribe&amp;quot;&amp;gt;Newsletter* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;newsletter_subscribe&amp;quot; id=&amp;quot;newsletter_subscribe&amp;quot;&lt;br /&gt;
                &amp;lt;?php echo $form_fields[&amp;#039;newsletter_subscribe&amp;#039;][&amp;#039;value&amp;#039;] ? &amp;quot;checked=&amp;#039;checked&amp;#039;&amp;quot; : &amp;quot;&amp;quot; ; ?&amp;gt;&lt;br /&gt;
            /&amp;gt;&lt;br /&gt;
            &amp;lt;?php if(isset($errors[&amp;#039;newsletter_subscribe&amp;#039;])) echo showError($errors[&amp;#039;newsletter_subscribe&amp;#039;]); ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row &amp;lt;?php if(isset($errors[&amp;#039;images&amp;#039;])) echo &amp;quot;error&amp;quot;;?&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;label for=&amp;quot;images&amp;quot;&amp;gt;Images* &amp;lt;/label&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;images[]&amp;quot; id=&amp;quot;images&amp;quot; multiple=&amp;quot;multiple&amp;quot; size=&amp;quot;40&amp;quot; accept=&amp;quot;image/jpg,image/jpeg,image/gif,image/png&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;?php&lt;br /&gt;
            // show upload errors&lt;br /&gt;
            if(isset($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                // if multiple errors&lt;br /&gt;
                if(is_array($errors[&amp;#039;images&amp;#039;])){&lt;br /&gt;
                    foreach($errors[&amp;#039;images&amp;#039;] as $e){&lt;br /&gt;
                        echo showError($e);&lt;br /&gt;
                    }&lt;br /&gt;
                } else { // if single error&lt;br /&gt;
                    echo showError($errors[&amp;#039;images&amp;#039;]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            ?&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;action&amp;quot; id=&amp;quot;action&amp;quot; value=&amp;quot;send&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;submit&amp;quot; id=&amp;quot;submit&amp;quot; value=&amp;quot;Submit&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php else: ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;?php echo $success_message; ?&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php endif; ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
form.js (jQuery)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ========================= FORM jQuery Script  ================================== --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function(){&lt;br /&gt;
        // Avoid double posts by disabling submit button on form submit&lt;br /&gt;
        $(&amp;#039;#myform&amp;#039;).submit(function(){&lt;br /&gt;
            $(&amp;quot;#submit&amp;quot;).attr(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
            return true;&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.208.103.149</name></author>
	</entry>
</feed>