<?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>Pauls Blog beschäftigt sich mit Webentwicklungsthemen, im Focus stehen jQuery, TYPO3, CSS und PHP.</description>
	<lastBuildDate>Sat, 05 Jun 2010 21:13:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 einen [...]]]></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><code class=''>if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {<br />
&nbsp;&nbsp;$ajax = true;<br />
}<br />
else {<br />
&nbsp;&nbsp;$ajax = false;<br />
}</code></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><code class=''>if(!$ajax) {<br />
&nbsp;&nbsp;get_header();<br />
}</code></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 Code. [...]]]></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><code class='php'>&lt;?=$welcome_msg?&gt;</code></pre>Diese Zeile, man könnte es schon fast als Tag bezeichnen und ist gleichbedeutend mit <pre><code class='php'>&lt;? echo $welcome_msg; ?&gt;</code></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><code class='php'>&lt;? if($user == "admin"): ?&gt;<br />
&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;<br />
&nbsp;&nbsp;&lt;div id="status"&gt;&lt;h1&gt;Projektstatus&lt;/h1&gt;&lt;/div&gt; &lt;!-- usw. usf. --&gt;<br />
&lt;? endif; ?&gt;</code></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><code class='php'>&lt;? if($user == "admin"): ?&gt;<br />
&nbsp;&nbsp;... viele Ausgaben ...<br />
&lt;? elseif($user == "redakteur"): ?&gt;<br />
&nbsp;&nbsp;--- andere Ausgaben ----<br />
&lt;? else: ?&gt;<br />
&nbsp;&nbsp;___ alternative Ausgaben ___<br />
&lt;? endif; ?&gt;</code></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><code class='php'>&lt;?=$owner == $user ? "meins" : "fremd"?&gt;</code></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><code class='php'>&lt;? if($owner == $user) {<br />
&nbsp;&nbsp;echo "meins";<br />
}<br />
else {<br />
&nbsp;&nbsp;echo "fremd";<br />
}</code></pre></p>
<p>Ein praktisches Beispiel wäre z.B. innerhalb einer Schleife: <pre><code class='php'>&lt;li class="&lt;?=$i%2 == 0 ? "even" : "odd"?&gt;"&gt;&lt;=$content?&gt;&lt;/li&gt;</code></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><code class='php'>&lt;? for($i = 0; $i &lt; 10; $i++): ?&gt;<br />
&nbsp;&nbsp;Zeile &lt;?=$i?&gt; von 10<br />
&lt;? endfor; ?&gt;</code></pre></p>
<p>hat die gleiche Syntax wie die <strong>Foreach-Schleife</strong>:<pre><code class='php'>&lt;? foreach($array as $key =&gt; $value): ?&gt;<br />
&nbsp;&nbsp;Array: &lt;?=$key?&gt; = &lt;?=$value?&gt;&lt;br&gt;<br />
&lt;? endforeach; ?&gt;</code></pre></p>
<p>Und die <strong>While-Schleife</strong> darf natürlich auch nicht fehlen:<pre><code class='php'>&lt;? while($row = mysql_fetch_object($hdl)): ?&gt;<br />
&nbsp;&nbsp;Zeile &lt;?=$row-&gt;uid?&gt; gehört &lt;?=$row-&gt;name?&gt;&lt;br&gt;<br />
&lt;? endwhile; ?&gt;</code></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>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/01/31/php-kurzschreibweisen/feed/</wfw:commentRss>
		<slash:comments>0</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 ja [...]]]></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><code class='php'>&lt;?<br />
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {<br />
&nbsp;&nbsp;[tab]echo "$i modulo 5 = ". ($i%5). "&lt;br&gt;";<br />
&nbsp;&nbsp;}<br />
?&gt;</code></pre></p>
<p>Wenn einem jetzt nicht auf Anhieb ein Anwendungsfall einfällt, dann sollte man sich überlegen was dieser Code tut:<pre><code class='php'>&lt;?<br />
&nbsp;&nbsp;$a = 0;<br />
&nbsp;&nbsp;$class = "";<br />
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {<br />
&nbsp;&nbsp;[tab]$a++;<br />
&nbsp;&nbsp;[tab]if($a &gt; 1)<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;$a = 0;<br />
&nbsp;&nbsp;[tab]$class = $a == 1 ? "even" : "odd";<br />
&nbsp;&nbsp;[tab]echo "$i modulo 5 = ". ($i%5). " ($class)&lt;br&gt;";<br />
&nbsp;&nbsp;}<br />
?&gt;</code></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><code class='php'>&lt;?<br />
&nbsp;&nbsp;$class = "";<br />
&nbsp;&nbsp;for($i = 0; $i &lt; 10; $i++) {<br />
&nbsp;&nbsp;[tab]$class = $i%2 ? "even" : "odd";<br />
&nbsp;&nbsp;[tab]echo "$i modulo 2 = ". ($i%2). " ($class)&lt;br&gt;";<br />
&nbsp;&nbsp;}<br />
?&gt;</code></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><code class='javascript'>$("ul li:even").addClass("even");</code></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><code class='javascript'>$("ul").find("li:even").addClass("zebra");</code></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>0</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><code class='html'>&lt;h1 id="wichtig"&gt;Es ist wichtig&lt;/h1&gt;<br />
&lt;p&gt;bla bla bla ...&lt;/p&gt;<br />
&lt;h1 id="unten"&gt;Weiter unten&lt;/h1&gt;<br />
&lt;p&gt;noch mehr bla bla ...&lt;/p&gt;</code></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><code class='html'>&lt;a href="#wichtig"&gt;Zur wichtigen Überschrift&lt;/a&gt;<br />
&lt;a href="#unten"&gt;Zur unteren Überschrift&lt;/a&gt;</code></pre>Wichtig und praktisch ist das im Zusammenhang mit einer weiteren Seite.<pre><code class='html'>&lt;a href="zweite-seite.html#irgendwo"&gt;Gehe nach irgendwo&lt;/a&gt;</code></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><code class='javascript'>jQuery(function($) {<br />
&nbsp;&nbsp;$(".menu a").click(function() {<br />
&nbsp;&nbsp;[tab]alert($(this).attr("hash"));<br />
&nbsp;&nbsp;[tab]return false;<br />
&nbsp;&nbsp;});<br />
});</code></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><code class='php'>&lt;?<br />
&nbsp;&nbsp;echo "&lt;pre&gt;", print_r($_REQUEST), "&lt;/pre&gt;";<br />
?&gt;</code></pre></p>
<p>Jetzt ohne viel Gerede <strong>die komplette Klickfunktion</strong>.<pre><code class='javascript'>$(".menu a").click(function() {<br />
&nbsp;&nbsp;$(".menu a.active").removeClass("active");<br />
&nbsp;&nbsp;$(this).addClass("active").blur();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;$.ajax({<br />
&nbsp;&nbsp;[tab]url: "remote.php",<br />
&nbsp;&nbsp;[tab]data: {gib_mir: $(this).attr("hash").substr(1)},<br />
&nbsp;&nbsp;[tab]type: "POST",<br />
&nbsp;&nbsp;[tab]dataType: "HTML",<br />
&nbsp;&nbsp;[tab]<br />
&nbsp;&nbsp;[tab]success: function(remote_html) {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;$("#response").hide().html(remote_html).fadeIn();<br />
&nbsp;&nbsp;[tab]},<br />
&nbsp;&nbsp;[tab]error: function() {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;alert("Mist verdammter, etwas hat nicht geklappt <img src='http://www.interaktionsdesigner.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ");<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;});<br />
});</code></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><code class='html'>Array<br />
(<br />
&nbsp;&nbsp;[gib_mir] =&gt; punkt4<br />
)<br />
1</code></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><code class='javascript'>$(location).attr("hash", $(this).attr("hash"));<br />
return false;</code></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><code class='javascript'>if($(location).attr("hash"))<br />
&nbsp;&nbsp;$("a[hash="+$(location).attr("hash")+"]").click();</code></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>7</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 Nutzer [...]]]></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><code class='html'>&lt;ul class="menu"&gt;<br />
&nbsp;&nbsp;&lt;li&gt;<br />
&nbsp;&nbsp;[tab]&lt;a href="#punkt1" class="active"&gt;&lt;span&gt;Punkt 1&lt;/span&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&lt;/li&gt;<br />
&nbsp;&nbsp;&lt;li&gt;<br />
&nbsp;&nbsp;[tab]&lt;a href="#punkt2"&gt;&lt;span&gt;Punkt 2&lt;/span&gt;&lt;/a&gt;<br />
&nbsp;&nbsp;&lt;/li&gt;<br />
&nbsp;&nbsp;&lt;li&gt;<br />
&nbsp;&nbsp;[tab]&lt;a href="#punkt3"&gt;Punkt 3&lt;/a&gt;<br />
&nbsp;&nbsp;&lt;/li&gt;<br />
&nbsp;&nbsp;&lt;li&gt;<br />
&nbsp;&nbsp;[tab]&lt;a href="#punkt4"&gt;Punkt 4&lt;/a&gt;<br />
&nbsp;&nbsp;[tab]&lt;span&gt;Ein Hinweistext!&lt;/span&gt;<br />
&nbsp;&nbsp;&lt;/li&gt;<br />
&lt;/ul&gt;</code></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><code class='html'>&lt;ul class="menu"&gt;<br />
&nbsp;&nbsp;###MAINMENU###<br />
&lt;/ul&gt;<br />
&lt;div id="content"&gt;<br />
&nbsp;&nbsp;###CONTENT###<br />
&lt;/div&gt;</code></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><code class='javascript'>jQuery(function($) {<br />
&nbsp;&nbsp;alert("Hallo Welt!");<br />
});</code></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><code class='javascript'>$(".menu li").hover(function() {<br />
&nbsp;&nbsp;$(this).addClass("hover");<br />
}, function() {<br />
&nbsp;&nbsp;$(this).removeClass("hover");<br />
});</code></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><code class='css'>li&gt;span {<br />
&nbsp;&nbsp;display:none;<br />
}<br />
li:hover&gt;span {<br />
&nbsp;&nbsp;display:inline;<br />
}</code></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><code class='javascript'>$("li&gt;span").hide();</code></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><code class='javascript'>$(this).addClass("hover").find("&gt;span").show();</code></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><code class='javascript'>$(".menu a").click(function() {<br />
&nbsp;&nbsp;$(this).addClass("active");<br />
});</code></pre>Jetzt gibt es zwei aktive Menüpunkt, außerdem hat der angeklickte Menüpunk eine hässliche Umrandung.<pre><code class='javascript'>$(".menu a").click(function() {<br />
&nbsp;&nbsp;$(".menu a.active").removeClass("active");<br />
&nbsp;&nbsp;$(this).addClass("active").blur();<br />
});</code></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 vom [...]]]></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><code class='php'>if (!defined ('PATH_typo3conf')) die ('Could not access this script directly!');</code></pre><br />
Mit dieser Zeile wird der direkte Aufruf der Datei verhindert. Sicher ist sicher.</p>
<h3>2. Datenbankzugriff</h3>
<p><pre><code class='php'>$feUserObj = tslib_eidtools::initFeUser(); // Initialize FE user object<br />
tslib_eidtools::connectDB(); //Connect to database</code></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><code class='php'>echo "&lt;pre&gt;", print_r($GLOBALS["TYPO3_DB"]), "&lt;/pre&gt;";</code></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><code class='php'>require_once('typo3conf/ext/meine_ext/pi1/class.tx_meineext_pi1.php');<br />
$obj = t3lib_div::makeInstance("tx_meineext_pi1");</code></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><code class='php'>$response = $obj-&gt;getAnswer($GLOBALS["_GET"]);<br />
echo json_encode($response);</code></pre>
<h2>Fertig, auf zum Frontend</h2>
<pre><code class='typoscript'>page.includeJS.file1 = fileadmin/template/js/jQuery.js<br />
page.includeJS.file2 = fileadmin/template/js/jquery.meineext.js</code></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><code class='json'>[{"name":"paul","like":"Webstandards"},{"name":"ramon","like":"Bier"},{"name":"max","like":"Sport"}]</code></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><code class='javascript'>if(response.length &gt; 0) {<br />
}</code></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 unter [...]]]></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>15</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 es [...]]]></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>1</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 kriegen. [...]]]></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>
		<item>
		<title>Meine erste Webseite, Teil 3</title>
		<link>http://www.interaktionsdesigner.de/2008/11/07/meine-erste-webseite-teil-3/</link>
		<comments>http://www.interaktionsdesigner.de/2008/11/07/meine-erste-webseite-teil-3/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 11:11:40 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=117</guid>
		<description><![CDATA[Du hast deinen eigenen Webserver oder ein Plätzchen im Internet gefunden und die ersten Grundlagen für deine Seite gelegt. Die wichtigsten Dateien sind erstellt und das Mini-CMS funktioniert wie erwartet. Du hast ein paar Inhalte im Ordner content/ liegen und kannst sie aufrufen.
Dann kann es ja losgehen mit der Aufteilung der Elemente und einen tieferen [...]]]></description>
			<content:encoded><![CDATA[<p>Du hast deinen eigenen Webserver oder ein Plätzchen im Internet gefunden und die ersten Grundlagen für deine Seite gelegt. Die wichtigsten Dateien sind erstellt und das Mini-CMS funktioniert wie erwartet. Du hast ein paar Inhalte im Ordner content/ liegen und kannst sie aufrufen.</p>
<p>Dann kann es ja losgehen mit der Aufteilung der Elemente und einen tieferen Einblick in CSS.<span id="more-117"></span></p>
<p><strong>Vorweg ein paar Links:</strong> Der wichtigste von allen ist nach wie vor <a title="SelfHTML" href="http://de.selfhtml.org" target="_blank">Selfhtml</a>. Auch in Fragen CSS findet man hier umfangreiche Anleitungen, Templates und eine Referenz. Außerdem empfehlenswert ist die Seite <a title="css4YOU" href="http://www.css4you.de/index.html">CSS4you</a> auf der man jede Menge Hilfe findet.</p>
<h2>HTML</h2>
<p>Wir begnügen uns aber erstmal mit einem ganz einfachen Seitenaufbau. Dem Klassiker:<br />
<img class="alignnone size-full wp-image-118" title="seitenaufteilung1" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/11/seitenaufteilung1.jpg" alt="" width="500" height="416" /></p>
<p>Das ist der klassische Aufbau einer Seite. Wir fangen an mit einer festen Breite und einem umschließenden Container um die Elemente aufzuteilen.</p>
<p>Bevor es richtig losgeht noch ein Hinweis: Wir wollen nichts doppelt schreiben und so wenig wie möglich! Daran muss man immer denken damit man sich nicht zu viel Arbeit macht und die eigene Seite so effektiv wie möglich bleibt. Warum? Je effektiver wir anfangen um so weniger Stress haben wir wenn später Änderungen vorgenommen werden sollen.</p>
<p>So sehen die Div-Container aus (blaue Linien und deren Ids):<br />
<img class="alignnone size-full wp-image-119" title="seitenaufteilung-container" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/11/seitenaufteilung-container.jpg" alt="" width="500" height="430" /></p>
<p><strong>Die erste Aufgabe</strong> besteht darin diese Container auf die eigene Webseite anzuwenden. Denke also darüber nach, welche Bereiche wohin gehören und los gehts!</p>
<p>Fertig? Sehr gut. Dann solltest du etwas in dieser Richtung haben:</p>
<pre><code class="html">&lt;div id="wrap"&gt;

&lt;!-- Kopfbereich --&gt;
&lt;div id="head"&gt;
  &lt;h1&gt;Paul Lunow&lt;/h1&gt;
&lt;/div&gt;

&lt;!-- Inhaltsbereich --&gt;
&lt;div id="content"&gt;
</code><code class="html">  </code><code class="html">&lt;p&gt;Hallo, das ist meine &lt;b&gt;erste&lt;/b&gt; Webseite!&lt;/p&gt;
</code><code class="html">  </code><code class="html">&lt;?
</code><code class="html">  </code><code class="html">$page = "content/start.php";
</code><code class="html">  </code><code class="html">if(is_file($page)) {
</code><code class="html">  </code><code class="html">  </code><code class="html">include($page);
</code><code class="html">  </code><code class="html">}
</code><code class="html">  </code><code class="html">else {
</code><code class="html">  </code><code class="html">  </code><code class="html">echo "Die Seite konnte leider nicht gefunden werden.";
</code><code class="html">  </code><code class="html">}
</code><code class="html">  </code><code class="html">?&gt;
&lt;/div&gt;

&lt;!-- Mein Hauptmenü --&gt;
&lt;div id="menu"&gt;
</code><code class="html">  </code><code class="html">&lt;ul&gt;
</code><code class="html">  </code><code class="html">  </code><code class="html">&lt;li&gt;&lt;a href="index.php"&gt;Startseite&lt;/a&gt;&lt;/li&gt;
</code><code class="html">  </code><code class="html">  </code><code class="html">&lt;li&gt;&lt;a href="index.php"&gt;Fotos&lt;/a&gt;&lt;/li&gt;
</code><code class="html">  </code><code class="html">  </code><code class="html">&lt;li&gt;&lt;a href="index.php"&gt;Texte&lt;/a&gt;&lt;/li&gt;
</code><code class="html">  </code><code class="html">&lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Fusszeile --&gt;
&lt;div id="footer"&gt;
</code><code class="html">  </code><code class="html">&lt;a href="#"&gt;Kontakt&lt;/a&gt; |
</code><code class="html">  </code><code class="html">&lt;a href="#"&gt;Impressum&lt;/a&gt;
&lt;/div&gt;

&lt;/div&gt;
</code></pre>
<p>Was sofort auffällt ist die Reihenfolge: sie spielt in unserem Beispiel keine Rolle. Im Idealfall jedenfalls. Und in der "echten Welt" vorallem für die Suchmaschinen. Je weiter oben ein Keyword im HTML Dokument steht, umso besser wird es von den Spidern gewertet. Aber dazu später mehr, wir kümmern uns jetzt um das CSS, Container für Container.</p>
<h2>CSS</h2>
<p>Am besten ist es jede Anweisung einzeln hinzuzufügen und zu untersuchen was passiert. Es bietet sich an den Editor und den Browser nebeneinander zu positionieren. Mit [CMD] + [TAB] (auf dem Mac) kann man schnell zwischen den Fenstern hin und her schalten ohne die Maus zu benutzen. [F5] lädt das Browserfenster neu. Los gehts!</p>
<p><em>Als erstes der umschließende Container (Wrap)</em>. Er hält alle Elemente zusammen und gibt dem ganzen eine Breite. Sagen wir mal 960 Pixel. Wir positionieren den Container relativ zur Seite. Das hat den Sinn das sich absolut positionierte Elemente an diesem orientieren.<br />
Um zu prüfen ob es funktioniert geben wir dem Wrap einen Rahmen von einem Pixel um sofort zu sehen ob es geklappt hat:</p>
<pre><code class="css">#wrap {
</code><code class="html">  </code><code class="css">position:relative;
</code><code class="html">  </code><code class="css">width:960px;
</code><code class="html">  </code><code class="css">border:1px solid black;
}</code></pre>
<p><em>Als nächstes der Kopf der Seite (Head).</em> Er wird absolut positioniert und soll über die gesamte Breite gehen und 120 Pixel hoch sein. Mit <strong>left</strong> und <strong>right</strong> werden die Abstände zum umfassenden Container angegeben. Graue Hintergrundfarbe um etwas zu sehen. Daraus resultiert folgendes CSS:</p>
<pre><code class="css">#head {
</code><code class="html">  </code><code class="css">position:absolute;
</code><code class="html">  </code><code class="css">left:0;
</code><code class="html">  </code><code class="css">right:0;
</code><code class="html">  </code><code class="css">width:100%;
</code><code class="html">  </code><code class="css">height:120px;
</code><code class="html">  </code><code class="css">background:silver;
}</code></pre>
<p><em>Jetzt der Inhalt.</em> Im Moment wird er noch verdeckt vom Kopf der darüber legt. Also braucht er Abstand nach oben und Abstand nach links, um Platz für das Hauptmenü zu schaffen. Damit der Footer auch noch Platz hat kriegt der Inhalt einen Abstand nach unten.</p>
<pre><code class="css">#content {
</code><code class="html">  </code><code class="css">margin-top:130px;
</code><code class="html">  </code><code class="css">margin-left:200px;
</code><code class="html">  </code><code class="css">margin-bottom:25px;
}</code></pre>
<p><em>Jetzt hängt das Hauptmenü noch ganz traurig unter dem Inhalt.</em> Das müssen wir unbedingt ändern. Das Menü wird absolut positioniert, an die linke Kante geheftet und von oben weg gerückt damit es nicht unter dem Kopfbereich verschwindet. Außerdem braucht es noch eine bestimmte Breite um nicht in den Inhalt hinein zu ragen.</p>
<pre><code class="css">#menu {
</code><code class="html">  </code><code class="css">position:absolute;
</code><code class="html">  </code><code class="css">top:130px;
</code><code class="html">  </code><code class="css">left:0;
</code><code class="html">  </code><code class="css">width:180px;
}</code></pre>
<p><em>Und zu guter Letzt noch der Fußbereich der Seite.</em> Er soll immer am unteren Rand kleben und bündig zum Inhalt sein. Also los:</p>
<pre><code class="css">#footer {
</code><code class="html">  </code><code class="css">position:absolute;
</code><code class="html">  </code><code class="css">bottom:0;
</code><code class="html">  </code><code class="css">left:200px;
</code><code class="html">  </code><code class="css">height:20px;
}</code></pre>
<p><strong>Fertig!</strong> Das wars schon mit der Verteilung der Elemente. Einfach oder?<br />
<img class="alignnone size-full wp-image-120" title="bild-2" src="http://www.interaktionsdesigner.de/wp-content/uploads/2008/11/bild-2.png" alt="" width="500" height="300" /></p>
<h2>Ein paar Tipps</h2>
<p>Sollte es auf anhieb nicht so gut klappen:</p>
<ul>
<li>Mach dir das Element sichtbar! Hintergrundfarben und Rahmen geben dir einen Eindruck wie sich das Element verhält:
<pre><code class="css">border: 1px solid red;
background:silver;</code></pre>
</li>
<li>Guck dir im Firefox den Quelltext an ([CMD] + [U]). Wenn du fette, rote Schrift findest, dann ist das ein Zeichen dafür das hier etwas nicht stimmt. Überprüfe die hervorgehobenen Passagen auf korrekte Anführungszeichen, Attribute und öffnende und schließende Klammern.</li>
<li>Jage deine Seite durch den Validator vom W3C. Der sagt bescheid wenn etwas nicht stimmt und versucht auch zu erklären was schief gelaufen ist.</li>
</ul>
<h2>Effektive Ansprache der Elemente</h2>
<p>Wir versuchen alles so knapp und effektiv wie möglich zu halten. Vorallem im CSS müssen wir daran denken. Es empfielt sich die Datei in zwei Bereiche zu gliedern.</p>
<p>1. Struktur<br />
Das war der ganze obere Teil welcher die einzelnen Elemente auf der Seite positioniert.</p>
<p>2. Gestalltung<br />
In diesem Bereich wird das aussehen der Elemente gesteuert. Zum Beispiel Schriftart, Größe, Abstand, Farben usw.</p>
<p>Um die unterschiedlichen Bereiche deutlich zu machen und später noch zu wissen was mit welcher Anweisung gemeint war, müssen wir alles fleißig und ausführlich kommentieren. In CSS schließen wir die Kommentare mit /* und */ ein:</p>
<pre><code class="css">/* Struktur */
#head { ... }
#content { ... }</code></pre>
<p>CSS ermöglicht es mehrere Selektoren hintereinander zu schreiben. Wenn wir z.B. alle Links im Hauptmenü eine schwarze Farbe zuweisen wollen, dann könnte man auf die Idee kommen jedem Link im Menü eine Klasse zuzuweisen (z.B. &lt;a href="#" class="schwarz"&gt;) und diese per CSS zu stylen.<br />
Aber halt! Wir wollte nichts doppelt schreiben, und dieses class="schwarz" müssten wir allerdings öfters schreiben. Einfacher, und ohne irgendeine Änderung am HTML Quelltext, haben wir es, in dem wir einfach alle Links im Container Menü ansprechen.</p>
<pre><code class="css">/* Links im Container Menü schöner machen */
#menu a {
  color:black;
  text-decoration:none;
}</code></pre>
<p>Und so soll es weiter gehen! Wenn jetzt ein neuer Menüpunkt hinzukommt müssen wir nicht darüber nachdenken welche Klasse er braucht um genau so auszusehen wie alle anderen. Einfach nur dadurch das er im Menü ist, bekommt er schon die richtige Formatierung.</p>
<p>Darüber lohnt es sich nachzudenken.</p>
<h2>Fazit</h2>
<p>Das wars mit dem dritten Teil! Du kannst deiner Homepage jetzt schon ein schönes Äußeres verpassen, Bilder einbauen, Farben vergeben usw. Wenn du bestimmte Ideen zur Formatierung hast, dann durchsuche Google und Selfhtml nach den passenden Anweisungen. Es gibt sie bestimmt.</p>
<p>Im nächsten Kapitel kommen dann diverse Kniffe und Tricks um die Seite (noch) besser zu machen. <a title="Meine erste Webseite, Teil 4" href="http://www.interaktionsdesigner.de/2008/11/20/meine-erste-webseite-teil-4/" target="_self">Viel Spaß mit dem nächsten Kapitel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2008/11/07/meine-erste-webseite-teil-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
