<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Der Interaktionsdesigner - PHP, jQuery und CSS &#187; Tutorial</title>
	<atom:link href="http://www.interaktionsdesigner.de/category/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.interaktionsdesigner.de</link>
	<description>Webentwicklung mit TYPO3, jQuery, CakePHP und Spaß an neuen Projekten</description>
	<lastBuildDate>Wed, 07 Dec 2011 14:26:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Schönes Javascript mit Callbacks</title>
		<link>http://www.interaktionsdesigner.de/2011/12/07/schones-javascript-mit-callbacks/</link>
		<comments>http://www.interaktionsdesigner.de/2011/12/07/schones-javascript-mit-callbacks/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 14:26:29 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=826</guid>
		<description><![CDATA[Callbacks sind jedem jQuery Anweder bekannt. Von bis zu bindet der Webentwickler jede Menge Logik an festgelegte Events. Meiner Meinung nach eine angenehme Art zu programmieren und gut nachvollziehbar, da der Code gut lesbar bleibt, sofern man nicht übertreibt. Wenn man selbst Applikationen programmiert die auf Javascript basieren und später noch diverse Erweiterungen ermöglichen sollen, [...]]]></description>
			<content:encoded><![CDATA[<p>Callbacks sind jedem jQuery Anweder bekannt. Von <code>onClick</code> bis zu <code>onResize</code> bindet der Webentwickler jede Menge Logik an festgelegte Events. Meiner Meinung nach eine angenehme Art zu programmieren und gut nachvollziehbar, da der Code gut lesbar bleibt, sofern man nicht übertreibt.</p>
<p>Wenn man selbst Applikationen programmiert die auf Javascript basieren und später noch diverse Erweiterungen ermöglichen sollen, dann macht es durchaus Sinn eigene Callbacks anzubieten. Sei es in einer jQuery Extension oder einer eigenen Applikation.</p>
<p><span id="more-826"></span></p>
<h2>Die Anforderung</h2>
<p>Zur Erfüllung meiner aktuellen Anforderung habe ich eine Javascript Klasse erstellt die mit dem Operator <code>new</code> erstellt werden kann:</p>
<pre>var myObject = new FunkyObject();</pre>
<p>Perfekt für die erste Anforderung, aber sobald weitere Entwickler involviert werden oder man Teile der Applikation sogar als OpenSource Software veröffentlicht, wäre es ja schön wenn nicht jeder im eigenen Code rum macht sondern ordentlich in seinem Script bleibt:</p>
<pre>var myObject = new FunkyObject({
&nbsp;&nbsp;onLoad: function() {
&nbsp;&nbsp;&nbsp;&nbsp;//do crazy custom things
&nbsp;&nbsp;}
});</pre>
<p>Sieht ordentlich aus und ist ohne Kommentare selbsterklärend: Beim laden werden verrückte Sachen getan. Aber was tut das FunkyObject um die Callbacks aufzurufen?</p>
<h2>Eine Javascript Klasse</h2>
<p>Genau genommen ist eine Javascript Klasse nichts weiter als eine Funktion die sich selbst zurück gibt und über den <code>new</code> Operator erstellt wird. Meine Grundlage sieht so aus:</p>
<pre>var FunkyObject = function(args) {
&nbsp;&nbsp;var defaults = {};
&nbsp;&nbsp;this.args = $.extend(defaults, args);
&nbsp;&nbsp;this.goCrazy();
&nbsp;&nbsp;return this;
};</pre>
<p>Dieser Code setzt jQuery voraus, das die Funktion <code>$.extend</code> mitbringt. Damit wird das übergebene <code>args</code> Objekt durch die in <code>defaults</code> angegebenen Werte aufgefüllt, sofern sie nicht vorhanden sind. Man kann also für das <code>onClick</code> Event ein Standardverhalten hinterlegen:</p>
<pre>var FunkyObject = function(args) {
&nbsp;&nbsp;var defaults = {
&nbsp;&nbsp;onLoad: function() {
&nbsp;&nbsp;&nbsp;&nbsp;//default behavior
&nbsp;&nbsp;};
&nbsp;&nbsp;this.args = $.extend(defaults, args);
&nbsp;&nbsp;this.goCrazy();
&nbsp;&nbsp;return this;
};</pre>
<p>Die Funktion <code>goCrazy()</code> wird ausgeführt sobald die Klasse initialisiert wird. Um dem nächsten Entwickler die Möglichkeit zu geben auch diese Funktion zu überschreiben, werden alle Grundlagen in der <code>prototype</code> Eigenschaft der Klasse definiert:</p>
<pre>var FunkyObject = function(args) { /* ... */ };
FunkyObject.prototype.goCrazy = function() {
&nbsp;&nbsp;// do the init stuff
};</pre>
<p>Mit diesem Konstrukt könnte ein Entwickler im eigenen Script jene Klasse überschreiben ohne in den eigentlichen Quelltext eingreifen zu müssen.</p>
<pre>myObject.goCrazy = function() {
&nbsp;&nbsp;// custom constructor
}</pre>
<p>Das als kleine Anmerkung am Rande, das erklärte Ziel ist der komfortable Aufruf des <code>onLoad</code> Events. Natürlich könnte man über <code>this.args.onClick()</code> einfach die entsprechende Funktion aufrufen, aber sieht das schön aus? Ist das variabel?</p>
<p>Die Antwort lautet nein. </p>
<h2>Schön und variabel</h2>
<p>Viel cooler ist eine total schöne und variable <code>trigger()</code> Funktion zu schreiben, die in den Parametern nach einem Callback sucht und diesen ggf. ausführt.</p>
<pre>FunkyObject.prototype.trigger = function(action) {
&nbsp;&nbsp;var callback = 'on'+this.ucfirst(action);
&nbsp;&nbsp;if(typeof this.args[callback] == 'function') {
&nbsp;&nbsp;&nbsp;&nbsp;this.args[callback]();
&nbsp;&nbsp;};
}</pre>
<p>In der <code>goCrazy</code> Funktion sieht der Aufruf dann so aus:</p>
<pre>var FunkyObject = function(args) { /* ... */ };
FunkyObject.prototype.goCrazy = function() {
&nbsp;&nbsp;this.trigger('load');
};</pre>
<p>Die <code>trigger</code> Funktion baut sich den Eventnamen aus einem <code>on</code> und dem Parameter <code>action</code> zusammen und prüft anschließend ob eine Funktion mit diesem Namen vorhanden ist. Ist dies der Fall wird sie ausgeführt.</p>
<p>Leider gibt es keine Javascript Funktion mit dem Namen <code>ucfirst</code>, aber über die Prototype Eigenschaft kann man das String Objekt entsprechend aufrüsten:</p>
<pre>String.prototype.ucfirst = function() {
&nbsp;&nbsp;return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
};</pre>
<p>Mit diesen zwei Funktionen baut man sich sehr schnell eine Grundlage um variable Scripte zu schreiben die komplett erweitert werden können.</p>
<h2>Parameter für den Callback</h2>
<p>Oft muss der Callback über einen gewissen Zustand informiert werden. Für das benutzte Beispiel könnte es die Information sein ob das Laden erfolgreich war. Bei der Definition des Callbacks muss ein Parameter akzeptiert werden:</p>
<pre>var myObject = new FunkyObject({
&nbsp;&nbsp;onClick: function(success) {
&nbsp;&nbsp;&nbsp;&nbsp;alert(success ? 'hat geklappt!' : 'fehler');
&nbsp;&nbsp;}
});</pre>
<p>Die <code>goCrazy</code> Funktion muss den Status an die <code>trigger</code> Funktion weitergeben:</p>
<pre>FunkyObject.prototype.goCrazy = function() {
&nbsp;&nbsp;success = true;
&nbsp;&nbsp;this.trigger('load', success);
};</pre>
<p>Wir gehen mal von einem grundlegenden Erfolg aus. Das wird es auch sofern die <code>trigger</code> Funktion beigebracht bekommt was sie mit zusätzlichen Parametern anfangen soll:</p>
<pre>FunkyObject.prototype.trigger = function(action) {
&nbsp;&nbsp;var callback = 'on'+this.ucfirst(action);
&nbsp;&nbsp;if(typeof this.args[callback] == 'function') {
&nbsp;&nbsp;&nbsp;&nbsp;this.args[callback](arguments.shift());
&nbsp;&nbsp;};
}</pre>
<p>Viele Änderungen sind es nicht. In der vordefinierten Variable <code>arguments</code> sind sämtliche Parameter vom Aufruf der Funktion gespeichert. Die Array Funktion <code>shift</code> entfernt das erste Element aus dem Array und gibt den Rest zurück. So wird nicht der Callbackname sinnloser Weise an den Callback gegeben sondern alle andere Parameter. So kann man auch mehr als ein Wert an den Callback schicken:</p>
<pre>FunkyObject.prototype.goCrazy = function() {
&nbsp;&nbsp;success = true;
&nbsp;&nbsp;this.trigger('load', success, 'ready', {hello: 'world'});
};</pre>
<h2>Fazit</h2>
<p>Ich mag Callbacks. Wenn man ein gutes Grundgerüst hat kann man auf alle Events individuell reagieren. Sollte es ein Callback nicht geben den man wirklich dringend und sofort benötigt kann man mit dem Überschreiben der <code>prototype</code> Funktion kurzfristig neue Callbacks hinzufügen und später in die Core Anwendung übernehmen.</p>
<p>Wichtig ist aber darauf zu achten keine unendlichen Scripte in den Callbacks unterzubringen. Spätestens nach 20 Zeilen sollte man sich überlegen den Code in einzelne Häppchen aufzuteilen.</p>
<p>Und in eigener Sache noch die Warnung vor gedankenlosem Copy and Paste: Durch Unterschrift auf dem NDA musste ich alle Funktionen umbenennen. Also nachdenken und gute Funktionsnamen benutzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2011/12/07/schones-javascript-mit-callbacks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asynchron Inhalte in WordPress nachladen</title>
		<link>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/</link>
		<comments>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/#comments</comments>
		<pubDate>Thu, 06 May 2010 09:53:39 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=674</guid>
		<description><![CDATA[Neben der Gründung einer neuen Firma die sich um Webentwicklungsthemen und Medienproduktion kümmert (Die Ape Unit GmbH Berlin) hatte ich eine Menge mit WordPress zu tun. Ein guter Grund hier mal wieder etwas Leben in den Blog zu bringen. Es geht natürlich um den heißen Scheiß: Ajax. Mit aktiviertem JavaScript soll bei einem Klick auf [...]]]></description>
			<content:encoded><![CDATA[<p>Neben der Gründung einer neuen Firma die sich um Webentwicklungsthemen und Medienproduktion kümmert (<a title="Webentwicklung und Medienproduktion" href="http://www.apeunit.com" target="_blank">Die Ape Unit GmbH Berlin</a>) hatte ich eine Menge mit <strong>WordPress</strong> zu tun. Ein guter Grund hier mal wieder etwas Leben in den Blog zu bringen.</p>
<p>Es geht natürlich um den heißen Scheiß: <strong>Ajax</strong>. Mit aktiviertem JavaScript soll bei einem Klick auf einen Eintrag der <strong>Eintrag dynamisch nachgeladen</strong> werden anstatt auf die Einzelansicht zu verlinken. Mit <strong>TYPO3</strong> und Typoscript baut man sich dafür ein weiteres <strong>Page Objekt</strong> und passt die Ausgabe an, <a title="Ajax und TYPO3" href="http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/" target="_self">darüber hatte ich schon berichtet</a>. Bei WordPress gibt es aber kein Typoscript.</p>
<p>Mein erster Gedanke war ein alternatives Template per URL Parameter zu laden in dem nur die Inhalte angezeigt werden. Die Anleitungen waren allerdings allesamt nicht besonders ergiebig. Der nächste Ansatz war den gesamten Inhalt abzufragen und per jQuery nur den entsprechenden Container mit den Inhalten auszugeben. Das finde ich aber irgendwie unelegant.</p>
<p>Und nach einmal drüber schlafen kam dann der rettende und <strong>sehr simple Einfall</strong>.</p>
<p><span id="more-674"></span></p>
<h2>functions.php</h2>
<p>Mit meinem <a title="Mein Lieblingsframework" href="http://www.cakephp.org" target="_blank">CakePHP</a> verwöhntem Blick würde ich die functions.php mal mit einer Art <strong>Controller</strong> vergleichen. Der Aufruf geht also durch diese Datei, in der Variablen gesetzt und Funktionen definiert werden können, die anschließend in den Views zur Verfügung stehen.</p>
<p>Und hier steckt schon das ganze Geheimnis, ist die Servervariable <strong>HTTP_X_REQUESTED_WITH</strong> gesetztz, handelt es sich um eine asynchrone Anfrage:</p>
<pre>if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
&nbsp;&nbsp;$ajax = true;
}
else {
&nbsp;&nbsp;$ajax = false;
}</pre>
<h2>Die Views</h2>
<p>In den üblichen Verdächtigen des Themes, damit meine ich die <em>single.php</em>, <em>page.php</em>, <em>index.php</em> usw. steht jetzt die Variable <strong>$ajax</strong> zur Verfügung. Bisher fand ich die Arbeitsweise von WordPress nicht sehr elegant in jeder Datei Header, Sidebar und Footer einbinden zu müssen, aber jetzt finde ich sie gut. Denn wenn bei einem Ajaxaufruf <strong>nur der Inhalt</strong> zurück gegeben werden soll, dann lässt man das überflüssige HTML Gerüst einfach draußen:</p>
<pre>if(!$ajax) {
&nbsp;&nbsp;get_header();
}</pre>
<h2>Fazit</h2>
<p><strong>Das war einfach.</strong> WordPress ist ein tolles System und ich kann es kaum erwarten endlich die neue Version 3.0 stable zu sehen. Wie das ganze drum herum mit jQuery funktioniert, steht im bereits oben erwähnten <a href="http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/" target="_self">Eintrag zu TYPO3</a>. Frohes bloggen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Kurzschreibweisen</title>
		<link>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 13:49:18 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=224</guid>
		<description><![CDATA[Mit PHP kann man zwischen &#60;? und ?&#62; nicht nur ganze Programme schreiben sondern auch einfach und schnell Werte ausgeben. Das ist besonders praktisch für Templates mit Funktionen wie z.B. in WordPress und TYPOlight eingesetzt. Anders als bei TYPO3 wird der Inhalt nicht über Marker in den HTML Code transportiert, sondern direkt über dynamischen PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Mit PHP kann man zwischen <strong>&lt;? und ?&gt;</strong> nicht nur ganze Programme schreiben sondern auch einfach und schnell Werte ausgeben. Das ist besonders praktisch für <strong>Templates mit Funktionen</strong> wie z.B. in <strong>WordPress</strong> und <strong>TYPOlight</strong> eingesetzt.</p>
<p>Anders als bei <strong>TYPO3</strong> wird der Inhalt nicht über Marker in den HTML Code transportiert, sondern direkt über <strong>dynamischen PHP Code</strong>. Diese Art der Templates finde ich sehr gut, weil man auf verschiedene Bedingungen einfacher reagieren kann als, z.B. mit Typoscript.</p>
<p>Allerdings erfordern solche Templates auch mehr Konsequenz vom Entwickler, denn <strong>Präsentation und Logik gehören nicht vermischt</strong>.</p>
<p>Jetzt kommt eine Übersicht der<strong> praktischen Kurzschreibweisen </strong>zum Verwenden in eigenen Projekten, WordPress oder TYPOlight.</p>
<p><span id="more-224"></span></p>
<h2>Ausgaben</h2>
<p>Um Variablen auszugeben wird das <strong>= Zeichen</strong> benutzt. <pre>&lt;?=$welcome_msg?&gt;</pre>Diese Zeile, man könnte es schon fast als Tag bezeichnen und ist gleichbedeutend mit <pre>&lt;? echo $welcome_msg; ?&gt;</pre></p>
<h2>Bedingungen</h2>
<p>Die gute alte<strong> If-Abfrage </strong>kann auf zwei Weisen dargestellt werden. <strong>Die erste</strong> ist für Fälle in denen mehr Inhalt ausgegeben werden soll.<pre>&lt;? if($user == "admin"): ?&gt;
&nbsp;&nbsp;Hallo &lt;b&gt;Admin&lt;/b&gt;, hier sind deine &lt;a href="#" class="admin"&gt;Optionen&lt;/a&gt;&lt;br&gt;
&nbsp;&nbsp;&lt;div id="status"&gt;&lt;h1&gt;Projektstatus&lt;/h1&gt;&lt;/div&gt; &lt;!-- usw. usf. --&gt;
&lt;? endif; ?&gt;</pre>Das wichtige ist der <strong>Doppelpunkt</strong>, welches dem Parser sagt alles was folgt ist gehört zu dieser Bedingung, bis zum <strong>endif;</strong></p>
<p>Alternativen lassen sich darin natürlich auch einbauen<pre>&lt;? if($user == "admin"): ?&gt;
&nbsp;&nbsp;... viele Ausgaben ...
&lt;? elseif($user == "redakteur"): ?&gt;
&nbsp;&nbsp;--- andere Ausgaben ----
&lt;? else: ?&gt;
&nbsp;&nbsp;___ alternative Ausgaben ___
&lt;? endif; ?&gt;</pre>Damit lässt sich HTML Code auf angenehme Art und Weise per PHP steuern. Wichtig und sinnvoll ist auf eine korrekte Einrückung zu achten damit die Übersicht erhalten bleibt.</p>
<p><strong>Die zweite</strong> ist noch kürzer. Wenn man keine komplexen Ausgaben hat sondern nur, z.B. einzelne Worte ausgeben möchte<pre>&lt;?=$owner == $user ? "meins" : "fremd"?&gt;</pre>gibt, wenn <em>$owner</em> gleich <em>$user</em> ist, das Wort "<em>meins</em>" zurück, ansonsten "<em>fremd</em>".</p>
<p>Die Syntax ist etwas gewöhnungsbedürftig, aber schnell gelernt: <strong>Der erste Block ist die Abfrage</strong>, sie wird beendet vom <strong>Fragezeichen</strong> welches auch gleichzeitig den Block einleitet der bei erfüllter Bedingung ausgeführt wird. Abgeschlossen und gleichbedeutend mit <em>else</em> folgt dann der <strong>Doppelpunkt und die Else-Anweisung</strong>. Alle Teile müssen vorhanden sein, sonst funktioniert es nicht.</p>
<p>Ausgeschrieben ist die Abfrage gleichbedeutend mit:<pre>&lt;? if($owner == $user) {
&nbsp;&nbsp;echo "meins";
}
else {
&nbsp;&nbsp;echo "fremd";
}</pre></p>
<p>Ein praktisches Beispiel wäre z.B. innerhalb einer Schleife: <pre>&lt;li class="&lt;?=$i%2 == 0 ? "even" : "odd"?&gt;"&gt;&lt;=$content?&gt;&lt;/li&gt;</pre>Alle erinnern sich an die <a title="Modulo verstehen auf Pauls Blog" href="http://www.interaktionsdesigner.de/2009/01/27/modulo-verstehen-und-benutzen/" target="_blank">Modulo-Operation</a>?</p>
<p>Gut, dann weiter mit</p>
<h2>Schleifen</h2>
<p>Die Syntax der Schleifen ist im Prinzip genau die selbe. Die <strong>For-Schleife</strong>:<pre>&lt;? for($i = 0; $i &lt; 10; $i++): ?&gt;
&nbsp;&nbsp;Zeile &lt;?=$i?&gt; von 10
&lt;? endfor; ?&gt;</pre></p>
<p>hat die gleiche Syntax wie die <strong>Foreach-Schleife</strong>:<pre>&lt;? foreach($array as $key =&gt; $value): ?&gt;
&nbsp;&nbsp;Array: &lt;?=$key?&gt; = &lt;?=$value?&gt;&lt;br&gt;
&lt;? endforeach; ?&gt;</pre></p>
<p>Und die <strong>While-Schleife</strong> darf natürlich auch nicht fehlen:<pre>&lt;? while($row = mysql_fetch_object($hdl)): ?&gt;
&nbsp;&nbsp;Zeile &lt;?=$row-&gt;uid?&gt; gehört &lt;?=$row-&gt;name?&gt;&lt;br&gt;
&lt;? endwhile; ?&gt;</pre></p>
<h2>Fazit</h2>
<p>Das waren <strong>Kurzschreibweisen in PHP</strong>. Sind schon sehr schmal und können für ein übersichtliches Template sorgen, wenn der fleißige Entwickler sich an die Einrückung hält und Logik mit Präsentation nicht vermischt wird. <em>Frohes Nachdenken!</em></p>
<p><em>UPDATE: </em>Aufgrund von unendlich vielen unverständlichen, russichen Spamkommentaren habe ich die Kommentare geschlossen. Bei Fragen einfach bei der <a title="Webentwicklung Berlin" href="http://www.apeunit.com">Ape Unit GmbH</a> melden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Modulo verstehen und benutzen!</title>
		<link>http://www.interaktionsdesigner.de/2009/01/27/modulo-verstehen-und-benutzen/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/27/modulo-verstehen-und-benutzen/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 22:15:57 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=202</guid>
		<description><![CDATA[Diesen Beitrag widme ich meinem Informatiklehrer Herrn Westphal, der es so sehr versucht hat, aber es hat einfach noch vier Jahre gebraucht. Zugegeben, ich bin nicht der größte Mathefan und bin heilfroh, dass soviel im Internet ohne funktioniert. Aber man darf sich bekanntlich nicht vor Wissen verschließen und wenn man dahinter gekommen ist, macht es [...]]]></description>
			<content:encoded><![CDATA[<p><em>Diesen Beitrag widme ich meinem Informatiklehrer Herrn Westphal, der es so sehr versucht hat, aber es hat einfach noch vier Jahre gebraucht.</em></p>
<p>Zugegeben, ich bin nicht der größte Mathefan und bin heilfroh, dass soviel im Internet ohne funktioniert. Aber man darf sich bekanntlich nicht vor Wissen verschließen und wenn man dahinter gekommen ist, macht es ja auch Spaß!</p>
<p>So kürzlich geschehen mit der Funktion <strong>Modulo</strong>! Ich erinnere mich an all die dunklen Stunden, in denen ich halbherzig versucht habe das zu verstehen, aber es wollte einfach nicht so wie ich. <strong>Aber jetzt habe ich es raus</strong> und kann nur empfehlen: lest den Beitrag wenn ihr diese Operation noch nicht kennt oder versteht.</p>
<p><span id="more-202"></span></p>
<p>Einfach gesagt ist Modulo<strong> teilen durch ganze Zahlen und den Rest zurück kriegen</strong>. Der Operator ist in PHP und JavaScript das Prozentzeichen (<strong>%</strong>). So kann das Ergebnis aussehen:</p>
<p>0 modulo 5 = 0<br />
1 modulo 5= 1<br />
2 modulo 5= 2<br />
3 modulo 5 = 3<br />
4 modulo 5 = 4<br />
5 modulo 5 = 0<br />
6 modulo 5 = 1<br />
7 modulo 5 = 2<br />
8 modulo 5 = 3<br />
9 modulo 5 = 4</p>
<p>Der PHP Code der das erzeugt hat ist der hier: <pre>&lt;?
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;echo "$i modulo 5 = ". ($i%5). "&lt;br&gt;";
&nbsp;&nbsp;}
?&gt;</pre></p>
<p>Wenn einem jetzt nicht auf Anhieb ein Anwendungsfall einfällt, dann sollte man sich überlegen was dieser Code tut:<pre>&lt;?
&nbsp;&nbsp;$a = 0;
&nbsp;&nbsp;$class = "";
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;$a++;
&nbsp;&nbsp;&nbsp;&nbsp;if($a &gt; 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = 0;
&nbsp;&nbsp;&nbsp;&nbsp;$class = $a == 1 ? "even" : "odd";
&nbsp;&nbsp;&nbsp;&nbsp;echo "$i modulo 5 = ". ($i%5). " ($class)&lt;br&gt;";
&nbsp;&nbsp;}
?&gt;</pre>Richtig,<strong> jede zweite Zeile</strong> wird anders behandelt. Dazu wird <em>$a</em> erhöht und wenn es 2 ist wieder auf <em>Null</em> gesetzt um anschließend je nach Wert ein Namen auszugeben (z.B. für Zebrastreifen). Funktioniert, hat aber gedauert zu tippen und geht viel einfacher: Das ist die Ausgabe bei Modulo 2:<br />
0 modulo 2 = 0<br />
1 modulo 2 = 1<br />
2 modulo 2 = 0<br />
3 modulo 2 = 1<br />
4 modulo 2 = 0<br />
5 modulo 2 = 1<br />
6 modulo 2 = 0<br />
7 modulo 2 = 1<br />
8 modulo 2 = 0<br />
9 modulo 2 = 1<br />
Dämmerts? <em>$i</em> wird durch 2 geteilt. Dabei bleibt immer 1 oder 0 übrig. Egal um welche Zahl es geht. Na dann:<pre>&lt;?
&nbsp;&nbsp;$class = "";
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;$class = $i%2 ? "even" : "odd";
&nbsp;&nbsp;&nbsp;&nbsp;echo "$i modulo 2 = ". ($i%2). " ($class)&lt;br&gt;";
&nbsp;&nbsp;}
?&gt;</pre>Herrlich, oder? Schnell, effektiv, zuverlässig und in allen Sprachen einsetzbar. Mehr braucht man darüber gar nicht zu wissen <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Aber <strong>lovely jQuery</strong> erpart uns natürlich das Rechnen. Hier gibt es die Psydoklassen (beginnen mit einem Doppelpunkt) <strong>:even</strong> und <strong> <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> dd</strong>. Damit wird jedes zweite, bzw. erste Element ausgewählt.<pre>$("ul li:even").addClass("even");</pre>Fügt <strong>jeder zweiten Zeile</strong> eine Klasse hinzu.</p>
<p>Und wenn dieses Funktion bei mehreren Listen die verändert werden sollen anfängt rumzuspinnen, dann muss man sich klar machen, dass der Selektor <em>$("ul li:even")</em> <strong>alle</strong> zweiten Listenelemente auf der Seite trifft. Unabhängig davon in welcher Liste sie sich befinden.</p>
<p>Die Lösung ist mal wieder einfach: <em>$("ul")</em> selektiert alle Listen <strong>und dann</strong> behandeln wir jedes Listenelement einzelnd:<pre>$("ul").find("li:even").addClass("zebra");</pre></p>
<p>Viel Spaß und mit <span style="text-decoration: line-through;">Mathe</span> jQuery!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/27/modulo-verstehen-und-benutzen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Spaß mit location.hash und jQuery</title>
		<link>http://www.interaktionsdesigner.de/2009/01/25/spas-mit-locationhash-und-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/25/spas-mit-locationhash-und-jquery/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 13:50:57 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=190</guid>
		<description><![CDATA[Weiter gehts mit Tutorials für jQuery! Nach dem sich der erste Teil mit Navigation beschäftigen sollte, habe ich gemerkt, dass es keinen Sinn macht nur ein Tutorial darüber zu schreiben. Denn so einfach eine simple Liste mit Links auch aussieht; -  umso mehr gibt es darüber zu sagen.  Also wird es eine ganze Reihe Tutorials [...]]]></description>
			<content:encoded><![CDATA[<p>Weiter gehts mit <strong>Tutorials für jQuery</strong>! Nach dem sich <a title="Ein einfaches jQuery Tutorial" href="http://www.interaktionsdesigner.de/2009/01/24/menu-tutorial-fur-jquery/">der erste Teil mit Navigation</a> beschäftigen sollte, habe ich gemerkt, dass es keinen Sinn macht nur <em>ein</em> Tutorial darüber zu schreiben. Denn so einfach eine simple Liste mit Links auch aussieht; -  umso mehr gibt es darüber zu sagen.  Also wird es eine ganze Reihe Tutorials dazu geben!</p>
<p>Diesmal gehts um den <strong>Location Hash</strong>. Das ist der Teil der URL der mit einer Raute (#) von der restlichen Adresse getrennt ist. Bekannt von Sprungmakern (interne Seitenverweise) gewinnt er im Zusammenspiel mit neusten JavaScripttechnologien immer mehr an Bedeutung.<br />
<span id="more-190"></span></p>
<h2>HTML Grundlagen</h2>
<p>Erstmal eine kurze Betrachtung <em>ohne</em> JavaScript. Der einfache Hash einer URL wird vom Browser interpretiert und der sichtbare Bereich der Seite springt zu dem Element dessen ID angegeben ist. Zum Beispiel für Überschriften praktisch.<pre>&lt;h1 id="wichtig"&gt;Es ist wichtig&lt;/h1&gt;
&lt;p&gt;bla bla bla ...&lt;/p&gt;
&lt;h1 id="unten"&gt;Weiter unten&lt;/h1&gt;
&lt;p&gt;noch mehr bla bla ...&lt;/p&gt;</pre>Wenn man das<em> bla bla</em> mit mehr Text auffüllt oder das Browserfenster entsprechend klein macht, dann kann man mit einem HTML Menü zwischen den Überschriften hin und her springen: <pre>&lt;a href="#wichtig"&gt;Zur wichtigen Überschrift&lt;/a&gt;
&lt;a href="#unten"&gt;Zur unteren Überschrift&lt;/a&gt;</pre>Wichtig und praktisch ist das im Zusammenhang mit einer weiteren Seite.<pre>&lt;a href="zweite-seite.html#irgendwo"&gt;Gehe nach irgendwo&lt;/a&gt;</pre></p>
<h2>Zusammenspiel mit jQuery</h2>
<p>Jetzt kommt das <strong>Lieblingsframework</strong> ins Spiel! Hier steht der Wert aus dem Hash als Attribut zur Verfügung! Ich benutze die gleiche HTML Grundlage wie im <a title="HTML Grundgerüst aus dem ersten Tutorial" href="http://www.interaktionsdesigner.de/2009/01/24/menu-tutorial-fur-jquery/#htmlgrundgeruest">ersten Tutorial</a> (man beachte den Sprungmarker <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).<pre>jQuery(function($) {
&nbsp;&nbsp;$(".menu a").click(function() {
&nbsp;&nbsp;&nbsp;&nbsp;alert($(this).attr("hash"));
&nbsp;&nbsp;&nbsp;&nbsp;return false;
&nbsp;&nbsp;});
});</pre>Mit diesem Code gibts von jedem Link den Hashwert angezeigt. Das <em>return false;</em> verhindert das Laden einer neuen Seite, sollte die im Link angegeben sein.</p>
<p>Und was soll man damit machen? <strong>Ajaxanwendungen bauen!!</strong> Wenn für jeden Link ein aussagekräftiger Hashwert zur Verfügung steht, dann wird der einfach an ein serverseitiges Script weitergeleitet und das kann damit tun was immer notwendig ist. Ich bevorzuge das Folgende: Es gibt einfach alle übergebenen Variablen aus.<pre>&lt;?
&nbsp;&nbsp;echo "&lt;pre&gt;", print_r($_REQUEST), "&lt;/pre&gt;";
?&gt;</pre></p>
<p>Jetzt ohne viel Gerede <strong>die komplette Klickfunktion</strong>.<pre>$(".menu a").click(function() {
&nbsp;&nbsp;$(".menu a.active").removeClass("active");
&nbsp;&nbsp;$(this).addClass("active").blur();
&nbsp;&nbsp;
&nbsp;&nbsp;$.ajax({
&nbsp;&nbsp;&nbsp;&nbsp;url: "remote.php",
&nbsp;&nbsp;&nbsp;&nbsp;data: {gib_mir: $(this).attr("hash").substr(1)},
&nbsp;&nbsp;&nbsp;&nbsp;type: "POST",
&nbsp;&nbsp;&nbsp;&nbsp;dataType: "HTML",
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;success: function(remote_html) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$("#response").hide().html(remote_html).fadeIn();
&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;error: function() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("Mist verdammter, etwas hat nicht geklappt  ");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;});
});</pre>Sieht kompliziert aus? Ist es aber gar nicht! Was ist passiert?</p>
<p>Die ersten zwei Zeilen stammen aus dem ersten Tutorial und dienen nur der besseren Darstellung.<br />
Dann kommt die <strong>Ajaxanfrage</strong>. Das ist ein Objekt mit einer ganzen Reihe Eigenschaften, die da wären:</p>
<ul>
<li><strong>url</strong> gibt die aufzurufende Datei an.</li>
<li><strong>data</strong> ist ein neues Objekt mit allen Daten die übergeben werden sollen. jQuery kümmert sich, je nach Typ der Anfrage, um das korrekte verpacken und verschicken.<br />
Das Objekt hat eine Eigenschaft: <em>gib_mir</em> steht dann als Name im PHP Script zur Verfügung ($_POST["<em>gib_mir</em>"]). Der Wert ist das Attribut hash aus dem angeklickten Link. <em>Substr(1) </em>schneidet das erste Zeichen ab - das ist immer die Raute und die brauchen wir nicht mehr.</li>
<li><strong>type</strong> gibt den Datenübertragungsform an. Man könnte sagen <em>GET</em> bei kurzen Inhalten, <em>POST</em> bei langen. Mehr Informationen darüber bringt <a title="Google kennt auch den Unterschied zwischen GET und POST" href="http://www.google.de/search?q=unterschied+GET+POST" target="_blank">Google</a>.</li>
<li><strong>dataType</strong> sagt jQuery welche Daten erwartet werden. Das sollte man nie vergessen, denn nach dieser Angabe wird die Variable für die Funktion hinter <em>success</em> formatiert.</li>
<li><strong>success</strong> ist die Funktion die ausgeführt wird wenn alles geklappt hat. In den Parametern ist die Antwort vom Script, hier also in <em>remote_html</em>.<br />
In dieser Funktion steht nur eine Zeile, die mal wieder die ganze Schönheit und Macht von jQuery demonstriert. Stück für Stück:<br />
<strong>$("#response")</strong> wählt das Element mit der ID response aus (z.B. ein DIV Container)<br />
<strong>hide()</strong> blendet ihn aus<br />
<strong>html()</strong> schreibt neuen HTML Code hinein<br />
und mit <strong>fadeIn()</strong> wird er sanft dem Benutzer wieder eingeblendet.</li>
<li><strong>error</strong> ist schließlich noch eine Funktion die ausgelöst wird wenn etwas nicht geklappt hat.</li>
</ul>
<p>Das war <strong>Ajax</strong>! Ganz einfach. Die Ausgabe sieht z.B. so aus: <pre>Array
(
&nbsp;&nbsp;[gib_mir] =&gt; punkt4
)
1</pre><br />
Was sofort auffällt ist das fehlende <em>remote false;</em> in der Klickfunktion. Damit schreibt der Browser den Hashwert in die URL. Aber wenn eine andere Datei in der URL angegeben ist, führt es zu einem Seitenwechsel. Zum Glück macht uns jQuery auch hier die Arbeit leichter und die Funktion wird um zwei Zeilen erweitert.<pre>$(location).attr("hash", $(this).attr("hash"));
return false;</pre></p>
<h2>Das Tolle an der Sache</h2>
<p>Indem der Hash verändert wird, ist es möglich die URL zu verschicken, zu speichern und im Blog zu verlinken. Blöd allerdings, dass dabei nichts passiert.</p>
<p><strong>Doch keine Panik</strong>, zwei Zeilen helfen weiter!<pre>if($(location).attr("hash"))
&nbsp;&nbsp;$("a[hash="+$(location).attr("hash")+"]").click();</pre>Übersetzt bedeutet das: Wenn ein Hashwert gefunden wird <em>if(...)</em>, dann suche den Link mit diesem Wert und führe die Aktion aus, wie als wäre draufgeklickt. Herrlich oder?</p>
<p>Die (ich nenne sie mal) <strong>Event-Funktionen</strong>, z.B. <em>click</em>, <em>mouseover</em>, <em>mouseup</em>, <em>dblclick</em> usw., funktionieren auf zwei Arten: wird eine Funktion als Parameter übergeben, wird diese ausgeführt wenn das Event vom Benutzer ausgelöst wird (siehe oben <em>$("a").click(function() { alert("Hallo A!"); });</em>). Wird kein Parameter übergeben, löst jQuery die Funktion aus - <strong>wie als hätte der Benutzer darauf geklickt</strong>.</p>
<p>Und das hat zur Folge: <strong>Alle Links funktionieren!</strong> Die Seite reagiert auf den Hash und einem Verschicken steht nichts mehr im Wege!</p>
<h2>Fazit</h2>
<p>Mit Hilfe des Location Hash kann man Ajaxanwendungen bauen, die wissen an welcher Position der Benutzer einsteigen will. War das Tutorial verständlich?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/25/spas-mit-locationhash-und-jquery/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Menü Tutorial für jQuery</title>
		<link>http://www.interaktionsdesigner.de/2009/01/24/menu-tutorial-fur-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/24/menu-tutorial-fur-jquery/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 11:27:35 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=181</guid>
		<description><![CDATA[Nachdem die USA einen neuen Präsidenten hat und dessen Team sofort die Seite des Weißen Haus aktualisiert hat (gefunden im Designtagebuch) und jQuery Version 1.3.1 erschienen ist, wäre es an der Zeit, den Interaktionsdesigner mit ein paar jQuery Tutorials aufzufrischen. Das Erste dreht sich um Menüs, bzw. Navigationen. Das JavaScript ist unaufdringlich und ermöglicht dem [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem die USA einen neuen Präsidenten hat und dessen Team sofort die Seite des <a title="Das Weiße Haus nutzt auch jQuery" href="http://www.whitehouse.gov/" target="_blank">Weißen Haus</a> aktualisiert hat (gefunden im <a href="http://www.designtagebuch.de/whitehouse-gov-relaunch/" target="_blank">Designtagebuch</a>) und <a title="Neue jQuery Version!" href="http://blog.jquery.com/2009/01/21/jquery-131-released/" target="_blank">jQuery Version 1.3.1</a> erschienen ist, wäre es an der Zeit, den Interaktionsdesigner mit ein paar jQuery Tutorials aufzufrischen.</p>
<p>Das Erste dreht sich um Menüs, bzw. Navigationen. Das JavaScript ist unaufdringlich und ermöglicht dem Nutzer durch ein paar einfache Tricks ein besseres Erlebnis. Benutzer ohne aktiviertes JavaScript werden nicht ausgeschlossen. Es geht um die Funktionen <strong>hover</strong> und <strong>click</strong> und ein bisschen <strong>CSS3</strong>. Fragen sind gern gesehen in den Kommentaren und jQuery auf jeder Seite!</p>
<p><span id="more-181"></span></p>
<h2>Ziele festlegen</h2>
<p>Bevor man mit einem IT-Projekt beginnt, ist es immer sinnvoll sich darüber klar zu werden, was erreicht werden soll. Und wenn mit Kunden gearbeitet wird, dann sollte man das schriftlich festhalten und solange darüber reden bis allen Parteien klar ist, was an welcher Stelle gemeint ist. Schwierig, aber man <strong>muss es versuchen</strong>!</p>
<p>In diesem Tutorial soll die Navigation verbessert werden, <em>unaufdringlich</em> und für <em>jedes</em> Projekt einsetzbar. Nebenbei lernt man die <strong>Grundfunktionen von jQuery</strong> kennen.</p>
<h2 id="htmlgrundgeruest">HTML Grundgerüst</h2>
<p>Den Anfang bildet natürlich ein Menü. Für diverse Image Replacement Techniken, sonstigem CSS Schnickschnack bis hin zur IE Kompatibilität, nehme ich mal folgendes, universelles Grundgerüst, welches aus jedem CMS herauszukriegen sein sollte, sei es <strong>TYPO3</strong>, <strong>Typolight</strong> oder <strong>Drupal</strong>.<br />
<pre>&lt;ul class="menu"&gt;
&nbsp;&nbsp;&lt;li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#punkt1" class="active"&gt;&lt;span&gt;Punkt 1&lt;/span&gt;&lt;/a&gt;
&nbsp;&nbsp;&lt;/li&gt;
&nbsp;&nbsp;&lt;li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#punkt2"&gt;&lt;span&gt;Punkt 2&lt;/span&gt;&lt;/a&gt;
&nbsp;&nbsp;&lt;/li&gt;
&nbsp;&nbsp;&lt;li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#punkt3"&gt;Punkt 3&lt;/a&gt;
&nbsp;&nbsp;&lt;/li&gt;
&nbsp;&nbsp;&lt;li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href="#punkt4"&gt;Punkt 4&lt;/a&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span&gt;Ein Hinweistext!&lt;/span&gt;
&nbsp;&nbsp;&lt;/li&gt;
&lt;/ul&gt;</pre>Wer genau hinsieht, entdeckt einige fundamentale Unterschiede, die jQuery zu Höchstform auflaufen lassen.</p>
<p>Diese Menü soll funktionieren, ohne dass JavaScript benötigt wird, bevor man anfängt. Das gleiche HTML als <strong>TYPO3 Template</strong> könnte so aussehen: <pre>&lt;ul class="menu"&gt;
&nbsp;&nbsp;###MAINMENU###
&lt;/ul&gt;
&lt;div id="content"&gt;
&nbsp;&nbsp;###CONTENT###
&lt;/div&gt;</pre></p>
<h2>Das jQuery Grundgerüst</h2>
<p>Nach dem Einbinden des Frameworks (zu Testzwecken oder wenn keine aktuelle Version zur Hand ist, auch gerne vom allmächtigen Googleserver: <a title="jQuery vom Googleserver" href="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js">http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js</a>) braucht man ein Plätzchen für das eigene Script. Entweder im Kopf des HTML Dokuments oder in einer externen Datei.</p>
<p>Gestartet wird immer mit einem simplen <strong>Hallo Welt</strong>. <pre>jQuery(function($) {
&nbsp;&nbsp;alert("Hallo Welt!");
});</pre> Die Funktion <em>jQuery()</em> wird aufgerufen, sobald das DOM geladen ist. Als Parameter bekommt sie eine anonyme Funktion, die ausgeführt wird. Dieser wird automatisch als einziger Parameter das jQueryframework übergeben. Mit dem Dollar-Zeichen kann dann wie gewohnt gearbeitet werden. Das Tolle an dieser Syntax - im Gegensatz zu <em>$(document).ready(function() {});</em> -  ist die problemlose Zusammenarbeit mit anderen Frameworks.</p>
<p>Wird man beim Neuladen der Seite nicht von einer fröhlichen Alertbox begrüßt, muss man prüfen, ob alle JavaScripte geladen sind. Das geht am schnellsten mit Firebug und aktiviertem Scriptmodul. Hier testet man nach und nach ob alle Scripte vorhanden sind.</p>
<p><img class="aligncenter size-full wp-image-182" title="Mit Firebug prüfen ob Scripte geladen wurden" src="http://www.interaktionsdesigner.de/wp-content/uploads/2009/01/fb.jpg" alt="Mit Firebug prüfen ob Scripte geladen wurden" width="726" height="475" /></p>
<h2>Mehr Klassen</h2>
<p>Mit <strong>:hover</strong>, <strong>:active</strong>, <strong>:focus</strong> und <strong>:link</strong> gibt es schon ein paar Möglichkeiten für Links, aber wenn es um die ganzen Listenelemente geht, hört es (z.B. im IE6) schon wieder auf. Aber nicht mit jQuery! Die Funktion <strong>hover</strong> gibt uns genau das was wir brauchen.<pre>$(".menu li").hover(function() {
&nbsp;&nbsp;$(this).addClass("hover");
}, function() {
&nbsp;&nbsp;$(this).removeClass("hover");
});</pre>Die Funktion erwartet zwei weitere Funktionen als Parameter. Die erste wird ausgeführt wenn die Maus das Element berührt, die zweite wenn der Zeiger es wieder verlässt.</p>
<p>Im Schlüsselwort <strong>this</strong> ist das Element gespeichert, welches die Funktion gerade ausgelöst hat. Mit der Übergabe an jQuery <strong>$(this)</strong> stehen dann wieder alle gewohnten Funktionen zur Verfügung.</p>
<h2>CSS3 Selektoren für jeden Browser</h2>
<p>Der Hinweistext im span soll nur bei Mouseover gezeigt werden. Das lässt sich schnell und einfach per CSS lösen. <pre>li&gt;span {
&nbsp;&nbsp;display:none;
}
li:hover&gt;span {
&nbsp;&nbsp;display:inline;
}</pre>Dem geübten Internet Explorer 6 "Optimierer" stehen jetzt schon die Haare zu Berge, die Webstandardsverfechter freuen sich und der Designer sagt: "das sollte aber sanft eingeblendet werden".<br />
Und die Kunden surfen alle mit dem uralten, schlechten Browser aus dem Firmennetzwerk und können noch nicht mal was dafür.</p>
<p>Das erste Problem ist das <strong>&gt;</strong> Zeichen. Die Anweisung trifft auf alle Spanelemente zu, die sich direkt in einem Listenelement befinden. Würde man es weglassen, würde es auf alle Spanelemente zutreffen, die sich in einem Listenelement befinden. Dies hätte zur Folge, dass Punkt 1 und 2 ebenfalls verschwinden würden.</p>
<p>Die Lösung ist super einfach! jQuery unterstützt die meisten Eigenschaften von CSS3 und kümmert sich alleine darum, dass sie in jedem Browser funktionieren.<pre>$("li&gt;span").hide();</pre>Zuverlässig versteckt.</p>
<p>Um den Hinweistext wieder sichtbar zu machen, wird die hover Funktion erweitert. Die meisten Funktionen haben als Rückgabewert wieder ein jQuery-Objekt. Das bedeutet man kann sie einfach verknüpfen. Bei Mouseover sieht das z.B. so aus: <pre>$(this).addClass("hover").find("&gt;span").show();</pre><br />
<strong>$(this)</strong> bezieht sich auf das aktuelle Element.<br />
<strong>addClass("hover")</strong> fügt eine Klasse hinzu.<br />
<strong>find("&gt;span")</strong> sucht in dem aktuellen Element nach einem Span. Mit dem &gt; Zeichen wird deutlich gemacht das es sich direkt im Listenelement befinden muss, also nicht das Span im A-Element (das wäre <em>li&gt;a&gt;span</em>).<br />
<strong>show()</strong> zeigt das Element an. Um ein bisschen anzugeben, oder den Designer zu erfreuen, könnte man auch <em>fadeIn()</em> benutzen.</p>
<p>Die Funktion bei Mouseout sieht, bis auf die letzte Funktion, genau so aus.</p>
<h2>Der aktive Menüpunkt</h2>
<p>Wenn das verwendete CMS dem Link die Klase <em>active</em> zuweist wenn sie angezeigt wird, dann ist es ein schöner Effekt, diese Klasse schon vor dem Neuladen  der Seite zuzuweisen: <pre>$(".menu a").click(function() {
&nbsp;&nbsp;$(this).addClass("active");
});</pre>Jetzt gibt es zwei aktive Menüpunkt, außerdem hat der angeklickte Menüpunk eine hässliche Umrandung.<pre>$(".menu a").click(function() {
&nbsp;&nbsp;$(".menu a.active").removeClass("active");
&nbsp;&nbsp;$(this).addClass("active").blur();
});</pre>Die erste Zeile (innerhalb der Click-Function) entfernt die Klasse vom aktuellen Menüpunkt. Anschließend wird dem anklickten Punkt die Klasse zugewiesen und mit der Funktion blur() der Rahmen entfernt.</p>
<h2>Fazit</h2>
<p>Das war ein kleiner Ausblick in das jQuery Universum. Eigentlich wollte ich noch viel mehr schreiben, aber das ging schon länger als geplant. Deshalb mache ich lieber Schluss, freue mich auf Fragen und empfehle jedem Webentwickler sich mit jQuery auseinander zu setzen. Es macht Spaß und hier kommt bald die nächste Anleitung!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/24/menu-tutorial-fur-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Asynchrone Datenübertragung zwischen TYPO3 und jQuery</title>
		<link>http://www.interaktionsdesigner.de/2009/01/04/asynchrone-datenubertragung-zwischen-typo3-und-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2009/01/04/asynchrone-datenubertragung-zwischen-typo3-und-jquery/#comments</comments>
		<pubDate>Sun, 04 Jan 2009 07:00:02 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=153</guid>
		<description><![CDATA[Nach dem ich mal wieder über den Appell an Webentwickler gestolpert bin, beginne ich meinen ersten zweiten Eintrag dieses Jahres mit einem tollen Thema welches ich zwischen den Jahren entdeckt habe: Die effektive Kommunikation zwischen TYPO3 und jQuery dank Ajax. Möglich macht das die Funktionalität der eID seit TYPO3 Version 4 und die geniale Handhabung [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-84 alignright" title="TYPO3 Logo" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/09/logo_save-area_01.jpg" alt="TYPO3 Entwicklung und Liebe" width="334" height="141" /></p>
<p>Nach dem ich mal wieder über den <a title="Appell an Webentwickler" href="http://coderesponsibly.org/de/" target="_blank">Appell an Webentwickler</a> gestolpert bin, beginne ich meinen <span style="text-decoration: line-through;">ersten</span> zweiten Eintrag dieses Jahres mit einem tollen Thema welches ich zwischen den Jahren entdeckt habe: Die <strong>effektive Kommunikation zwischen TYPO3 und jQuery</strong> dank <strong>Ajax</strong>.</p>
<p>Möglich macht das die Funktionalität der <strong>eID</strong> seit <strong>TYPO3 Version 4</strong> und die geniale Handhabung vom Lieblingsframework mit <strong>JSON</strong>. Eingesetzt hab ich es in einer tollen, neuen Extension die <a title="Wir sind 5andfriends.com" href="http://www.5andfriends.com" target="_blank">wir</a> entwickelt haben und die hoffentlich bald das Licht der Welt erblicken wird. Das wird dann gesondert gefeiert.<br />
<span id="more-153"></span></p>
<h2>Um was geht es?</h2>
<p>Die Eingaben eines Benutzers werden asynchron, d.h. ohne die Seite neuzuladen, an den Server übergeben. Der verarbeitet sie und liefert ein Ergebnis zurück, welches von <strong>jQuery</strong> verarbeitet und dargestellt wird.</p>
<p>Gebraucht wird diese Technik um zum Beispiel registrierte Benutzer anzuzeigen. Ähnliches habe ich schon beschrieben im Beitrag über das <a title="Vorheriger Post: Seiten nachladen" href="http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/" target="_blank">nachladen kompletter Seiteninhalte</a>. Dort wurde ein neuer <em>Seitentyp</em> angelegt. Das hat allerdings den Nachteil das die ganze Seite gerendert werden muss. Wir können schon wesentlich früher den Renderingprozess abbrechen und zügig ein Ergebnis bekommen.</p>
<h2>Vorbereitungen mit TYPO3</h2>
<p>Als erstes bereiten wir TYPO3 darauf vor und erstellen eine <strong>neue Extension</strong> mit dem Kickstarter. Ich habe ein <strong>Frontend Plugin</strong> erstellt und die üblichen Spracheinstellungen gewählt. Was man will ist also schnell zusammen geklickt.</p>
<p>Und jetzt wirds spannend: In der <em>ext_localconf.php</em> registrieren wir die <em>eID</em> (das e steht für Extension):</p>
<pre><code class="php">$TYPO3_CONF_VARS['FE']['eID_include']['MEINE_eID'] = 'EXT:kiwi_database/pi1/MEINE_eId.php';</code></pre>
<p>Es geht um das Frontend, eine neue<em> eID</em> wird eingebunden, für die eben erstellte Erweiterung. MEINE_eID ist durch einen guten Namen zu ersetzen (Extensionkey vielleicht).<br />
Im Wert der Variable ist der Pfad zum Script angegeben welches benutzt wird. EXT: zeigt auf den Ordner in dem die Extensions gespeichert sind, dann weiter zu unserer Erweiterung und zur speziellen Datei.</p>
<p>Ist <em>diese Datei</em> angelegt, einfach mal ein <strong>&lt;? echo "Hallo Welt"; ?&gt;</strong> darin speichern und zum Testen aufrufen, über den neuen Parameter eID: www.mein-typo3-projekt.de/index.php?<strong>eID=MEINE_eID</strong>. Wenn das auf eine weiße (super schnelle) Seite weiterleitet auf dem die Welt begrüßt wird, hat alles geklappt.</p>
<p>Wenn nicht, dann lohnt sich ein Blick ins<strong> Error Log</strong> von PHP und einfach weiter probieren (viel Glück).</p>
<p>Drei Dinge sind für die Datei <em>MEINE_eId.php</em> wichtig:</p>
<h3>1. Sicherheit</h3>
<pre>if (!defined ('PATH_typo3conf')) die ('Could not access this script directly!');</pre><br />
Mit dieser Zeile wird der direkte Aufruf der Datei verhindert. Sicher ist sicher.</p>
<h3>2. Datenbankzugriff</h3>
<p><pre>$feUserObj = tslib_eidtools::initFeUser(); // Initialize FE user object
tslib_eidtools::connectDB(); //Connect to database</pre><br />
Mit diesen zwei Befehlen steht die <strong>Datenbankverbindung</strong> wir gewohnt im globalen Array <strong>$GLOBALS["TYPO3_DB"];</strong> zur Verfügung. Es ist sehr einfach zu testen ob es funktioniert hat:<br />
<pre>echo "&lt;pre&gt;", print_r($GLOBALS["TYPO3_DB"]), "&lt;/pre&gt;";</pre><br />
Diese Zeile gibt nicht nur aus, ob eine Verbindung besteht, sondern auch den zuletzt ausgeführten MySQL Query. Sehr praktisch <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>3. Die eigene Extension</h3>
<p>Und damit kommen wir zu einer Einschränkungen. Es gibt <strong>kein cObj</strong>, da keine Seite aufgebaut wurde. Man kann zwar, ähnlich der Datenbank eins erstellen, aber das ist nicht nur kompliziert sondern hebt den Grund der Extension auf, da dann wieder eine komplette Seite gerendert wird. Das zur Folge das es nicht möglich ist die Benutzereinstellungen im Typoscript abzufragen. Ich empfehle die Auslagerung in die <em>localconf.php</em>.<br />
<pre>require_once('typo3conf/ext/meine_ext/pi1/class.tx_meineext_pi1.php');
$obj = t3lib_div::makeInstance("tx_meineext_pi1");</pre><br />
Die erste Zeile bindet die passende Datei ein, die zweite erschafft eine <strong>neue Instanz der eigenen Extension</strong>.</p>
<h2>Langsam Richtung JSON</h2>
<p>In der Extension wird jetzt abgefragt, was abgefragt werden muss. Zugriff auf in der URL übergebenen Parameter erhählt man z.B. über <strong>$GLOBALS["_GET"]["PARAMETER_NAME"]</strong>.</p>
<p>Am Ende sollte ein <strong>Array</strong> zur Verfügung stehen, welches alle Daten beinhaltet. Das wird in JSON umgewandelt:<br />
<pre>$response = $obj-&gt;getAnswer($GLOBALS["_GET"]);
echo json_encode($response);</pre>
<h2>Fertig, auf zum Frontend</h2>
<pre>page.includeJS.file1 = fileadmin/template/js/jQuery.js
page.includeJS.file2 = fileadmin/template/js/jquery.meineext.js</pre><br />
Interessant ist die <strong>zweite Datei</strong>. Wie gewohnt wird alles in den jQuery-Aufruf verpackt, der wartet bis das DOM geladen ist. Wie ein HTML Formular aussieht weiß vermutlich jeder. Nehmen wir an das Form-Tag trägt die <strong>ID</strong> <strong>assi</strong> (für asynchron) und beinhaltet genau <strong>ein Textfeld</strong> für die Eingabe. Das Javascript muss das Abschicken des Formulars <em>abfangen</em>, <em>versenden</em>, die Antwort als JSON Objekt <em>verarbeiten</em> und <em>anzeigen</em>. Klingt kompliziert? Aber nicht mit <strong>jQuery</strong>:</p>
<pre><code class="javascript">$(document).ready(function() {
	// Das Abschicken des Formulars verhindern
	$("#assi").submit(function() {

		//Ajaxabfrage stellen
		$.ajax({
			url: "index.php",		// Achtung mit RealURL!
			type: "GET",			// Daten per GET verschicken
			data: {
				eID: "MEINE_eID",	// die erstellte eID
				input: $("#assi input[type=text]")	// Benutzereingabe
			},
			dataType: "json",		// das gibts zurück

			// Es hat funktioniert?
			success: function(response) {
				// Code der ausgeführt wenns geklappt hat
				// !! Wesentliches Ding !!
			},

			// Schade, es war ein Fehler
			error: function(error) {
				alert("Sorry, hat nicht funktioniert");
			}
		});
</code><code class="javascript">
</code><code class="javascript">		//Damit das Formular nicht doch noch abgeschickt wird
</code><code class="javascript">		return false;</code>
<code class="javascript">	});
});</code></pre>
<p>Ich mag jQuery Code! Nach einiger Zeit hat man sich an die wilden Klammern gewöhnt und kann nicht mehr damit aufhören. Die Kommentare erläutern die einzelnen Dinge, oder <a title="Offizielle jQuery Dokumentation zu $.ajax" href="http://docs.jquery.com/Ajax/jQuery.ajax#options" target="_blank">die offizielle Doku</a>, wir wenden uns lieber dem <strong>wesentlichen Ding</strong> zu!</p>
<h2>Verarbeitung von JSON Objekten zu HTML mit jQuery</h2>
<p>Damit die Funktionen besser nachvollzogen werden können, ein Beispiel: So sieht die Funktion <em>getAnswer()</em> vereinfacht aus:</p>
<pre><code class="php">function getAnswer() {
	$a = Array(
		0 =&gt; Array("name" =&gt; "paul", "like" =&gt; "Webstandards"),
		1 =&gt; Array("name" =&gt; "ramon", "like" =&gt; "Bier"),
		2 =&gt; Array("name" =&gt; "max", "like" =&gt; "Sport")
	);
	return $a;
}</code></pre>
<p>Das wird als JSON Objekt sowas:<br />
<pre>[{"name":"paul","like":"Webstandards"},{"name":"ramon","like":"Bier"},{"name":"max","like":"Sport"}]</pre>
<p>Im wesentlichen Teil der jQuery Ajaxabfrage steht dieser String jetzt als Objekt zur Verfügung. Testen lässt sich das über die <strong>Firebug Konsole</strong> mit <em>console.log(response)</em>. Das und alles folgende spielt sich in der Funktion <strong>success(response)</strong> ab!</p>
<p>Jedes Array verfügt über die Eigenschaft <strong>length</strong>, es lässt sich also herausfinden wieviele Elemente vorhanden sind.<br />
<pre>if(response.length &gt; 0) {
}</pre><br />
Das <em>else</em> überlasse ich mal jedem selbst, kommen wir zur Superfunktion <strong>$.each()</strong>. Diese erwartet zwei <em>Parameter</em>: Das zu untersuchende Objekt (<strong>response</strong>) und eine <strong>Funktion</strong> die auf jede Zeile angewendet werden soll.</p>
<p>Angenommen es gibt auf der Seite eine Liste (&lt;ul&gt;) mit der <strong>ID answer,</strong> dann wird diese mit neuen Listenelementen versorgt:</p>
<pre><code class="javascript">var new_content = "";
$.each(response, function(i, row) {
	new_content+= "&lt;li&gt;&lt;strong&gt;"+row.name+"&lt;/strong&gt; mag "+row.like+"!&lt;/li&gt;";
});
$("#answer").html(new_content);</code></pre>
<p>Die Funktion, welche auf jede Zeile angewendet wird, erwartet zwei <em>Parameter</em>: <strong>i</strong> ist der Indikator welcher die <strong>aktuelle Position</strong> beinhaltet, <strong>row</strong> ist das <strong>aktuelle Objekt</strong>. Die Schlüssel aus dem PHP Array sind hier die Namen der Eigenschaften, herrlich oder?</p>
<h2>Fertig!</h2>
<p>Um die <em>Besucher ohne JavaScript</em> nicht außen vor zu lassen muss noch sichergestellt werden, dass die Extension bei "normal" erhalten der Daten die gleiche Ausgabe erzeugt. Das dürfte bekannt sein?!</p>
<p>Um sich den Stress mit <strong>einem Template</strong> zu sparen gibt es dann <span style="text-decoration: line-through;">in ein paar Tagen</span> irgendwann meine <strong>neue Extension</strong>! Bis dahin wünsche ich <strong>erfolgreiches Programmieren in 09</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/04/asynchrone-datenubertragung-zwischen-typo3-und-jquery/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>TYPO3 Seiten dynamisch nachladen mit jQuery</title>
		<link>http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 09:10:21 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=129</guid>
		<description><![CDATA[Jetzt kommt ein herrlicher Ajaxeffekt: Beim Klick auf einen Menüpunkt wird der Inhalt sanft ausgeblendet, die aufzurufende Seite wird asynchron vom Server geladen und dem User sanft wieder eingeblendet. Herrlich, oder? Das ist alles kein Problem mit TYPO3 und jQuery. Undzwar mit Hausmitteln, ohne ein einziges Plugin. Eine Demo gibt es auf meiner privaten Seite [...]]]></description>
			<content:encoded><![CDATA[<p>Jetzt kommt ein herrlicher Ajaxeffekt: Beim Klick auf einen Menüpunkt wird der Inhalt sanft ausgeblendet, die aufzurufende Seite wird asynchron vom Server geladen und dem User sanft wieder eingeblendet.</p>
<p>Herrlich, oder? Das ist alles kein Problem mit <strong>TYPO3</strong> und <strong>jQuery</strong>. Undzwar mit Hausmitteln, ohne ein einziges Plugin. Eine Demo gibt es auf meiner privaten Seite unter <a title="Lunow" href="http://www.paul-lunow.de" target="_blank">Paul-Lunow.de</a>, die ausführliche Anleitung hier im Blog.<br />
<span id="more-129"></span></p>
<h2>TYPO3 vorbereiten</h2>
<p>In dem Beitrag zum <a href="http://www.interaktionsdesigner.de/2008/10/30/ein-automatisches-infofenster-mit-typo3-und-jquery/">automatischen Infofenster für TYPO3</a> bin ich schon auf die Technik eingegangen: Wir erstellen einen neuen Seitentyp mit Typoscript um nur die Inhalte bei einem Aufruf zu bekommen.</p>
<pre><code class="typoscript">nurinhalt = PAGE
nurinhalt {
  typeNum = 101
}</code></pre>
<p>Die neue Seite heißt <strong>nurinhalt</strong> und bekommt die Nummer <strong>101</strong> zugewiesen. Man achte allerdings darauf keine doppelten Nummern zu vergeben!</p>
<pre><code class="typoscript">nurinhalt.10 &lt; page.10</code></pre>
<p>Mit dieser Anweisung wird der Inhalt von der normalen Seite in das neue Objekt kopiert.</p>
<pre><code class="typoscript">nurinhalt.10.template.file = fileadmin/template/index-nurinhalt.html</code></pre>
<p>Jetzt weisen wir der Seite ein neues Template zu. Hier kann man noch ein bisschen rumspielen und einige Extrasachen machen wenn man möchte, ist ein ganz normales Template.<br />
In meiner Version besteht es nur aus einer Zeile:</p>
<pre><code class="html">###INHALT###</code></pre>
<p>Mehr als den Inhalt will ich nicht haben.</p>
<p>Nach dem das Typoscript gespeichert, das neue Template erstellt und der Cache gelöscht ist, sollte man die Ausgabe einmal testen: <em>www.meine-typo3.de/praesenz/index.php?type=101</em>. Funktioniert? Gut.</p>
<p>Allerdings gibts noch eine Kleinigkeit: Die Seite kommt im kompletten HTML Gerüst daher. Zum Glück können wir das unterbinden:</p>
<pre><code class="typoscript">nurinhalt.config {
   #entfernt diverse header angaben
   disableAllHeaderCode = 1 

   #standard doctype deaktivieren
   disableCharsetHeader = 1

   #entfern die HTML Kommentare
   disablePrefixComment = 1
}</code></pre>
<h2>JavaScript vorbereiten</h2>
<p>Zurück zum "richtigen" Frontend. jQuery muss eingebunden werden und ich empfehle eine Datei Namens <strong>actions.js</strong>, für unser zu erstellendes Script. Das geschieht wieder im Standardseitentyp (bei mir stets <em>page</em>).</p>
<pre><code class="javascript">$(document).ready(function() {
	alert("Hallo!");
});</code></pre>
<p>Seite neuladen und wenn wir mit einem (fröhlichen) <em>Hallo!</em> begrüßt werden, hats funktioniert und wir ersetzen das <strong>Alert</strong> durch unser Script.</p>
<p>Im ersten Schritt muss der Klick auf ein Menüpunkt abgefangen werden und verhindert das die neue Seite geladen wird:</p>
<pre><code class="javascript">$("#menu a").click(function() {
  url = $(this).attr("href");
  alert("Geklickt auf "+url);
  return false;
});</code></pre>
<p>Drei Dinge passieren bei einem Klick auf einen Link im Objekt, welches die ID <em>menu</em> hat:</p>
<p>Der Variable <strong>url</strong> wird das Attribut <strong>href</strong> aus dem Link zugewiesen, zur späteren Verwendung (z.B. <em>index.php?id=123</em>).</p>
<p>Mit <strong>alert</strong> wird überprüft ob es funktioniert hat.</p>
<p><strong>return false;</strong> verhindert das der Browser die Seite lädt. Funktionierts?</p>
<p>Gut! Dann laden wir den Inhalt vom Server. Dafür wird eine neue Funktion erstellt, welche eine URL erwartet und diese lädt.</p>
<pre><code class="javascript">$(document).ready(function() {
	//Zeug von oben...
});

function getContent(url) {
	//Hier kommt der Ajaxaufruf
}</code></pre>
<p>Die neue Funktion <em>getContent()</em> ersetzt die Alertanweisung aus dem vorherigen Schritt. Der vollständige Aufruf sieht dann so aus:</p>
<pre><code class="javascript">$(document).ready(function() {
</code><code class="javascript">  </code><code class="javascript">$("#menu a").click(function() {
  </code><code class="javascript">  </code><code class="javascript">url = $(this).attr("href");
  </code><code class="javascript">  </code><code class="javascript">getContent(url);
 </code><code class="javascript">  </code><code class="javascript"> return false;
</code><code class="javascript">  </code><code class="javascript">});
});</code></pre>
<p>Dann mal <strong>Ajax</strong>. Ist genauso einfach:</p>
<pre><code class="javascript">$.ajax({
	//erweitere aufzurufenden Link
	url: url+"&amp;type=101",</code><code class="javascript">
</code><code class="javascript">	dataType: "html",</code>
<code class="javascript">	//wenn es geklappt hat
	success: function(html) {
		//Inhalt reinschreiben und anzeigen
		$("#content")
			.css("display", "none")
			.html(html)
			.fadeIn();
	}
});</code></pre>
<p>Das sieht doch schon wieder etwas professioneller aus. Der übergebenen <strong>url</strong> wird ein <em>&amp;type=101</em> angehängt um aus TYPO3 nur den Inhalt herauszuholen. Mit der Eigenschaft <strong>dataType</strong> zeigen wir an, dass eine HTML Seite als Rückgabewert erwartet wird.</p>
<p>Wenn das geklappt hat wird das Element mit der ID <em>content</em> ausgewählt. Dann folgt die geniale Verkettung von Funktionen:<br />
- Das Element wird <strong>versteckt</strong> (würde auch mit hide() funktionieren)<br />
- Das Element kriegt einen <strong>neuen Inhalt</strong> (den gerade geladenen)<br />
- Und wird <strong>eingeblendet</strong>!</p>
<p><strong>Fertig!</strong> Was für ein Erlebnis für den Benutzer. Und ohne JavaScript bleibt die Seite wie gewohnt nutzbar.</p>
<p><em>Ähmmm... nicht so ganz?</em> Dann auf zur Fehlersuche: Der wichtigste Ansatzpunkt ist natürlich <a href="http://www.interaktionsdesigner.de/2008/09/08/nichts-geht-mehr-ohne-firebug/">Firebug</a>. Man aktiviert die Konsole und kann sich alle asynchronen Datenbewegungen ansehen. Vielleicht wird eine nicht vorhandene URL aufgerufen, oder der Server versteht die Anfrage nicht. Dann muss man seine Ajaxabfrage verbessern. Mehr Informationen dazu liefert die <a href="http://docs.jquery.com/Ajax">offizielle jQuery Seite</a> (und noch dutzend <a href="http://www.google.de/search?hl=de&amp;q=jquery+ajax">andere</a>).</p>
<h2>Verbesserung 1: Sanftes Ausblenden</h2>
<p>Damit der alte Inhalt nicht einfach verschwindet, benutzen wir eine Callback Funktion von jQuery: <em>ajaxStart</em>.</p>
<pre><code class="javascript">$("#content").ajaxStart(function() {
	$(this).fadeOut(function() {
		$(this).addClass("loading");
	});
});</code></pre>
<p>Diese Funktion wird aufgerufen wenn eine Ajaxabfrage gestartet wird, blendet den Inhalt aus und fügt die Klasse <strong>loading</strong> hinzu was aber eigentlich nichts bringt, denn das Element ist ja ausgeblendet (aber für Vollständigkeit).</p>
<h2>Verbesserung 2: Bookmarks und Vor- und Zurückknöpfe</h2>
<p>Beim dynamischen nachladen hat man das Problem das sich die Adresszeile nicht ändert, der Browser also nicht mitkriegt das eine neue Seite geladen wurde. Außerdem kann man keinen Link auf eine bestimmte Seite setzen.</p>
<p>Das müssen wir ändern! Dafür benutzen wir <strong>Anker</strong>, die sind von der URL durch eine Raute getrennt. Mit dem JavaScript Objekt <strong>location.hash</strong> können wir die schreiben und lesen.</p>
<p>Als erstes schreiben: In der <strong>Success Funktion</strong> vom Ajaxaufruf fügen wir eine Zeile hinzu.</p>
<pre><code class="javascript">location.hash = url;</code></pre>
<p>Damit kriegen wir dann folgende Adresse, nach dem ein neuer Inhalt geladen wurde:</p>
<p><em>www.meine-typo3.de/praesenz/index.php?id=123#index.php?id=321</em></p>
<p>Und diese Angabe müssen wir beim laden der Seite auch wieder abfragen:</p>
<pre><code class="javascript">if(location.hash) {
	x = location.hash;
	getContent(x.slice(1));
}</code></pre>
<p>Ist ein Anker vorhanden, wird er der Variable <strong>x</strong> zugewiesen. Danach rufen wir unsere schon vorbereitete Funktion <em>getContent</em> auf und der Inhalt wird geladen!</p>
<p>Mit der Funktion<em> slice(1)</em> wird das erste Zeichen herausgeschnitten (bzw. alles andere), denn die Raute würde unser Script verwirren.</p>
<h2>Verbesserung 3: Verwendung von RealURL</h2>
<p>Ja, auch das ist möglich und macht die Seite noch viel schöner. Der erste Schritt dafür ist den neuen PageType über <strong>RealURL</strong> ansprechbar zu machen. Ich denke da an</p>
<p><em>www.meine-typo3.de/praesenz/start/ajax.html</em></p>
<p>Mit der <strong>Version 2.5</strong> ist es (endlich) ein Kinderspiel: Die Datei<strong> localconf.php</strong> wird um ein paar Zeilen erweitert.</p>
<pre><code class="php">$TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] = array(
	'pagePath' =&gt; array (
		'type' =&gt; 'user',
		'userFunc' =&gt; 'EXT:realurl/class.tx_realurl_advanced.php:&amp;tx_realurl_advanced-&gt;main',
		'spaceCharacter' =&gt; '-',
		'expireDays' =&gt; 3,
		'rootpage_id' =&gt; '1',
	),
	'fileName' =&gt; array (
		'defaultToHTMLsuffixOnPrev' =&gt; 1,
		'index' =&gt; array(
			'ajax.html' =&gt; array(
				'keyValues' =&gt; array ('type' =&gt; 101)
			),
		),
	),
);</code></pre>
<p>Anschließend sind noch ein paar Dinge im JavaScript zu verändern. Weil ich langsam genug vom Schreiben habe, kommt jetzt das <strong>komplette Script</strong> mit einigen erklärenden Kommentaren.</p>
<pre><code class="javascript">$(document).ready(function() {
	//Auf den ggf. übermittelten Anker reagieren
	if(location.hash) {
		x = location.hash;
		getContent(x.slice(1)+".html");
	}

	//Links per Ajax nachladen
	//$("a:not([href^='http://'])").click(function() {
	$("#menu a").click(function() {
		url = $(this).attr("href");
		getContent(url);
		$(this).blur();
		return false;
	});

	//Informieren das etwas passiert
	$("#content").ajaxStart(function() {
		$(this).fadeOut(function() {
			$(this)
				.text("")
				.addClass("loading")
				.fadeIn();
		});
	});

});

/*
 *	Holt den Inhalt vom Server
 */
function getContent(url) {
	$.ajax({
	//erweitere aufzurufenden Link
	url: url.replace(/\.html/, "/ajax.html"),
	//wenn es geklappt hat
	success: function(html) {
		//Inhalt reinschreiben und anzeigen
		$("#content")
			.removeClass("loading")
			.css("display", "none")
			.html(html)
			.fadeIn();
		//Adresszeile aktualisieren
		location.hash = url.replace(/\.html/, "");
	}
	});
}</code></pre>
<h2>Fazit</h2>
<p><strong>jQuery</strong> und <strong>TYPO3</strong> bieten mal wieder alles an was man sich wünschen kann. Eine <a title="Lunow" href="http://www.paul-lunow.de">funktionierende Demo</a> befindet sich auf meiner Seite.<br />
Über Kommentare und Verbesserungsvorschläge würde ich mich sehr freuen.</p>
<p>Bis dahin frohes Programmieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/12/12/typo3-seiten-dynamisch-nachladen-mit-jquery/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Verkettete Funktionen und Checkboxen mit jQuery</title>
		<link>http://www.interaktionsdesigner.de/2008/11/28/verkettete-funktionen-und-checkboxen-mit-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2008/11/28/verkettete-funktionen-und-checkboxen-mit-jquery/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 15:51:04 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=128</guid>
		<description><![CDATA[Endlich konnte ich mich mal wieder lange und intensiv mit jQuery auseinander setzen. Es ging um ein Formular welches auf verschiedene Angaben verschieden reagieren sollte. D.h. wenn man auswählt das man Nr 1 ist, gibt es im folgenden andere Pflichtfelder als wenn man Nr 2 wäre, usw. Dabei konnte ich die ganze Zeit lächeln weil [...]]]></description>
			<content:encoded><![CDATA[<p>Endlich konnte ich mich mal wieder lange und intensiv mit jQuery auseinander setzen. Es ging um ein Formular welches auf verschiedene Angaben verschieden reagieren sollte. D.h. wenn man auswählt das man Nr 1 ist, gibt es im folgenden andere Pflichtfelder als wenn man Nr 2 wäre, usw.</p>
<p>Dabei konnte ich die ganze Zeit lächeln weil es mit jQuery <strong>so viel Spaß</strong> macht zu arbeiten. Und das will ich natürlich niemandem vorenthalten. Eine einzige Zeile reicht aus um eine ganze Reihe Aktionen für alle Browser (<em>auch den IE6</em>) auszuführen. Man kann sehr einfach abfragen ob Checkboxen angeklickt sind oder nicht.</p>
<p>Außerdem habe ich eine tolle Funktion entdeckt um zu verhindern das auffahrende Elemente außerhalb des sichtbaren Bereichs liegen. Viel Spaß damit!<br />
<span id="more-128"></span></p>
<h2>Verkette Funktionen nutzen</h2>
<p>Um unaufdringliches JavaScript zu schreiben ist es wichtig die Eventhandler erst mit der Laufzeit des Scripts den Elemente zuzuweisen damit nicht JavaScript-fähige Betrachter dadurch nicht verwirrt werden.</p>
<p>Es gibt also ein Formular welches ohne JavaScript funktioniert und mit JavaScript noch besser wird. Hier ein vereinfachter HTML Aufbau:</p>
<pre><code class="html">&lt;form&gt;
	&lt;fieldset&gt;
		&lt;label for="auswahl"&gt;Auswahl&lt;/label&gt;
		&lt;select name="auswahl" id="auswahl"&gt;
			&lt;option&gt;Bitte auswählen...&lt;/option&gt;
			&lt;option value=1&gt;Nr 1&lt;/option&gt;
			&lt;option value=2&gt;Nr 2&lt;/option&gt;
		&lt;/select&gt;
	&lt;/fieldset&gt;

	&lt;fieldset class="step2"&gt;
		&lt;label for="name"&gt;Name&lt;/label&gt;
		&lt;input type="text" name="name" id="name"&gt;

		&lt;label for="stadt"&gt;Stadt&lt;/label&gt;
		&lt;input type="text" name="stadt" id="stadt"&gt;

		&lt;label for="cool"&gt;
			&lt;input type="checkbox" name="cool" id="cool" value="true"&gt; Ich kann jQuery
		&lt;/label&gt;
	&lt;/fieldset&gt;
	&lt;input type="submit" value="Eintragen" class="submit"&gt;
&lt;/form&gt;</code></pre>
<p>Die Anforderung ist, nur wenn der Benutzer <em>Nr 2</em> auswählt soll er seinen Namen und die Stadt angeben. Nutzer ohne JavaScript können alles ausfüllen.<br />
Und jetzt kommt das magische jQuery ins Spiel:</p>
<pre><code class="javascript">$(document).ready(function() {
</code><code class="html">	</code><code class="javascript">$("form").
</code><code class="html">	</code><code class="html">	</code><code class="javascript">.find(".step2").hide().end()
</code><code class="html">	</code><code class="html">	</code><code class="javascript">.find("#auswahl").change(function() { step2($(this).val(); ) }).end()
</code><code class="html">	</code><code class="html">	</code><code class="javascript">.find(":input:first").focus().end()
</code><code class="html">	</code><code class="html">	</code><code class="javascript">.submit(function() { step3(); return false; });
});</code></pre>
<p>Ist das nicht schön? Was ist hier passiert? Grundlegend selektieren wir mit <strong>$("form")</strong> das komplette Formular und alle enthaltenen Elemente. Die Funktion<strong> find()</strong> sucht aus diesem Stapel die gewünschten Elemente heraus auf welche die folgenden Funktionen angewendet werden.<br />
Mit <strong>end()</strong> am Ende jeder Zeile wird diese Auswahl wieder aufgehoben, im Stapel befinden sich jetzt wieder alle Elemente.</p>
<p>In der <strong>ersten Zeile</strong> wird das zweite Fieldset ausgeblendet, bzw. alles was sich im Formular befindet und die Klasse <em>.step2</em> hat.<br />
<strong>Zeile Zwei</strong> legt einen Eventhandler auf die Selectbox mit der ID <em>auswahl</em>. Was passiert habe ich der besseren Übersicht in eine andere Funktion ausgelagert.<br />
<strong>Zeile drei</strong> ist richtig cool. Mit dem Doppelpunkt werden Psydoklassen eingeleitet. <em>:input</em> steht für sämtliche Eingabefelder und <em>:first</em> für das erste Element. Wir selektieren also das erste Eingabefeld im Formular und geben diesem den Fokus. Aber vorsicht, auch Eingabefelder von Typ <em>hidden</em> fallen hier runter. Daran muss man denken.<br />
<strong>Anschließend</strong> wird dem Formular noch ein Eventhandler zugewiesen der das Abschicken auffängt. Hier ist das <em>return false;</em> wichtig damit das Formular nicht wirklich abgeschickt wird.</p>
<p>Herrlich, oder?</p>
<h2>Der richtige Umgang mit Checkboxen</h2>
<p>Wenn man auf die Checkbox klickt soll was passieren. Mein erster Gedanke war einen Eventhandler auf die Checkbox zu legen: <em>change()</em>. Verändert sie sich, soll eine Aktion ausgeführt werden. Funktioniert so aber nur halb im Internet Explorer, weil der Event erst ausgelöst wird wenn sich der Fokus nicht mehr im Element befindet.<br />
<strong>Lösung</strong>: nicht change() benutzen sondern <strong>click()</strong>. Das war einfach.</p>
<p>Eine Funktion wird aufgerufen, allerdings weiß man nicht ob die Box nun angehakt ist oder nicht. Also frage ich einfach mit <em>$(this).val() </em>den Inhalt ab, aber denkste: der ist immer gleich!<br />
<strong>Lösung</strong>: Wir bedienen uns der Psydoklassen. Das geniale jQuery bringt zum einen die Psydoklasse <em>:checked</em> mit, zum anderen die Funktion<em> is()</em>. Das könnte man doch super kombinieren, oder?</p>
<pre><code class="javascript">$("#cool").click(function() {
</code><code class="html">	</code><code class="javascript">if($(this).is(":checked"))
</code><code class="html">	</code><code class="html">	</code><code class="javascript">//Ist angehakt - mach was
</code><code class="html">	</code><code class="javascript">else
</code><code class="html">	</code><code class="html">	</code><code class="javascript">//Ist nicht angehakt - machs wieder rückgängig (bitte)</code>
<code class="javascript">});</code></pre>
<p>Firefox machts, aber der Internet Explorer hält den abgefragen Ausdruck immer für wahr (leichtgläubig). Glücklicherweise ist der <em>Workaround</em> einfach:</p>
<pre><code class="javascript">if($(this).is(":checked") == "true")</code></pre>
<p>Und schon macht der IE auch mit. Danke sehr!</p>
<h2>Abfragen in den Selektoren</h2>
<p>Eine Kleinigkeit war noch: Der Kunde wollte je nach Auswahl eine andere Beschreibung für eins der Felder. Kein Problem, da mit jQuery jedes Attribut in den Selektoren abgefragt werden kann:</p>
<pre><code class="javascript">if($("#einfeld").val() == "bla")) {
</code><code class="html">	</code><code class="javascript">$("label[for=anderesfeld]").text("Andere Bezeichnung");
}
else {
</code><code class="html">	</code><code class="javascript">$("label[for=anderesfeld]").text("Diese Bezeichnung");
}</code></pre>
<h2>Automatisch scrollen</h2>
<p>Okay, <em>fieldset.step2</em> soll sich ausrollen, wenn die richtige Option gewählt ist. Das Problem: auf kleinen Monitoren ist, dass es sich zwar schön ausrollt, aber der Benutzer kriegt davon nichts mit, weil es außerhalb des sichtbaren Bereichs liegt.</p>
<p>Aber es gibt nichts was mit jQuery nicht funktionieren würde. <strong>Die Lösung:</strong> Jedes Objekt besitzt eine Funktion<strong> scrollIntoView()</strong>. Die rufen wir einfach auf wenns fertig ist.</p>
<pre><code class="javascript">function step2() {
</code><code class="html">	</code><code class="javascript">$(".step2").slideDown(function() {
</code><code class="html">	</code><code class="html">	</code><code class="javascript">$(this)[0].scrollIntoView();
</code><code class="html">	</code><code class="javascript">});
}</code></pre>
<p>Zu beachten ist das <em>[0]</em>, denn die Funktion steht nur einem einzelnen Objekt zur Verfügung, nicht einem ganzen Stapel von Objekten. Wenn man sich unsicher ist, einfach <em>console.log($(this));</em> und solange rumklicken bis man die Funktion gefunden hat (im Firebug).</p>
<p>Da im Fieldset lauter Eingabefelder vorhanden sind, können wir die Zeile sogar noch ein bisschen schöner machen:</p>
<pre><code class="javascript">$(this).find(":input:first").focus()[0].scrollIntoView();</code></pre>
<p>Geht es noch effektiver?!?!?! Ich glaube kaum. Und jetzt lächelnd wieder an die Arbeit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/11/28/verkettete-funktionen-und-checkboxen-mit-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Meine erste Webseite, Teil 4</title>
		<link>http://www.interaktionsdesigner.de/2008/11/20/meine-erste-webseite-teil-4/</link>
		<comments>http://www.interaktionsdesigner.de/2008/11/20/meine-erste-webseite-teil-4/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 19:29:06 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=123</guid>
		<description><![CDATA[Jetzt steht schon eine richtige Seite im Netz, es gibt ein Hauptmenü und man kann der ganzen Welt seine Meinung mitteilen. Herzlichen Glückwunsch! Du gehörst zu den ca. 3% "Creators", d.h. Personen die im Internet Inhalt bereitstellen. Aber purer Inhalt ist noch nicht alles. Die Seite soll besser werden und die Besucher sollen etwas geboten [...]]]></description>
			<content:encoded><![CDATA[<p>Jetzt steht schon eine richtige Seite im Netz, es gibt ein Hauptmenü und man kann der ganzen Welt seine Meinung mitteilen. Herzlichen Glückwunsch! Du gehörst zu den ca. 3% "Creators", d.h. Personen die im Internet Inhalt bereitstellen.</p>
<p>Aber purer Inhalt ist noch nicht alles. Die Seite soll besser werden und die Besucher sollen etwas geboten kriegen. Deshalb dreht sich dieser Artikel darum wie man eine Seite besser machen kann. Es gibt ein paar <strong>Tipps und Tricks</strong> und Anleitungen die sich im täglichen "Netzleben" bewährt haben.</p>
<p><span id="more-123"></span></p>
<h2>Mein neuer Freund Firebug</h2>
<p>Firebug ist eine Extension für unseren Lieblingsbrowser: den Firefox. Sie erlaubt es eine Seite zu untersuchen, den Quelltext zu entdecken und verknüpfte CSS Regeln anzuzeigen. Es ist auch möglich Regeln zu deaktivieren, zu verändern oder neue hinzuzufügen (und noch viel mehr, das kann ich hier aber nicht alles beschreiben).</p>
<p>Also: <a href="https://addons.mozilla.org/de/firefox/addon/1843" target="_blank">Firebug installieren</a>! Danach gibt es ein kleines Symbol rechts unten in der Statuszeile des Browsers. Ein Klick darauf öffnet das Fenster.<br />
<img class="alignnone size-full wp-image-124" title="Firebug für bessere Webseiten" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/11/firebug.png" alt="" width="500" height="100" /></p>
<p>Hier ist das nützlichste Tool das sog. <strong>Untersuchen</strong>. Ein Klick darauf und anschließend auf ein Element in der Webseite zeigt es an, den Pfad und auf der rechten Seite die verknüpften CSS Regeln. Ein sehr praktisches Tool um zu sehen wie andere Leute etwas hinbekommen haben.<br />
<img class="alignnone size-full wp-image-125" title="firebug2" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/11/firebug2.png" alt="" width="500" height="220" /></p>
<p>Es lohnt sich aufjedenfall mit diesem Ding rumzuspielen, ein optimales Tool um jede Menge zu lernen und auszuprobieren.</p>
<h2>Statische Seiten imitieren</h2>
<p>Ein tolles Programm bei der Webseitenerstellung ist <strong>mod_rewrite</strong>. Das ist ein Modul für den Apache Webserver. Mit dessen Hilfe ist es möglich die Adressen einer Seite zu verändern. Zur Zeit ist z.B. die Kontaktseite über folgende Adresse aufrufbar:</p>
<pre>http://www.domain.de/index.php?page=kontakt</pre>
<p>Aber es wäre viel schöner wenn es so aussieht:</p>
<pre>http://www.domain.de/kontakt/</pre>
<p>oder? Und genau dafür ist <strong>mod_rewrite</strong> gedacht. Wir machen aus dynamischen URLs statische. Dazu müssen wir eine neue Datei im <em>Rootverzeichnis</em> anlegen (dort wo die index.php liegt). Die neue Datei heißt <strong>.htaccess</strong>. Man beachte den führenden Punkt, das bedeutet die Datei ist versteckt. Im verwendeten FTP Programm muss man vielleicht noch angeben das versteckte Dateien angezeigt werden sollen.</p>
<p>Ist das geschafft, die neue Datei öffnen und folgende Zeilen hinein kopieren.</p>
<pre><code class="htaccess">RewriteEngine on
RewriteRule ^([a-z0-9_-]*)/?$ index.php?page=$1</code></pre>
<p>Folgendes passiert: in der ersten Zeile wird das Modul angeschaltet. Anschließend können soviele Regeln wie benötigt hinzugeschrieben werden.<br />
Regeln beginnen immer mit <strong>RewriteRule</strong>, einem regulären Ausdruck der auf die aufgerufene Adresse angewendet wird und einem Ergebnis welches angezeigt wird. Möchte man also <em>hallo</em> zu <em>hello</em> umwandeln genügt <strong>RewriteRule hallo hello</strong>.<br />
Aber so einfach machen wir es uns natürlich nicht! Mit der oben aufgeschriebenen Regel werden alle Aufrufe an die <em>index.php</em> weitergeleitet. Man kann auch Unterseiten unterstützen:</p>
<pre><code class="htaccess">RewriteRule ^([a-z0-9_-]*)/([a-z0-9_-]*)/?$ index.php?page=$1&amp;subpage=$2</code></pre>
<p>Damit wird der erste Teil in die Variable <strong>page</strong> geschrieben, der zweite in <strong>subpage</strong>. Wer bei Google nach Anleitungen und Informationen sucht wird jede Menge finden.</p>
<p>Um zu überprüfen was an PHP übergeben wird, kann man sich das <em>globale Array GET</em> ausgeben lassen:</p>
<pre><code class="php">&lt;?
  echo "&lt;pre&gt;", print_r($_GET), "&lt;/pre&gt;";
?&gt;</code></pre>
<p>Dabei sollte dann etwas in diese Richtung bei rauskommen:</p>
<pre><code class="php">Array
(
    [page] =&gt; fotos2
    [subpage] =&gt; bla
)
1</code></pre>
<p>Je nach dem was man aufgerufen hat.</p>
<h2>Einen absoluten Pfad definieren</h2>
<p>Wenn man eine externe CSS Datei eingebunden hat oder Bilder, wird man feststellen das diese mit aktiviertem URL Rewriting nicht mehr funktionieren. Das liegt daran, dass die HTML Seite jetzt "denkt" wir befänden uns in einem Ordner auf dem Webserver (http://www.domain.de/fotos/ sieht aus als wäre "fotos" ein Ordner).<br />
Um das zu verhindern müssen wir bei sämtlichen Resourcen die von externen Quellen eingebunden werden einen <strong>absoluten Pfad</strong> vergeben. Der beginnt immer mit <strong>http://</strong> und sollte nur einmal definiert werden, und das ganz am Anfang der <em>index.php</em>:</p>
<pre><code class="php">&lt;?
</code><code class="php">  </code><code class="php">define("PFAD", "http://www.domain.de/");
?&gt;</code></pre>
<p>Mit diesem PHP Befehl definieren wir eine <strong>Konstante PFAD</strong> die jetzt überall zur Verfügung steht. Es ist wichtig sich zu merken ob man einen Slash am Ende schreibt oder nicht <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Jetzt muss die Seite durchsucht werden und Links und externe Resourcen herausgefunden werden. Hier zwei Beispiele:</p>
<pre><code class="php">&lt;link rel="stylesheet" href="style.css"&gt;
&lt;a href="index.php?page=kontakt"&gt;Kontakt&lt;/a&gt;</code></pre>
<p>Beide Elemente sind <strong>relativ</strong> eingebunden (sie fangen nicht mit http:// an). Um die <strong>Konstante PFAD</strong> auszugeben bedienen wir uns der <strong>PHP Kurzschreibweise</strong>. Diese beginnt mit dem gewohnten PHP Tag &lt;?, gefogt vom einem Ist-Gleich-Zeichen =, dem Konstantennamen und einem schließenden Tag.</p>
<pre><code class="php">&lt;link rel="stylesheet" href="&lt;?=PFAD?&gt;style.css"&gt;
&lt;a href="&lt;?=PFAD?&gt;kontakt"&gt;Kontakt&lt;/a&gt;</code></pre>
<p>Damit wird die oben eingegebene Adresse einfach an der entsprechenden Stelle ausgegeben und schon sind alle Verknüpfungen <strong>absolut</strong>. Um zu testen ob es funktioniert, ändern und den Quelltext der Seite anschauen. Man beachte auch die geänderte Adresse vom Link (nur noch <em>kontakt</em> - cool, oder?).</p>
<p><em>Warum wird nicht überall einfach die Domain eingetragen?</em> In den ersten Teilen haben wir gelernt <strong>nichts doppelt zu schreiben</strong>. Und wenn jetzt überall http://www.domain.de steht, man dann aber feststellt, dass man domain.de ja mit der eigenen Adresse austauschen sollte, dann ärgert man sich über hunderte Stellen an der Änderungen vorgenommen werden müssen. Genauso wenn man eine neue Domain hat.<br />
Sehr viel besser also wenn man in der ersten Zeile seiner <em>index.php</em> einmal die Änderung vornimmt und schon ist es für den gesamten Webauftritt erledigt.</p>
<p>Also nicht vergessen: Bei allen Verknüpfungen diese Kurzschreibweise voranstellen!</p>
<h2>Hervorheben der aktuellen Seite</h2>
<p>Wir haben ja unser Mini CMS, d.h. es wird eigentlich immer die gleiche Seite aufgerufen und nur dynamisch neuer Inhalt eingebunden. Trotzdem müssen wir den geneigten Besucher darüber informieren auf welcher Seite er sich gerade befindet.<br />
Dafür bedienen wir uns wieder der Kurzschreibweise von PHP und fragen für jeden Link ab, ob er augerufen wurde. Ist dies der Fall fügen wir eine Klasse "<strong>aktiv</strong>" zum Link hinzu, über welche per CSS der Link entsprechend formatiert werden kann.</p>
<pre><code class="php">&lt;a href="&lt;?=PFAD?&gt;kontakt" class="&lt;?=$_GET["page"]=="kontakt" ? "aktiv" : ""?&gt;"&gt;Kontakt&lt;/a&gt;</code></pre>
<p>So, das sieht jetzt schon relativ kompliziert aus, aber man gewöhnt sich daran. Von Anfang an:<br />
<strong>&lt;?=</strong> ist die einleitende Kurzschreibweise für einen PHP Befehl.<br />
<strong>$_GET["page"]</strong> ist die Variable die wir im URL Rewriting angegeben haben und welche den Namen der aktuellen Seite beinhaltet.<br />
<strong>==</strong> ist ein Vergleichsoperator. Der verknüpft zwei Werte miteinander und gibt true (=wahr) zurück, wenn beide Werte gleich sind (das ist eine Wissenschaft für sich).<br />
<strong>"kontakt"</strong> ist der aktuelle Link und der Wert mit dem die Variable verglichen wird.<br />
<strong>?</strong> "fragt" ob der vorangegangene Ausdruck wahr ist. Ist dies der Fall wird der nächste Ausdruck zurück gegeben:<br />
<strong>"aktiv"</strong> ist der zurückgegebene Wert wenn die Variable den Inhalt kontakt hat.<br />
<strong>:</strong> kennzeichnet den alternativen Teil, d.h. wenn der Ausdruck nicht wahr ist.<br />
<strong>""</strong> ist einfach nur ein leerer Ausdruck, weil wenn die Seite nicht gerade aufgerufen wird, dann kriegt der Link auch keine Klasse zugewiesen.<br />
<strong>?&gt;</strong> beendet den PHP Befehl wieder.</p>
<p>In der CSS Datei wird dann in einer weiteren Regel das Aussehen des aktiven Links definiert.</p>
<pre><code class="css">a.aktiv {
  font-weight:bold;
  font-size:20px;
}</code></pre>
<p>In diesem Beispiel also fett und riesen groß.</p>
<h2>Besucher zählen</h2>
<p>Als Webmaster möchte man ja wissen wie viele Menschen sich auf der eigenen Seite herumtreiben. Dafür empfehle ich <a href="http://www.google.com/analytics/de-DE/" target="_blank">Google Analytics</a>. Es wird gemunkelt das das Ranking einer Seite verbessert wird wenn man Google Analytics einsetzt, aber wie dem auch sei, es ist ein wirklich gutes Programm mit vielen interessanten Möglichkeiten.</p>
<p><strong>Der erste Schritt</strong> ist ein Google Account anzulegen und diesen für Google Analytics zu aktivieren (bei der Datenkracke ist das alles leichter als es sich anhört).<br />
<strong>Wenn das geschafft ist</strong>, muss man ein neues Webseitenprofil anlegen mit der eigenen Domain (einfach den Anleitungen folgen).<br />
<strong>Abschließend</strong> gibt es einen JavaScript Code den man auf die eigene Seite, unmittelbar vor dem schließenden Body-Tag einfügt.<br />
<strong>Geschafft!</strong> Google braucht ein paar Stunden um die Seiten zu indizieren, aber dann wird gezählt.</p>
<p>Die Hilfe von GA ist gut gemacht und bietet viele, viele Informationen. Wer ein paar Minuten Zeit hat sollte da unbedingt einmal reingucken.</p>
<p><em>Das wars für heute.</em> Viel Spaß beim probieren und Webseite optimieren! Wenn noch etwas fehlt, dann hinterlass einen Kommentar, und vielleicht wird es in der nächsten Folge besprochen <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/11/20/meine-erste-webseite-teil-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

