<?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=84.157.18.5</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=84.157.18.5"/>
	<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Spezial:Beitr%C3%A4ge/84.157.18.5"/>
	<updated>2026-05-07T04:05:43Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_AJAX&amp;diff=24796</id>
		<title>JQuery - AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_AJAX&amp;diff=24796"/>
		<updated>2020-09-19T12:52:31Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.5: /* Kommunikation mit dem Server über AJAX und jQuery */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wie funktioniert AJAX ? ==&lt;br /&gt;
&lt;br /&gt;
Früher mußte man bei jeder Anfrage die Webseite komplett neu laden. Auch wenn nur ein kleiner Teil neu benötigt wird (z.B. ein Suchergebnis). Mit AJAX kann man Teile einer Website neu laden. Das funktioniert über ein JavaScript Objekt den sogenannten &amp;#039;&amp;#039;&amp;#039;XML-HTTP Request&amp;#039;&amp;#039;&amp;#039; oder kurz &amp;#039;&amp;#039;&amp;#039;XHR&amp;#039;&amp;#039;&amp;#039;. Dieser kommuniziert quasi am Browser vorbei mit dem Server. &lt;br /&gt;
&lt;br /&gt;
Die alte Kommunikationsart ist Synchron: Eine Anfrage - eine Webseite. Die neue Art ist asynchron. Alle Eigenschaften zusammengefaßt spricht man von &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;synchronous &amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039;avaScript &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;nd &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039;ML - AJAX&lt;br /&gt;
&lt;br /&gt;
Übertragen wird immer Klartext, allerdings selten XML-Daten. Heute nutzt man eher HTML-Fragmente oder JSON Daten.&lt;br /&gt;
&lt;br /&gt;
==jQuery und AJAX==&lt;br /&gt;
jQuery bietet eine gute AJAX Unterstützung, und macht es dem Programmierer leicht mit den Besonderheiten der verschiedenen Browser umzugehen. &lt;br /&gt;
&lt;br /&gt;
== Datenanforderung mit jQuery und AJAX ==&lt;br /&gt;
Daten werden vom Server immer im Klartext geliefert und über das http Protokoll übertragen.&lt;br /&gt;
=== Textdatei anfordern ===&lt;br /&gt;
ajax1.html&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
        $.get(&amp;quot;ajax.txt&amp;quot;, function(data){&lt;br /&gt;
          $(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
      $(&amp;quot;button:eq(1)&amp;quot;).click(function(){&lt;br /&gt;
        $.post(&amp;quot;ajax.txt&amp;quot;, function(data){&lt;br /&gt;
          $(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
        });			 &lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;AJAX-Anfrage mit $.get()&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;AJAX-Anfrage mit $.post()&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ajax.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es gibt zwei Sachen, denen ich mir völlig sicher bin. Erstens: Männer sind viel schlauer als Frauen! Und zweitens? Die Erde ist flach. Genau.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung:&lt;br /&gt;
&lt;br /&gt;
Die 2 Buttons bekommen eine Klickfunktion zugewiesen. &lt;br /&gt;
Button 1 führt einen AJAX Request über GET aus. Button 2 über Post ($.get() bzw. $.post()). Als Parameter enthält die Funktion die Datei und eine weitere Funktion (oder Referenz auf eine Funktion). Diese neue Funktion bekommt als Parameter die erhaltenen Daten und schreibt sie in das div mit der id #ausgabe.&lt;br /&gt;
&lt;br /&gt;
=== HTML Anfordern ===&lt;br /&gt;
Enthält die Antwort HTML Daten sollte der Browser sie auch so interpretieren. Dazu kann man jQuery direkt mitteilen, dass es sich um HTML Daten handelt. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//$(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
$(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kommunikation mit dem Server über AJAX und jQuery ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.html&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;
      src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.get(&amp;quot;login_get.php&amp;quot;,  &lt;br /&gt;
            { &lt;br /&gt;
              username: $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
              password: $(&amp;quot;input:last&amp;quot;).val() &lt;br /&gt;
            }, &lt;br /&gt;
            function(data){&lt;br /&gt;
             $(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
            }&lt;br /&gt;
          );&lt;br /&gt;
        });&lt;br /&gt;
        $(&amp;quot;button:last&amp;quot;).click(function(){&lt;br /&gt;
          $.post(&amp;quot;login_post.php&amp;quot;,  &lt;br /&gt;
            { &lt;br /&gt;
              username: $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
              password: $(&amp;quot;input:last&amp;quot;).val() &lt;br /&gt;
            }, &lt;br /&gt;
            function(data){&lt;br /&gt;
             $(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
            }&lt;br /&gt;
          );&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Bitte Benutzername und Passwort eingeben&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;f1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;table width=&amp;quot;200&amp;quot; border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; size=&amp;quot;30&amp;quot;&amp;gt;&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;Passwort&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;password&amp;quot; size=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;AJAX-Login mit $.get()&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;AJAX-Login mit $.post()&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aufruf erfolgt fast gleich. Nur werden in diesem Fall 3 Parameter übergeben. &lt;br /&gt;
1. Der Name des Skriptes. 2. Die Daten die übermittelt werden. 3. Eine (anonyme) Funktion die die Antwort des Servers verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Interessant ist also Parameter2. Hier wird einfach wie in jQuery an vielen Stellen üblich mit einem Optionen-Objekt gearbeitet. Dieses enthält die Deklarationen der Übergabewerte in der Form&lt;br /&gt;
&lt;br /&gt;
 bezeichner : wert&lt;br /&gt;
&lt;br /&gt;
ln diesem Fall ist der Wert die Eingabe der HTML Input Felder (hier das erste Input der Seite).&lt;br /&gt;
&lt;br /&gt;
 username : $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;login_get.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$host = &amp;quot;localhost&amp;quot;; // Der MySQL-Server&lt;br /&gt;
$user = &amp;quot;root&amp;quot;;// Der Datenbank Benutzername&lt;br /&gt;
$password = &amp;quot;&amp;quot;; // Das Passwort für die Datenbank&lt;br /&gt;
$dbname = &amp;quot;jquery&amp;quot;; // Der Name der Datenbank&lt;br /&gt;
$tabelle =&amp;quot;logindaten&amp;quot;; // Der Name der Tabelle&lt;br /&gt;
$loginrichtig =false;&lt;br /&gt;
$dbverbindung = mysql_connect ($host, $user, $password);&lt;br /&gt;
$dbanfrage = &amp;quot;SELECT * from $tabelle&amp;quot;;&lt;br /&gt;
$result = mysql_db_query ($dbname, $dbanfrage, $dbverbindung);&lt;br /&gt;
while ($ausgabe = mysql_fetch_array ($result)) {&lt;br /&gt;
if (($ausgabe[&amp;#039;username&amp;#039;] == $_GET[&amp;#039;username&amp;#039;]) &amp;amp;&amp;amp; ($ausgabe[&amp;#039;password&amp;#039;] == $_GET[&amp;#039;password&amp;#039;]) )&lt;br /&gt;
   {$loginrichtig=true; &lt;br /&gt;
	 break;&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
if($loginrichtig) {&lt;br /&gt;
  echo &amp;quot;Login erfolgreich&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  echo &amp;quot;Leider war ihr Login nicht erfolgreich, bitte &amp;amp;uuml;berpr&amp;amp;uuml;fen sie ihre Eingaben.&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mysql_close ($dbverbindung);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf Seite des PHP-Skriptes kommen die Daten als GET oder POST Variablen an (Hier GET). &lt;br /&gt;
&lt;br /&gt;
Als Antwort erwartet AJAX ja Klartext. Das bedeutet wir können einfach eine ganz normale Ausgabe über Echo machen. Möchten wir Daten zurückgeben muß das ebenfalls über Klartext funktionieren. Dazu können wir dann z.B. JSON oder XML nehmen. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kommunikation über JSON ==&lt;br /&gt;
Eine gute Methode Strukturierte Daten (Objekte, Arrays, etc.) zu übertragen ist JSON. JSON ist eine Methode strukturierte Daten als platzsparenden String zu speichern, der trotzdem für den Menschen lesbar bleibt, aber auch vom Rechner leicht verarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== JSON - Daten ===&lt;br /&gt;
So sieht es aus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.json&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;Stephan Schlegel&amp;quot;, &lt;br /&gt;
  &amp;quot;beruf&amp;quot; : &amp;quot;Dipl Ing audiovisuelle Medien&amp;quot;,&lt;br /&gt;
  &amp;quot;ort&amp;quot; : &amp;quot;Nürtingen&amp;quot;,&lt;br /&gt;
  &amp;quot;webseiten&amp;quot; :	 { &lt;br /&gt;
    &amp;quot;url1&amp;quot; : &amp;quot;www.geo-bit.de&amp;quot;, &lt;br /&gt;
    &amp;quot;url2&amp;quot; : &amp;quot;www.3d-relief.com&amp;quot;, &lt;br /&gt;
    &amp;quot;url3&amp;quot; : &amp;quot;www.ko-rockband.de&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Prinzip ist es wieder ein Objekt indem es Bezeichner und Wertzuweisungen gibt. Im Fall Webseiten ist der Wert wiederum ein Objekt, bestehend aus Bezeichnern und Werten.&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten über jQuery lesen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;  src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.getJSON(&amp;quot;ajax.json&amp;quot;, function(data){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).append(data.name + &amp;quot;, &amp;quot; + data.webseiten.url1);&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;getJSON&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Daten werden über getJSON geladen:&lt;br /&gt;
 $.getJSON(&amp;quot;ajax.json&amp;quot;, function(data){ $(&amp;quot;#ausgabe&amp;quot;).append(data.name + &amp;quot;, &amp;quot; + data.webseiten.url1); });&lt;br /&gt;
 $.getJSON(&amp;quot;Datei&amp;quot;, meineFunktion(data));&lt;br /&gt;
&lt;br /&gt;
An die Funktion wird das Bezeichner-Objekt data übergeben und über dieses kann man auf die enthaltenen Daten zugreifen. Hier z.B. auf Name oder die erste URL.&lt;br /&gt;
&lt;br /&gt;
 data.name&lt;br /&gt;
 data.webseiten.url1&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; über die getJSON Funktion werden die Daten direkt in ein jQuery Objekt umgewandelt. Über get und post würde man einfach den Text bekommen. Man kann aber einen JSON String auch nachträglich umwandeln. Dafür gibt es die jQuery Funkion parseJSON(json).&lt;br /&gt;
&lt;br /&gt;
==== Beispiel Datensätze aus einem JSON Objekt verarbeiten mit each ====&lt;br /&gt;
&lt;br /&gt;
Beispiel einer Funktion aus dem 3d-relief map-editor. Im Beispiel wird ein Dropdown-Feld erzeugt, in dem sich alle Produkte auswählen lassen. Zusätzlich wird ein Click Handler registriert. Der bei Klick wiederum eine JS Funktion &amp;quot;loadMap&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
$.getJSON(&amp;quot;dataHandler.php&amp;quot;,{action:&amp;quot;loadMaps&amp;quot;},function(data){&lt;br /&gt;
	//mapData = data;&lt;br /&gt;
	createMapSelector(data);&lt;br /&gt;
});&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übergeben wird das Data Objekt an diese Funktion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function createMapSelector(data){&lt;br /&gt;
	$(&amp;quot;#map_selector_wrap&amp;quot;).html(&amp;#039;&amp;lt;div&amp;gt;&amp;lt;h3&amp;gt;Select Relief Map&amp;lt;/h3&amp;gt;&amp;lt;select id=&amp;quot;map_selector&amp;quot; name=&amp;quot;map_selector&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
	$(&amp;quot;#map_selector&amp;quot;).append(&amp;#039;&amp;lt;option value=&amp;quot;na&amp;quot;&amp;gt;Select product to view details&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
	$.each(data,function(key,obj){&lt;br /&gt;
		if(obj.products_name != null)&lt;br /&gt;
			$(&amp;quot;#map_selector&amp;quot;).append(&amp;#039;&amp;lt;option value=&amp;quot;&amp;#039; + obj.products_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039; + obj.products_name + &amp;#039;&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
	});&lt;br /&gt;
	$(&amp;quot;#map_selector_wrap&amp;quot;).append(&amp;#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
	// click handler for selector&lt;br /&gt;
	$(&amp;quot;#map_selector&amp;quot;).change(function(){&lt;br /&gt;
  		actID=$(&amp;quot;#map_selector option:selected&amp;quot;).val()&lt;br /&gt;
  		if(actID != &amp;quot;na&amp;quot;)&lt;br /&gt;
  			loadMap(actID);&lt;br /&gt;
  	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten Senden ===&lt;br /&gt;
Daten aus einem Formular kann man einfach z.B. an ein PHP Skript senden&lt;br /&gt;
&lt;br /&gt;
http://stackoverflow.com/questions/10955017/sending-json-to-php-using-ajax&lt;br /&gt;
&lt;br /&gt;
Für Typo3 Extensions evtl. stringify machen und als POST DAten schicken statt als JSON Objekt, damit die Daten valide sind.&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten von fremden Servern ===&lt;br /&gt;
Normalerweise holt JavaScript Daten nur vom gleichen Server, auf dem das Skript läuft. Dies kann man mit JSONP umgehen.&lt;br /&gt;
Das etwas umfangreichere Beispiel liest Twitterdaten über JSON und die Twitter API.&lt;br /&gt;
&lt;br /&gt;
[[jQuery und JSONP - Tweets von Twitter lesen]]&lt;br /&gt;
&lt;br /&gt;
siehe auch nächstes Beispiel &amp;quot;JavaScript&amp;quot; nachladen.&lt;br /&gt;
&lt;br /&gt;
=== JavaScript nachladen ===&lt;br /&gt;
Mit jQuery kann man JavaScripte nachladen. Die enthaltenen Statements werden automatisch ausgeführt, bzw. enthaltene Funktionen verfügbar gemacht.&lt;br /&gt;
So kann man sehr schön seine Funktionen auf mehrere Bibliotheken aufteilen und bei Bedarf laden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$.getScript(&amp;quot;ajax/test.js&amp;quot;, function(data, textStatus, jqxhr) {&lt;br /&gt;
   console.log(data); //data returned&lt;br /&gt;
   console.log(textStatus); //success&lt;br /&gt;
   console.log(jqxhr.status); //200&lt;br /&gt;
   console.log(&amp;#039;Load was performed.&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.html&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;
      src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.getScript(&amp;quot;zufall.js&amp;quot;, function(){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).text(zufallsZahl());&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
        $(&amp;quot;button:last&amp;quot;).click(function(){&lt;br /&gt;
          $.getScript(&amp;quot;http://mydomain.de/jquery/zufall.js&amp;quot;, function(){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).text(zufallsZahl());&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;Lade Skript von gleicher Domain&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;Lade Skript von fremder Domain&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;zufall.js&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function zufallsZahl(){&lt;br /&gt;
  return Math.random();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AJAX Probleme lösen ==&lt;br /&gt;
=== IE schickt Daten nicht ab ===&lt;br /&gt;
Im IE gibt es ab und zu Probleme mit dem Cache. Es gibt einige Lösungsansätze.&lt;br /&gt;
&lt;br /&gt;
==== Lösung bei Wetzel Auto Erfalssung ====&lt;br /&gt;
Von $.get auf $.ajax umgestellt und cache deaktiviert. Hat noch nicht funktioniert. Erst die Umstellung auf post hat geklappt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		// Replace Get because of IE Bug&lt;br /&gt;
		$.ajax({&lt;br /&gt;
  			url: &amp;quot;ajax.php&amp;quot;,&lt;br /&gt;
  			cache: false,&lt;br /&gt;
  			data: {&lt;br /&gt;
				&amp;#039;output&amp;#039;: str,&lt;br /&gt;
	  			&amp;#039;action&amp;#039;: &amp;quot;save&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
        	datatype: &amp;quot;json&amp;quot;,&lt;br /&gt;
        	type: &amp;quot;POST&amp;quot;&lt;br /&gt;
		}).done(function(data) {&lt;br /&gt;
			if(data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
				showMessage(&amp;quot;Fahrzeug wurde gespeichert&amp;quot;);&lt;br /&gt;
				getItems();&lt;br /&gt;
			}&lt;br /&gt;
			if(!data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
				showMessage(&amp;quot;Fehler - Fahrzeug wurde NICHT gespeichert&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
/*		&lt;br /&gt;
		$.get(&lt;br /&gt;
			&amp;#039;ajax.php&amp;#039;,{&lt;br /&gt;
				&amp;#039;output&amp;#039;: str,&lt;br /&gt;
	   			&amp;#039;action&amp;#039;: &amp;quot;save&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		).done(function(data){&lt;br /&gt;
				if(data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
					showMessage(&amp;quot;Fahrzeug wurde gespeichert&amp;quot;);&lt;br /&gt;
					getItems();&lt;br /&gt;
				}&lt;br /&gt;
				if(!data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
					showMessage(&amp;quot;Fehler - Fahrzeug wurde NICHT gespeichert&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
		});&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Weitere Tipps ====&lt;br /&gt;
http://stackoverflow.com/questions/4303829/how-to-prevent-jquery-ajax-caching-in-internet-explorer&lt;br /&gt;
&lt;br /&gt;
Das ist ein Nachbau von dem was der cache:false Parameter von jQuery tut. Er hängt einen uniq_param an, damit sich die URL ständig ändert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
    url : &amp;quot;my_url&amp;quot;,&lt;br /&gt;
    data : {&lt;br /&gt;
        &amp;#039;uniq_param&amp;#039; : (new Date()).getTime(),&lt;br /&gt;
        //other data&lt;br /&gt;
    }});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.5</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=JQuery_-_AJAX&amp;diff=24795</id>
		<title>JQuery - AJAX</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=JQuery_-_AJAX&amp;diff=24795"/>
		<updated>2020-09-19T12:51:36Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.5: /* Kommunikation mit dem Server über AJAX und jQuery */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Wie funktioniert AJAX ? ==&lt;br /&gt;
&lt;br /&gt;
Früher mußte man bei jeder Anfrage die Webseite komplett neu laden. Auch wenn nur ein kleiner Teil neu benötigt wird (z.B. ein Suchergebnis). Mit AJAX kann man Teile einer Website neu laden. Das funktioniert über ein JavaScript Objekt den sogenannten &amp;#039;&amp;#039;&amp;#039;XML-HTTP Request&amp;#039;&amp;#039;&amp;#039; oder kurz &amp;#039;&amp;#039;&amp;#039;XHR&amp;#039;&amp;#039;&amp;#039;. Dieser kommuniziert quasi am Browser vorbei mit dem Server. &lt;br /&gt;
&lt;br /&gt;
Die alte Kommunikationsart ist Synchron: Eine Anfrage - eine Webseite. Die neue Art ist asynchron. Alle Eigenschaften zusammengefaßt spricht man von &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;synchronous &amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039;avaScript &amp;#039;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;#039;nd &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039;ML - AJAX&lt;br /&gt;
&lt;br /&gt;
Übertragen wird immer Klartext, allerdings selten XML-Daten. Heute nutzt man eher HTML-Fragmente oder JSON Daten.&lt;br /&gt;
&lt;br /&gt;
==jQuery und AJAX==&lt;br /&gt;
jQuery bietet eine gute AJAX Unterstützung, und macht es dem Programmierer leicht mit den Besonderheiten der verschiedenen Browser umzugehen. &lt;br /&gt;
&lt;br /&gt;
== Datenanforderung mit jQuery und AJAX ==&lt;br /&gt;
Daten werden vom Server immer im Klartext geliefert und über das http Protokoll übertragen.&lt;br /&gt;
=== Textdatei anfordern ===&lt;br /&gt;
ajax1.html&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
    $(document).ready(function(){&lt;br /&gt;
      $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
        $.get(&amp;quot;ajax.txt&amp;quot;, function(data){&lt;br /&gt;
          $(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
      $(&amp;quot;button:eq(1)&amp;quot;).click(function(){&lt;br /&gt;
        $.post(&amp;quot;ajax.txt&amp;quot;, function(data){&lt;br /&gt;
          $(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
        });			 &lt;br /&gt;
      });&lt;br /&gt;
    });&lt;br /&gt;
  &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;AJAX-Anfrage mit $.get()&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;AJAX-Anfrage mit $.post()&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ajax.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Es gibt zwei Sachen, denen ich mir völlig sicher bin. Erstens: Männer sind viel schlauer als Frauen! Und zweitens? Die Erde ist flach. Genau.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Erklärung:&lt;br /&gt;
&lt;br /&gt;
Die 2 Buttons bekommen eine Klickfunktion zugewiesen. &lt;br /&gt;
Button 1 führt einen AJAX Request über GET aus. Button 2 über Post ($.get() bzw. $.post()). Als Parameter enthält die Funktion die Datei und eine weitere Funktion (oder Referenz auf eine Funktion). Diese neue Funktion bekommt als Parameter die erhaltenen Daten und schreibt sie in das div mit der id #ausgabe.&lt;br /&gt;
&lt;br /&gt;
=== HTML Anfordern ===&lt;br /&gt;
Enthält die Antwort HTML Daten sollte der Browser sie auch so interpretieren. Dazu kann man jQuery direkt mitteilen, dass es sich um HTML Daten handelt. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//$(&amp;quot;#ausgabe&amp;quot;).text(data);&lt;br /&gt;
$(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kommunikation mit dem Server über AJAX und jQuery ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.html&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html5&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;
      src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.get(&amp;quot;login_get.php&amp;quot;,  &lt;br /&gt;
            { &lt;br /&gt;
              username: $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
              password: $(&amp;quot;input:last&amp;quot;).val() &lt;br /&gt;
            }, &lt;br /&gt;
            function(data){&lt;br /&gt;
             $(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
            }&lt;br /&gt;
          );&lt;br /&gt;
        });&lt;br /&gt;
        $(&amp;quot;button:last&amp;quot;).click(function(){&lt;br /&gt;
          $.post(&amp;quot;login_post.php&amp;quot;,  &lt;br /&gt;
            { &lt;br /&gt;
              username: $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
              password: $(&amp;quot;input:last&amp;quot;).val() &lt;br /&gt;
            }, &lt;br /&gt;
            function(data){&lt;br /&gt;
             $(&amp;quot;#ausgabe&amp;quot;).html(data);&lt;br /&gt;
            }&lt;br /&gt;
          );&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;Bitte Benutzername und Passwort eingeben&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;form name=&amp;quot;f1&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;table width=&amp;quot;200&amp;quot; border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; size=&amp;quot;30&amp;quot;&amp;gt;&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;Passwort&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;password&amp;quot; size=&amp;quot;30&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
      &amp;lt;/table&amp;gt;&lt;br /&gt;
    &amp;lt;/form&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;AJAX-Login mit $.get()&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;AJAX-Login mit $.post()&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Aufruf erfolgt fast gleich. Nur werden in diesem Fall 3 Parameter übergeben. &lt;br /&gt;
1. Der Name des Skriptes. 2. Die Daten die übermittelt werden. 3. Eine (anonyme) Funktion die die Antwort des Servers verarbeitet.&lt;br /&gt;
&lt;br /&gt;
Interessant ist also Parameter2. Hier wird einfach wie in jQuery an vielen Stellen üblich mit einem Optionen-Objekt gearbeitet. Dieses enthält die Deklarationen der Übergabewerte in der Form&lt;br /&gt;
&lt;br /&gt;
 bezeichner : wert&lt;br /&gt;
&lt;br /&gt;
ln diesem Fall ist der Wert die Eingabe der HTML Input Felder (hier das erste Input der Seite).&lt;br /&gt;
&lt;br /&gt;
 username : $(&amp;quot;input:first&amp;quot;).val(), &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;login_get.php&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$host = &amp;quot;localhost&amp;quot;; // Der MySQL-Server&lt;br /&gt;
$user = &amp;quot;root&amp;quot;;// Der Datenbank Benutzername&lt;br /&gt;
$password = &amp;quot;&amp;quot;; // Das Passwort für die Datenbank&lt;br /&gt;
$dbname = &amp;quot;jquery&amp;quot;; // Der Name der Datenbank&lt;br /&gt;
$tabelle =&amp;quot;logindaten&amp;quot;; // Der Name der Tabelle&lt;br /&gt;
$loginrichtig =false;&lt;br /&gt;
$dbverbindung = mysql_connect ($host, $user, $password);&lt;br /&gt;
$dbanfrage = &amp;quot;SELECT * from $tabelle&amp;quot;;&lt;br /&gt;
$result = mysql_db_query ($dbname, $dbanfrage, $dbverbindung);&lt;br /&gt;
while ($ausgabe = mysql_fetch_array ($result)) {&lt;br /&gt;
if (($ausgabe[&amp;#039;username&amp;#039;] == $_GET[&amp;#039;username&amp;#039;]) &amp;amp;&amp;amp; ($ausgabe[&amp;#039;password&amp;#039;] == $_GET[&amp;#039;password&amp;#039;]) )&lt;br /&gt;
   {$loginrichtig=true; &lt;br /&gt;
	 break;&lt;br /&gt;
    }&lt;br /&gt;
} &lt;br /&gt;
if($loginrichtig) {&lt;br /&gt;
  echo &amp;quot;Login erfolgreich&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  echo &amp;quot;Leider war ihr Login nicht erfolgreich, bitte &amp;amp;uuml;berpr&amp;amp;uuml;fen sie ihre Eingaben.&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mysql_close ($dbverbindung);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf Seite des PHP-Skriptes kommen die Daten als GET oder POST Variablen an (Hier GET). &lt;br /&gt;
&lt;br /&gt;
Als Antwort erwartet AJAX ja Klartext. Das bedeutet wir können einfach eine ganz normale Ausgabe über Echo machen. Möchten wir Daten zurückgeben muß das ebenfalls über Klartext funktionieren. Dazu können wir dann z.B. JSON oder XML nehmen. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kommunikation über JSON ==&lt;br /&gt;
Eine gute Methode Strukturierte Daten (Objekte, Arrays, etc.) zu übertragen ist JSON. JSON ist eine Methode strukturierte Daten als platzsparenden String zu speichern, der trotzdem für den Menschen lesbar bleibt, aber auch vom Rechner leicht verarbeitet werden kann.&lt;br /&gt;
&lt;br /&gt;
=== JSON - Daten ===&lt;br /&gt;
So sieht es aus.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.json&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{ &lt;br /&gt;
  &amp;quot;name&amp;quot; : &amp;quot;Stephan Schlegel&amp;quot;, &lt;br /&gt;
  &amp;quot;beruf&amp;quot; : &amp;quot;Dipl Ing audiovisuelle Medien&amp;quot;,&lt;br /&gt;
  &amp;quot;ort&amp;quot; : &amp;quot;Nürtingen&amp;quot;,&lt;br /&gt;
  &amp;quot;webseiten&amp;quot; :	 { &lt;br /&gt;
    &amp;quot;url1&amp;quot; : &amp;quot;www.geo-bit.de&amp;quot;, &lt;br /&gt;
    &amp;quot;url2&amp;quot; : &amp;quot;www.3d-relief.com&amp;quot;, &lt;br /&gt;
    &amp;quot;url3&amp;quot; : &amp;quot;www.ko-rockband.de&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Prinzip ist es wieder ein Objekt indem es Bezeichner und Wertzuweisungen gibt. Im Fall Webseiten ist der Wert wiederum ein Objekt, bestehend aus Bezeichnern und Werten.&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten über jQuery lesen ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;  src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.getJSON(&amp;quot;ajax.json&amp;quot;, function(data){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).append(data.name + &amp;quot;, &amp;quot; + data.webseiten.url1);&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;button&amp;gt;getJSON&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Daten werden über getJSON geladen:&lt;br /&gt;
 $.getJSON(&amp;quot;ajax.json&amp;quot;, function(data){ $(&amp;quot;#ausgabe&amp;quot;).append(data.name + &amp;quot;, &amp;quot; + data.webseiten.url1); });&lt;br /&gt;
 $.getJSON(&amp;quot;Datei&amp;quot;, meineFunktion(data));&lt;br /&gt;
&lt;br /&gt;
An die Funktion wird das Bezeichner-Objekt data übergeben und über dieses kann man auf die enthaltenen Daten zugreifen. Hier z.B. auf Name oder die erste URL.&lt;br /&gt;
&lt;br /&gt;
 data.name&lt;br /&gt;
 data.webseiten.url1&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Hinweis:&amp;#039;&amp;#039;&amp;#039; über die getJSON Funktion werden die Daten direkt in ein jQuery Objekt umgewandelt. Über get und post würde man einfach den Text bekommen. Man kann aber einen JSON String auch nachträglich umwandeln. Dafür gibt es die jQuery Funkion parseJSON(json).&lt;br /&gt;
&lt;br /&gt;
==== Beispiel Datensätze aus einem JSON Objekt verarbeiten mit each ====&lt;br /&gt;
&lt;br /&gt;
Beispiel einer Funktion aus dem 3d-relief map-editor. Im Beispiel wird ein Dropdown-Feld erzeugt, in dem sich alle Produkte auswählen lassen. Zusätzlich wird ein Click Handler registriert. Der bei Klick wiederum eine JS Funktion &amp;quot;loadMap&amp;quot; ausführt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
$.getJSON(&amp;quot;dataHandler.php&amp;quot;,{action:&amp;quot;loadMaps&amp;quot;},function(data){&lt;br /&gt;
	//mapData = data;&lt;br /&gt;
	createMapSelector(data);&lt;br /&gt;
});&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Übergeben wird das Data Objekt an diese Funktion&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function createMapSelector(data){&lt;br /&gt;
	$(&amp;quot;#map_selector_wrap&amp;quot;).html(&amp;#039;&amp;lt;div&amp;gt;&amp;lt;h3&amp;gt;Select Relief Map&amp;lt;/h3&amp;gt;&amp;lt;select id=&amp;quot;map_selector&amp;quot; name=&amp;quot;map_selector&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
	$(&amp;quot;#map_selector&amp;quot;).append(&amp;#039;&amp;lt;option value=&amp;quot;na&amp;quot;&amp;gt;Select product to view details&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
	$.each(data,function(key,obj){&lt;br /&gt;
		if(obj.products_name != null)&lt;br /&gt;
			$(&amp;quot;#map_selector&amp;quot;).append(&amp;#039;&amp;lt;option value=&amp;quot;&amp;#039; + obj.products_id + &amp;#039;&amp;quot;&amp;gt;&amp;#039; + obj.products_name + &amp;#039;&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
	});&lt;br /&gt;
	$(&amp;quot;#map_selector_wrap&amp;quot;).append(&amp;#039;&amp;lt;/select&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
	// click handler for selector&lt;br /&gt;
	$(&amp;quot;#map_selector&amp;quot;).change(function(){&lt;br /&gt;
  		actID=$(&amp;quot;#map_selector option:selected&amp;quot;).val()&lt;br /&gt;
  		if(actID != &amp;quot;na&amp;quot;)&lt;br /&gt;
  			loadMap(actID);&lt;br /&gt;
  	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten Senden ===&lt;br /&gt;
Daten aus einem Formular kann man einfach z.B. an ein PHP Skript senden&lt;br /&gt;
&lt;br /&gt;
http://stackoverflow.com/questions/10955017/sending-json-to-php-using-ajax&lt;br /&gt;
&lt;br /&gt;
Für Typo3 Extensions evtl. stringify machen und als POST DAten schicken statt als JSON Objekt, damit die Daten valide sind.&lt;br /&gt;
&lt;br /&gt;
=== JSON Daten von fremden Servern ===&lt;br /&gt;
Normalerweise holt JavaScript Daten nur vom gleichen Server, auf dem das Skript läuft. Dies kann man mit JSONP umgehen.&lt;br /&gt;
Das etwas umfangreichere Beispiel liest Twitterdaten über JSON und die Twitter API.&lt;br /&gt;
&lt;br /&gt;
[[jQuery und JSONP - Tweets von Twitter lesen]]&lt;br /&gt;
&lt;br /&gt;
siehe auch nächstes Beispiel &amp;quot;JavaScript&amp;quot; nachladen.&lt;br /&gt;
&lt;br /&gt;
=== JavaScript nachladen ===&lt;br /&gt;
Mit jQuery kann man JavaScripte nachladen. Die enthaltenen Statements werden automatisch ausgeführt, bzw. enthaltene Funktionen verfügbar gemacht.&lt;br /&gt;
So kann man sehr schön seine Funktionen auf mehrere Bibliotheken aufteilen und bei Bedarf laden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$.getScript(&amp;quot;ajax/test.js&amp;quot;, function(data, textStatus, jqxhr) {&lt;br /&gt;
   console.log(data); //data returned&lt;br /&gt;
   console.log(textStatus); //success&lt;br /&gt;
   console.log(jqxhr.status); //200&lt;br /&gt;
   console.log(&amp;#039;Load was performed.&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ajax.html&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; &lt;br /&gt;
      src=&amp;quot;lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      $(document).ready(function(){&lt;br /&gt;
        $(&amp;quot;button:first&amp;quot;).click(function(){&lt;br /&gt;
          $.getScript(&amp;quot;zufall.js&amp;quot;, function(){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).text(zufallsZahl());&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
        $(&amp;quot;button:last&amp;quot;).click(function(){&lt;br /&gt;
          $.getScript(&amp;quot;http://mydomain.de/jquery/zufall.js&amp;quot;, function(){&lt;br /&gt;
            $(&amp;quot;#ausgabe&amp;quot;).text(zufallsZahl());&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;Lade Skript von gleicher Domain&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;button&amp;gt;Lade Skript von fremder Domain&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;div id=&amp;quot;ausgabe&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;zufall.js&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function zufallsZahl(){&lt;br /&gt;
  return Math.random();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AJAX Probleme lösen ==&lt;br /&gt;
=== IE schickt Daten nicht ab ===&lt;br /&gt;
Im IE gibt es ab und zu Probleme mit dem Cache. Es gibt einige Lösungsansätze.&lt;br /&gt;
&lt;br /&gt;
==== Lösung bei Wetzel Auto Erfalssung ====&lt;br /&gt;
Von $.get auf $.ajax umgestellt und cache deaktiviert. Hat noch nicht funktioniert. Erst die Umstellung auf post hat geklappt.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
		// Replace Get because of IE Bug&lt;br /&gt;
		$.ajax({&lt;br /&gt;
  			url: &amp;quot;ajax.php&amp;quot;,&lt;br /&gt;
  			cache: false,&lt;br /&gt;
  			data: {&lt;br /&gt;
				&amp;#039;output&amp;#039;: str,&lt;br /&gt;
	  			&amp;#039;action&amp;#039;: &amp;quot;save&amp;quot;&lt;br /&gt;
			},&lt;br /&gt;
        	datatype: &amp;quot;json&amp;quot;,&lt;br /&gt;
        	type: &amp;quot;POST&amp;quot;&lt;br /&gt;
		}).done(function(data) {&lt;br /&gt;
			if(data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
				showMessage(&amp;quot;Fahrzeug wurde gespeichert&amp;quot;);&lt;br /&gt;
				getItems();&lt;br /&gt;
			}&lt;br /&gt;
			if(!data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
				showMessage(&amp;quot;Fehler - Fahrzeug wurde NICHT gespeichert&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		&lt;br /&gt;
/*		&lt;br /&gt;
		$.get(&lt;br /&gt;
			&amp;#039;ajax.php&amp;#039;,{&lt;br /&gt;
				&amp;#039;output&amp;#039;: str,&lt;br /&gt;
	   			&amp;#039;action&amp;#039;: &amp;quot;save&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		).done(function(data){&lt;br /&gt;
				if(data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
					showMessage(&amp;quot;Fahrzeug wurde gespeichert&amp;quot;);&lt;br /&gt;
					getItems();&lt;br /&gt;
				}&lt;br /&gt;
				if(!data[&amp;quot;success&amp;quot;]){&lt;br /&gt;
					showMessage(&amp;quot;Fehler - Fahrzeug wurde NICHT gespeichert&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
		});&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Weitere Tipps ====&lt;br /&gt;
http://stackoverflow.com/questions/4303829/how-to-prevent-jquery-ajax-caching-in-internet-explorer&lt;br /&gt;
&lt;br /&gt;
Das ist ein Nachbau von dem was der cache:false Parameter von jQuery tut. Er hängt einen uniq_param an, damit sich die URL ständig ändert.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$.ajax({&lt;br /&gt;
    url : &amp;quot;my_url&amp;quot;,&lt;br /&gt;
    data : {&lt;br /&gt;
        &amp;#039;uniq_param&amp;#039; : (new Date()).getTime(),&lt;br /&gt;
        //other data&lt;br /&gt;
    }});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.5</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Wireframe_API&amp;diff=24794</id>
		<title>ProcessWire - Wireframe API</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=ProcessWire_-_Wireframe_API&amp;diff=24794"/>
		<updated>2020-09-19T05:32:01Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.5: Die Seite wurde neu angelegt: „ https://processwire.com/talk/topic/21893-wireframe/page/3/?tab=comments#comment-205320  http://wireframe-framework.com  == Snippets == === Beispiel von Bernha…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; https://processwire.com/talk/topic/21893-wireframe/page/3/?tab=comments#comment-205320&lt;br /&gt;
 http://wireframe-framework.com&lt;br /&gt;
&lt;br /&gt;
== Snippets ==&lt;br /&gt;
=== Beispiel von Bernhard Baumrock ===&lt;br /&gt;
Homepage View&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;
echo Wireframe::component(&amp;quot;Header&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Search&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Slider&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Welcome&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Visions&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;News&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Quotes&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Newsletter&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Partner&amp;quot;);&lt;br /&gt;
echo Wireframe::component(&amp;quot;Footer&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i.e. welcome component&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php namespace Wireframe\Component;&lt;br /&gt;
class Welcome extends \Wireframe\Component {&lt;br /&gt;
  public function __construct() {&lt;br /&gt;
    $this-&amp;gt;setBg();&lt;br /&gt;
    $this-&amp;gt;setEmblem();&lt;br /&gt;
  }&lt;br /&gt;
  private function setBg() {&lt;br /&gt;
    $this-&amp;gt;bg = null;&lt;br /&gt;
    try {&lt;br /&gt;
      $item = $this-&amp;gt;wire-&amp;gt;gg-&amp;gt;home()-&amp;gt;get(HomePage::field_slider)-&amp;gt;first();&lt;br /&gt;
      $img = $item-&amp;gt;get(Slideritem::field_img);&lt;br /&gt;
      $this-&amp;gt;bg = $item-&amp;gt;imgUrl($img);&lt;br /&gt;
    } catch (\Throwable $th) {&lt;br /&gt;
      $this-&amp;gt;log($th-&amp;gt;getMessage());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  private function setEmblem() {&lt;br /&gt;
    $this-&amp;gt;emblem = null;&lt;br /&gt;
    $img = $this-&amp;gt;wire-&amp;gt;gg-&amp;gt;settings()-&amp;gt;get(HomePage::field_emblem_white);&lt;br /&gt;
    if(!$img) return;&lt;br /&gt;
    $this-&amp;gt;emblem = &amp;quot;&amp;lt;img class=&amp;#039;tm-emblem uk-margin-large-left&amp;#039; src=&amp;#039;{$img-&amp;gt;maxHeight(100)-&amp;gt;url}&amp;#039; uk-svg&amp;gt;&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>84.157.18.5</name></author>
	</entry>
	<entry>
		<id>https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=24793</id>
		<title>Processwire - Themes / Templates</title>
		<link rel="alternate" type="text/html" href="https://wiki.stephanschlegel.de/index.php?title=Processwire_-_Themes_/_Templates&amp;diff=24793"/>
		<updated>2020-09-19T05:28:39Z</updated>

		<summary type="html">&lt;p&gt;84.157.18.5: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
Siehe auch &lt;br /&gt;
* [[Processwire - Templates Grundausstattung]] (Best Practice)&lt;br /&gt;
* [[ProcessWire - Field Rendering]]&lt;br /&gt;
* [[ProcessWire - Skeleton Template]]&lt;br /&gt;
* [[Processwire - Template from Scratch]]&lt;br /&gt;
* https://processwire.com/blog/posts/pw-3.0.141/#processwire-system-urls-paths-now-more-customizable (Interessant für vo Backend wählbare Themes)&lt;br /&gt;
&lt;br /&gt;
== Template Strategien - Output Strategies ==&lt;br /&gt;
 https://processwire.com/docs/tutorials/how-to-structure-your-template-files/&lt;br /&gt;
 https://processwire.com/talk/topic/21893-wireframe/page/3/?tab=comments#comment-205320&lt;br /&gt;
 http://wireframe-framework.com&lt;br /&gt;
&lt;br /&gt;
Es gibt in ProcessWire im Wesentlichen mehrere grundlegende Strategien um HTML Inhalte auszugeben:&lt;br /&gt;
* Direct Output&lt;br /&gt;
* Delayed Output&lt;br /&gt;
* Markup Regions ([[ProcessWire - Markup Regions]])&lt;br /&gt;
Außerdem gibt es für MVC basierte Ansätze das Wireframe Framework. Über die Wireframe API lassen sich z.B. gut Komponentenbasierte Webseiten, JSON Endpoints... realisieren.&lt;br /&gt;
&lt;br /&gt;
=== Direct Output ===&lt;br /&gt;
Die Inhalte im Template werden direkt als Markup ausgegeben.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;h1&amp;gt;&amp;lt;?php echo $page-&amp;gt;title; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
    &amp;lt;?php echo $page-&amp;gt;body; ?&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Direct Output mit Includes ====&lt;br /&gt;
Teile die man oft benötigt kann man in andere Dateien verlagern. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
include(&amp;quot;./head.inc&amp;quot;);&lt;br /&gt;
echo $page-&amp;gt;body;&lt;br /&gt;
include(&amp;quot;./foot.inc&amp;quot;); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Direct Output mit automatic inclusion ====&lt;br /&gt;
==== Automatic Inclusion ====&lt;br /&gt;
Über die ProcessWire Konfiguration prependTemplateFile und appendTemplateFile kann man automatisch bestimmte Templates einbinden .&lt;br /&gt;
In der config.php definiert man:&lt;br /&gt;
 $config-&amp;gt;prependTemplateFile = &amp;#039;head.inc&amp;#039;;&lt;br /&gt;
 $config-&amp;gt;appendTemplateFile = &amp;#039;foot.inc&amp;#039;;&lt;br /&gt;
Dann kann man im Template einfach schreiben:&lt;br /&gt;
 echo $page-&amp;gt;body;&lt;br /&gt;
head.inc und foot.inc werden automatisch hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
=== Delayed Output ===&lt;br /&gt;
Mit Delayed Output meint man, dass beim Rendering Teile des Inhalts zunächst in Variablen gespeichert werden. Am Ende wenn alle Teilbereiche gerendert sind werden die Inhalte zusammengefügt (delayed)&lt;br /&gt;
&lt;br /&gt;
basic-page.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$headline = $page-&amp;gt;get(&amp;quot;headline|title&amp;quot;);&lt;br /&gt;
$bodycopy = $page-&amp;gt;body;&lt;br /&gt;
$sidebar = $page-&amp;gt;sidebar;&lt;br /&gt;
include(&amp;quot;./main.inc&amp;quot;); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In main.inc werden die Variablen dann verwendet&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;&amp;lt;?php echo $headline; ?&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;#039;bodycopy&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;lt;h1&amp;gt;&amp;lt;?php echo $headline; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
      &amp;lt;?php echo $bodycopy; ?&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div id=&amp;#039;sidebar&amp;#039;&amp;gt;&lt;br /&gt;
      &amp;lt;?php echo $sidebar; ?&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Delayed Output mit automatic inclusions ====&lt;br /&gt;
Oft (aber nicht immer) bietet sich auch an Teile automatisch zu inkludieren. &lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Markup Regions ===&lt;br /&gt;
Kombiniert die Vorteile der vorigen Strategien. Werden per Include (oder über die Funktionen für das Delayed Output) Template Dateien verknüpft, werden die Inhalte gleichnamiger id Container ersetzt oder mit Hilfe von pw- Klassen kombiniert bzw. bearbeitet.&lt;br /&gt;
&lt;br /&gt;
=== Wireframe API ===&lt;br /&gt;
 [[ProcessWire - Wireframe API]]&lt;br /&gt;
&lt;br /&gt;
== Allgemeine Tipps ==&lt;br /&gt;
Es gibt verschiedene Orte wo man Teilrenderings vornehmen kann. Wenn man sich keine Strategie zurechtlegt kann man schnell die Übersicht verlieren. Hier ein paar Vorschläge:&lt;br /&gt;
* Partials im partials Ordner sind für einfache Dinge geeignet und gerade beim Entwurf sehr schnell. Hier lege ich Codeblöcke an die direkt (per echo oder direkt als HTMl) ausgegeben werden. Es gibt keine Rückgaben über return. Partials sind Views. Also auf Funktionen weitgehend verzichten. Ausnahmen sind z.B. foreach Schleifen auf Felder (zumindest solange ohne Template Engine gearbeitet wird).&lt;br /&gt;
* Partials Dateien enden auf .inc&lt;br /&gt;
* In Komplexeren Projekten sollte auf sauberer Model View Controller Trennung geachtet werden.&lt;br /&gt;
* Layoutblöcke für Redakteure kommen z.B. in den Field Bereich. Hier kann man die Renderreihenfolge von PW ausnutzen.&lt;br /&gt;
&lt;br /&gt;
== Datei Strategien ==&lt;br /&gt;
Wo legt man am Besten Dateien und Ordner an.&lt;br /&gt;
=== Basic Theme ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
templates/&lt;br /&gt;
  _func.inc (wenn benötigt)&lt;br /&gt;
  home.php&lt;br /&gt;
  basic_page.php&lt;br /&gt;
templates/partials&lt;br /&gt;
  foot.inc&lt;br /&gt;
  head.inc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Layout Blocks (BEST PRACTICE)===&lt;br /&gt;
Dies ist meine (Steffs) selbstentwickelte Strategie um vielfältige Inhalte auch einem nicht Programmierer im Backend zu ermöglichen und sie dann im Frontend auszugeben.) &lt;br /&gt;
Anstatt den Templates fest definierte Seitenbereiche zuzuordnen und für jedes Layout ein Template zu erzeugen, kann es sinnvoll sein in &amp;#039;&amp;#039;&amp;#039;Layout-Blöcken&amp;#039;&amp;#039;&amp;#039; zu denken. also einzelne Gestaltungsbausteine, die der User auswählen kann und aus denen sich die Seite aufbaut. &lt;br /&gt;
&lt;br /&gt;
Um dies umzusetzen bietet sich der &amp;#039;&amp;#039;&amp;#039;Feldtyp RepeaterMatrix&amp;#039;&amp;#039;&amp;#039; an, der beim den ProField Modul mit dabei ist. Als Alternative würde vielleicht &lt;br /&gt;
 [[ProcessWire - Layout Blöcke mit RepeaterMatrix]]&lt;br /&gt;
 [[Processwire - Flexible Content Type]]&lt;br /&gt;
&lt;br /&gt;
== Rendering Strategien ==&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
http://blog.mauriziobonani.com/processwire-basic-website-workflow-part-2/&lt;br /&gt;
=== Render Funktionen ===&lt;br /&gt;
https://processwire.com/blog/posts/processwire-3.0.7-expands-field-rendering-page-path-history-and-more/#theres-also-page-gt-rendervalue&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// New Functions in 3.x &lt;br /&gt;
render()&lt;br /&gt;
renderValue()&lt;br /&gt;
&lt;br /&gt;
// Functions for 2.x or for easy snippet inclusion (also possible with render&lt;br /&gt;
wireRenderFile() // mostly used for delayed output&lt;br /&gt;
wireIncludeFile() // for direct output&lt;br /&gt;
// i.e.&lt;br /&gt;
// returns the output of snippets/contactform.php&lt;br /&gt;
// the second argument is optional and will be passed to &lt;br /&gt;
// the called file as multiple variables with the name of the key&lt;br /&gt;
// also all api varables are available by default&lt;br /&gt;
&lt;br /&gt;
wireRenderFile(&amp;quot;snippets/contactform&amp;quot;, array(&amp;quot;stuff&amp;quot; =&amp;gt; $something ));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Delayed Output and Advanced Templates ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Ordnerstruktur&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
templates/&lt;br /&gt;
  _func.inc&lt;br /&gt;
  _init.inc&lt;br /&gt;
  _main.inc&lt;br /&gt;
templates/partials&lt;br /&gt;
  foot.inc&lt;br /&gt;
  head.inc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;config.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;
$config-&amp;gt;debug = false;&lt;br /&gt;
$config-&amp;gt;sessionFingerprint = true;&lt;br /&gt;
$config-&amp;gt;prependTemplateFile = &amp;#039;_init.php&amp;#039;;&lt;br /&gt;
$config-&amp;gt;appendTemplateFile = &amp;#039;_main.php&amp;#039;;&lt;br /&gt;
$config-&amp;gt;imageSizerOptions = array(&lt;br /&gt;
	&amp;#039;upscaling&amp;#039; =&amp;gt; true, // upscale if necessary to reach target size?&lt;br /&gt;
	&amp;#039;cropping&amp;#039; =&amp;gt; true, // crop if necessary to reach target size?&lt;br /&gt;
	&amp;#039;autoRotation&amp;#039; =&amp;gt; true, // automatically correct orientation?&lt;br /&gt;
	&amp;#039;sharpening&amp;#039; =&amp;gt; &amp;#039;soft&amp;#039;, // sharpening: none | soft | medium | strong&lt;br /&gt;
	&amp;#039;quality&amp;#039; =&amp;gt; 90, // quality: 1-100 where higher is better but bigger&lt;br /&gt;
	);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AJAX Driven Theme ===&lt;br /&gt;
config.php&lt;br /&gt;
 // if ajax request set&lt;br /&gt;
 $ajax = $input-&amp;gt;post-&amp;gt;ajax;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Markup Regions ===&lt;br /&gt;
Seit Version 3.0 die neueste Rendering Strategie. Hier werden Divs mit ids automatisch zu editierbaren Bereichen, die mit passenden Feldern im Backend befüllt werden.&lt;br /&gt;
&lt;br /&gt;
[[Processwire - Markup Regions]]&lt;br /&gt;
&lt;br /&gt;
== Syntax und Konventionen ==&lt;br /&gt;
&lt;br /&gt;
== Module ==&lt;br /&gt;
[[Processwire - Writing Modules]]&lt;br /&gt;
=== Recommended Modules ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FormBuilder (kostenpflichtig) - FormBuilder&lt;br /&gt;
ProFields (kostenpflichtig) - https://processwire.com/talk/store/product/10-profields/&lt;br /&gt;
Hanna Code (wie bei Wordpress) 	- TextformatterHannaCode&lt;br /&gt;
Map Marker (google Maps) - FieldtypeMapMarker&lt;br /&gt;
Simple Navigation - MarkupSimpleNavigation&lt;br /&gt;
AIOM - All In One Minify - AllInOneMinify&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grundausstattung ==&lt;br /&gt;
Siehe [[Processwire - Templates Grundausstattung]]&lt;br /&gt;
&lt;br /&gt;
== Tipps und Tricks ==&lt;br /&gt;
=== Templates in Backend-Auswahl verstecken ===&lt;br /&gt;
Manche Templates tauchen in der Auswahl der Redakteure auf obwohl es eigentlich nur Teiltemplates sind. Z.B. für eine Matrix.&lt;br /&gt;
Benennt man sie mit einem &amp;#039;&amp;#039;&amp;#039;Underscore am Anfang _NameDesTemplates&amp;#039;&amp;#039;&amp;#039; tauchen sie nicht mehr in der Auswahlliste auf.&lt;/div&gt;</summary>
		<author><name>84.157.18.5</name></author>
	</entry>
</feed>