<?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</title>
	<atom:link href="http://www.interaktionsdesigner.de/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>Das perfekte Zusammenspiel zwischen Git und CakePHP</title>
		<link>http://www.interaktionsdesigner.de/2010/06/05/das-perfekte-zusammenspiel-zwischen-git-und-cakephp/</link>
		<comments>http://www.interaktionsdesigner.de/2010/06/05/das-perfekte-zusammenspiel-zwischen-git-und-cakephp/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 21:13:53 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=706</guid>
		<description><![CDATA[Die großen Projekte entwickeln wir bei der Ape Unit GmbH im Moment mit Teams zwischen 3 und 5 Kollegen. Um sich nicht gegenseitig das Leben schwer zu machen, nutzen wir Git zur Codeverwaltung und CakePHP für anspruchsvolle Webapplikationen.
Mit ein paar Tricks und einer handvoll Wissen wir dieses Zusammenspiel ein Hort der Freude! Dieser Artikel beschreibt [...]]]></description>
			<content:encoded><![CDATA[<p>Die großen Projekte entwickeln wir bei der <a title="Webentwicklung und Medien aus Berlin" href="http://www.apeunit.com" target="_blank">Ape Unit GmbH</a> im Moment mit Teams zwischen 3 und 5 Kollegen. Um sich nicht gegenseitig das Leben schwer zu machen, nutzen wir <strong>Git</strong> zur Codeverwaltung und <strong>CakePHP</strong> für anspruchsvolle Webapplikationen.</p>
<p>Mit ein paar <strong>Tricks</strong> und einer handvoll Wissen wir dieses Zusammenspiel ein Hort der Freude! Dieser Artikel beschreibt das <strong>Zusammenspiel zwischen Versionsverwaltung und Framework</strong>.</p>
<p><span id="more-706"></span></p>
<h2>Das Repository</h2>
<p>Auf unserem Entwicklungsserver liegt das <strong>zentrale Coderepository</strong>. Hier wird es zum Projektstart angelegt und jeder beteiligte Entwickler kriegt bei bedarf Zugriff darauf. Zum starten wird nur eine leere Datei versionisiert, der Projektleiter legt dann alle benötigten Grundlagen von seinem Rechner aus an.</p>
<pre><code class=''># Auf dem Server<br />
$ mkdir PROJEKT.git<br />
$ cd PROJEKT.git<br />
$ touch init.txt<br />
$ git init<br />
$ git add .<br />
$ git commit -m "Init"</code></pre>
<p>Auf dem eigenen Rechner wird vom Projekt (eventuell per VPN von zuhause) eine Arbeitskopie erstellt.</p>
<pre><code class=''># Zuhause<br />
$ cd Ordner_fuer_alle_Projekte<br />
$ git clone gitosis@SERVER:git/PROJEKT.git</code></pre>
<p>Beim clonen legt git einen neuen Ordner mit dem Namen des Projektes an.</p>
<h2>CakePHP</h2>
<p>Im ersten Schritt werden alle Cake Dateien in den Ordner kopiert. Anschließend werden die benötigten Tabellen in der Datenbank angelegt. Über die<strong> Cake Console</strong> werden dann alle benötigten Dateien gebacken.</p>
<pre><code class=''>$ cd cake/console/<br />
$ ./cake bake</code></pre>
<p>Jetzt kommt der Trick! Um in Zukunft jeden Stress mit der Datenbank zu vermeiden,<strong> backt man das Datenbankschema mit in die Cake Applikation</strong>.</p>
<pre><code class=''>$ ./cake schema generate</code></pre>
<p>Mit diesem Befehl liest Cake die Datenbank aus und legt die Struktur in der PHP Datei unter <em>/config/schema/schema.php</em> ab. Ändert ein Entwickler eine Tabelle auf seinem Rechner, muss er das Schema neu erstellen und in Git bekannt machen.</p>
<pre><code class=''>$ ./cake schema generate<br />
$ cd ../..<br />
$ git add .<br />
$ git commit -m "Einiges ist passiert, inkl. neuer Datenbank"</code></pre>
<p>Der Kollege oder alternativ der gleiche Entwickler zuhause holt sich die neuste Version vom Server und aktualisert mit Cake Magie seine Datenbank.</p>
<pre><code class=''>$ git pull<br />
$ cd cake/console<br />
$ ./cake schema update</code></pre>
<p>Fertig ist die Datenbank!</p>
<h2>Dateien ignorieren</h2>
<p>Beim initialen anlegen macht es Sinn, <strong>Git einige Dateien und Ordner zu entziehen</strong>, die nicht versioniert werden müssen, da sie bei jedem Entwickler individuell vorhanden sind. Dafür legt man im Root Verzeichnis vom Projekt eine Datei Names<strong> .gitignore</strong> an.</p>
<p>Hier werden Dateien und Ordner festgehalten, die nicht eingebunden werden:</p>
<pre><code class=''>app/tmp/<br />
config/database.php</code></pre>
<h2>Cache Dateien anlegen</h2>
<p>Das Problem ist bei der oben verwendeten <strong>.gitignore </strong>Datei, dass die <strong>Caches leer sind und keine Zugriffsrechte</strong> darauf bestehen. Deshalb muss man beim erstellen des Projekts die nötigen Ordner anlegen und die entprechenden Zugriffsrechte vergeben.</p>
<pre><code class=''># cd app/<br />
# mkdir tmp<br />
# mkdir tmp/cache/<br />
# mkdir tmp/cache/models/<br />
# mkdir tmp/cache/persistent/<br />
# sudo chmod -R 777 tmp/</code></pre>
<p>Nach dem das Administratorpasswort eingegeben wurde, wird eine sehr freundliche Berechtigung gesetzt (die zum testen okay ist, auf dem Liveserver aber tabu!) und Cake kann in die Order schreibenn. Da der Ordner aus der Versionisierung ausgeschlossen wurde, muss man diesen Schritt zum Glück nur ein einziges mal durchführen.</p>
<h2>Die Datenbank</h2>
<p>Weil ein frisch geclontes Cake Projekt noch keine Datenbankverbindung besitzt, muss man als erstes eine neue Datenbank über phpMyAdmin o.ä. erstellen. Anschließend wechselt man in die Konsole und erstellt<strong> anhand des Schemas alle benötigten Tabellen</strong>.</p>
<pre><code class=''>$ cd cake/console<br />
$ ./cake bake</code></pre>
<p>Da keine Datenbankverbindung besteht, werden die Zugangsdaten abgefragt. Anschließend</p>
<pre><code class=''>$ ./cake schema create</code></pre>
<p>Jetzt noch die zwei Fragen mit <strong>y</strong> bestätigen und schon liegen alle Tabellen ordentlich in der frisch angelegten Datenbank.</p>
<h2>Fazit</h2>
<p>Was benutzt ihr um Demoinhalte zu übertragen? Im Schema gibt es zwei Callbacks: <strong>before() </strong>und <strong>after()</strong>; ich fürchte die werden beim neugenerieren überschrieben.</p>
<p>Ansonsten bleibt nur noch frohes Entwickeln zu wünschen übrig. <strong>Frohes entwickeln!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/06/05/das-perfekte-zusammenspiel-zwischen-git-und-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Überall auf die Benutzerdaten zugreifen</title>
		<link>http://www.interaktionsdesigner.de/2010/06/03/uberall-auf-die-benutzerdaten-zugreifen/</link>
		<comments>http://www.interaktionsdesigner.de/2010/06/03/uberall-auf-die-benutzerdaten-zugreifen/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 14:31:35 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=703</guid>
		<description><![CDATA[Es geht um unser Lieblingsframework: CakePHP. Man kennt ja zum Beispiel die Einstellungen, auf die man von überall aus zugreifen kann über die statische Klasse Configure:
Das funktioniert vom Model, über den Controller bis zum View. Wäre es nicht wunderbar auf die gleiche Art und Weise auf den angemeldeten Benutzer zugreifen zu können? Ich denke da [...]]]></description>
			<content:encoded><![CDATA[<p>Es geht um unser Lieblingsframework:<strong> CakePHP</strong>. Man kennt ja zum Beispiel die Einstellungen, auf die man von überall aus zugreifen kann über die statische Klasse <strong>Configure</strong>:</p>
<pre><code class=''>echo Configure::read('Hello.World');</code></pre>
<p>Das funktioniert vom Model, über den Controller bis zum View. Wäre es nicht wunderbar auf die gleiche Art und Weise auf den <strong>angemeldeten Benutzer </strong>zugreifen zu können? Ich denke da an:</p>
<pre><code class=''>echo User::get('name');</code></pre>
<p>Ja, wäre es und funktioniert ganz einfach. Die Idee stammt von <a title="CakePHP Genie" href="http://www.pseudocoder.com/" target="_blank">Matt Curry</a> und ist in seinem <a title="Free CakePHP Book" href="http://www.pseudocoder.com/free-cakephp-book" target="_blank">kostenlosen Cake Buch</a> auf englisch beschrieben. Im Laufe der Zeit hab ich die Funktionen erweitert und angepasst.<span id="more-703"></span></p>
<h2>Das User Model</h2>
<p>Hier beginnt die Arbeit. Die Grundlage ist die Funktion <strong>getInstance() </strong>mit deren Hilfe die Daten gespeichert werden und sicher gestellt wird, dass immer die richtigen Daten zurück gegeben werden:</p>
<pre><code class=''>function &amp;getInstance($user = null) {<br />
&nbsp;&nbsp;static $instance = array();<br />
&nbsp;&nbsp;if ($user) {<br />
&nbsp;&nbsp;[tab]$instance[0] =&amp; $user;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return $instance[0];<br />
}</code></pre>
<p>Um neue Daten hinzuzufügen habe ich die Funktion <strong>store()</strong> erstellt. Diese kann beliebig oft aus dem Controller aufgerufen werden. Neue Daten ersetzen alte Inhalte. Mit Hilfe dieser Funktion kann man <strong>nachträglich noch einzelne Daten</strong> hinzufügen.</p>
<pre><code class=''>function store($data) {<br />
&nbsp;&nbsp;$user = User::getInstance();<br />
&nbsp;&nbsp;$user = Set::merge($user, $data);<br />
&nbsp;&nbsp;User::getInstance($user);<br />
}</code></pre>
<p>Und natürlich die Funktion um <strong>Daten auszulesen</strong>:</p>
<pre><code class=''>function get($path = '') {<br />
&nbsp;&nbsp;$_user =&amp; User::getInstance();<br />
&nbsp;&nbsp;if(empty($path)) {<br />
&nbsp;&nbsp;[tab]return $_user;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;$path = str_replace('.', '/', $path);<br />
&nbsp;&nbsp;if (strpos($path, 'User') !== 0) {<br />
&nbsp;&nbsp;[tab]$path = sprintf('User/%s', $path);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;if (strpos($path, '/') !== 0) {<br />
&nbsp;&nbsp;[tab]$path = sprintf('/%s', $path);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;$value = Set::extract($path, $_user);<br />
&nbsp;&nbsp;if (!$value) {<br />
&nbsp;&nbsp;[tab]return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return $value[0];<br />
}</code></pre>
<p>Wie man sieht wird mit der Funktion <a title="Set::extract() im Cake Manual" href="http://book.cakephp.org/view/1501/extract" target="_blank">Set::extract()</a> aus den gespeicherten Daten gelesen. Die Core Utilities sind einfach großartig. Unbedingt durchstöbern!</p>
<h2>Im App Controller</h2>
<p>Hier werden die Daten vom angemeldeten Benutzer gesetzt. Als erstes muss natürlich das Model importiert werden, unabhängig von einer Anmeldung. Damit alle Controller mit den Daten arbeiten können, gehört der folgende Code in die Funktion <strong>beforeFilter()</strong>.</p>
<pre><code class=''>App::import('Model', 'User');<br />
$User = new User;</code></pre>
<p>Als nächstes wird geprüft ob der Benutzer angemeldet ist. Wenn das der Fall ist, werden die Benutzerdaten <strong>aus der Session ins Model </strong>geschrieben:</p>
<pre><code class=''>if($this-&gt;Session-&gt;check('Auth.User')) {<br />
&nbsp;&nbsp;$User-&gt;store($this-&gt;Session-&gt;read('Auth'));<br />
}</code></pre>
<p>Hat man im Laufe der Abarbeitung der Anfrage noch weitere Informationen vom Benutzer gesammelt oder errechnet, kann man die einfach hinzufügen:</p>
<pre><code class=''>$User-&gt;store(array('is_cool' =&gt; true));</code></pre>
<h2>Überall</h2>
<p>Überall, im View, im Controller oder im Model kann jetzt auf die <strong>Benutzerdaten</strong> zugegriffen werden:</p>
<pre><code class=''>echo User::get('User.name');<br />
echo User::get('email');</code></pre>
<p>Ich mag diese Form sehr! Sie ist schön, kurz und einprägsam. Man kann sie auch noch vielfältig erweitern.</p>
<h2>Sehr schöne Erweiterung</h2>
<p>Kaum können sich Benutzer anmelden, sollen sie <strong>verschiedene Rechte</strong> auf einer Plattform haben. Mit den oben beschriebenen Grundlagen erreicht man schon sehr viel. Noch besser wird es, wenn man eine Funktion<strong> check()</strong> im Model hinzufügt um auf das vorhanden sein von Feldern zu prüfen.</p>
<pre><code class=''>function check($path) {<br />
&nbsp;&nbsp;$value = User::get($path);<br />
&nbsp;&nbsp;if (!$value || empty($value) || $value === false) {<br />
&nbsp;&nbsp;[tab]return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return true;<br />
}</code></pre>
<p>Damit kann man schon gut lesbare Abfragen schreiben.</p>
<pre><code class=''>if(User::check('is_cool')) { /* usw. */ }</code></pre>
<p>Aber so richtig sauber sieht das nicht aus. Und was passiert wenn es mehrere Rollen gibt die der Nutzer einnehmen kann? Dann wäre eine <strong>is()</strong> Funktion wesentlich schöner.</p>
<pre><code class=''>if(User::is('cool')) //ist der benutzer cool?<br />
if(User::is('cool', 'okay')) //ist der benutzer cool oder okay?</code></pre>
<p><strong>Das sieht nett aus!</strong> Und der Schlüssel/die Funktion ist einfach implementiert. Im <strong>User Model</strong> einfach folgendes hinzufügen:</p>
<pre><code class=''>function is() {<br />
&nbsp;&nbsp;$roles = func_get_args();<br />
&nbsp;&nbsp;foreach($roles as $role) {<br />
&nbsp;&nbsp;[tab]if(User::check('User.is_'.$role)) {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return false;<br />
}</code></pre>
<p>Die Rechte werden im Benutzerarray erwartet in der Form<strong> is_Rechtename</strong>. Im Controller also schnell hinzugefügt:</p>
<pre><code class=''>$User-&gt;store(array('is_cool' =&gt; 1, 'is_okay' =&gt; 1, 'is_bloede' =&gt; 0));</code></pre>
<p>Die Funktion <strong>is()</strong> nimmt den übergebenen Namen, setzt ein<strong> is_</strong> davor und prüft ob die Variable in den Benutzerdaten gesetzt ist.</p>
<h2>Fazit</h2>
<p>Ich finde dieses Pattern einfach großartig und arbeite nur noch damit! Ich hab versucht das ganze in ein Plugin zu packen um nicht jedes mal aus einem alten Projekt die Funktionen rüber zu kopieren, aber es daran gescheitert, dass das Benutzer Model, wenn es statisch aufgerufen wird natürlich nicht mehr seine Behaviors (UserStorage) beinhaltet. <strong>Jemand eine Idee?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/06/03/uberall-auf-die-benutzerdaten-zugreifen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TYPO3 Version 4.4 Beta 3 Screenshots</title>
		<link>http://www.interaktionsdesigner.de/2010/06/01/typo3-version-4-4-beta-3-screenshots/</link>
		<comments>http://www.interaktionsdesigner.de/2010/06/01/typo3-version-4-4-beta-3-screenshots/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 09:05:41 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=691</guid>
		<description><![CDATA[In der neusten TYPO3 Version 4.4 wurde auch der Backendskin überarbeitet. Grund genug die neuste Version auf dem Testserver zu installieren und auszuprobieren.
Passend zum Wetter präsentiert sich das neue Backend ganz in grau.

Und weil Bilder mehr als tausend Worte sagen, besteht dieser Beitrag nur noch aus ein paar Screenshots.

Das neue Installations Tool ist sehr schick [...]]]></description>
			<content:encoded><![CDATA[<p>In der neusten <strong>TYPO3 Version 4.4</strong> wurde auch der Backendskin überarbeitet. Grund genug die neuste Version auf dem Testserver zu installieren und auszuprobieren.</p>
<p>Passend zum Wetter präsentiert sich das neue Backend ganz in grau.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.36.52.png"><img class="alignleft size-large wp-image-692" title="Bildschirmfoto 2010-06-01 um 10.36.52" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.36.52-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.36.52" width="1024" height="699" /></a></p>
<p>Und weil Bilder mehr als tausend Worte sagen, besteht dieser Beitrag nur noch aus ein paar Screenshots.</p>
<p><span id="more-691"></span></p>
<p>Das neue Installations Tool ist sehr schick geworden.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.38.16.png"><img class="alignleft size-large wp-image-694" title="Bildschirmfoto 2010-06-01 um 10.38.16" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.38.16-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.38.16" width="1024" height="699" /></a></p>
<p>Die Listenansicht sieht sehr aufgeräumt aus.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.50.52.png"><img class="alignleft size-large wp-image-695" title="Bildschirmfoto 2010-06-01 um 10.50.52" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.50.52-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.50.52" width="1024" height="699" /></a></p>
<p>Die Icons blenden sich nur noch bei Mouseover ein.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.49.12.png"><img class="alignleft size-large wp-image-698" title="Bildschirmfoto 2010-06-01 um 10.49.12" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.49.12-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.49.12" width="1024" height="699" /></a></p>
<p>Das Bearbeiten von Inhaltselementen ist übersichtlicher.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.43.51.png"><img class="alignleft size-large wp-image-696" title="Bildschirmfoto 2010-06-01 um 10.43.51" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.43.51-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.43.51" width="1024" height="699" /></a></p>
<p>Die Kiwi Extensions sind auch verfügbar und funktionieren anscheinend ganz gut.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.47.28.png"><img class="alignleft size-large wp-image-697" title="Bildschirmfoto 2010-06-01 um 10.47.28" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.47.28-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.47.28" width="1024" height="699" /></a></p>
<p>Benutzer lassen sich jetzt vielfältig filtern und sortieren.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.51.15.png"><img class="alignleft size-large wp-image-699" title="Bildschirmfoto 2010-06-01 um 10.51.15" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/06/Bildschirmfoto-2010-06-01-um-10.51.15-1024x699.png" alt="Bildschirmfoto 2010-06-01 um 10.51.15" width="1024" height="699" /></a></p>
<p>Soviel zu ein paar Eindrücken aus dem neuen, schönen Backend. Den Download gibt es auf den <a title="TYPO3 Download" href="http://typo3.org/download/packages/" target="_blank">offiziellen Downloadseiten</a>. Ich bin gespannt auf eure Meinung.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/06/01/typo3-version-4-4-beta-3-screenshots/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Solide Grundlagen für den CakePHP View</title>
		<link>http://www.interaktionsdesigner.de/2010/05/17/solide-grundlagen-fur-den-cakephp-view/</link>
		<comments>http://www.interaktionsdesigner.de/2010/05/17/solide-grundlagen-fur-den-cakephp-view/#comments</comments>
		<pubDate>Mon, 17 May 2010 14:00:59 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=677</guid>
		<description><![CDATA[Nach dem wir in der Ape Unit GmbH zwei große Projekte mit CakePHP aufgebaut haben und ich größtenteils für die Views zuständig war, gibt es eine Reihe von Grundlagen auf die ich in einem Cake Projekt nicht mehr verzichten möchte.
Welche das sind, wie sie eingebaut und verwendet werden, ist das Thema dieses Artikels.

Im App Controller
Alles [...]]]></description>
			<content:encoded><![CDATA[<p>Nach dem wir in der <a title="Webentwicklung und Medienproduktion" href="http://www.apeunit.com" target="_blank">Ape Unit GmbH</a> zwei große Projekte mit <strong>CakePHP</strong> aufgebaut haben und ich größtenteils für die Views zuständig war, gibt es <strong>eine Reihe von Grundlagen</strong> auf die ich in einem Cake Projekt nicht mehr verzichten möchte.</p>
<p>Welche das sind, wie sie eingebaut und verwendet werden, ist das Thema dieses Artikels.</p>
<p><span id="more-677"></span></p>
<h2>Im App Controller</h2>
<p>Alles fängt im Controller an. Meine erste Tat ist jetzt stets einen <strong>App Controller</strong> anzulegen. Der liegt im Verzeichnis <em>/app/</em> und definiert eine Reihe von Grundlagen.</p>
<pre><code class=''>class AppController extends Controller {<br />
&nbsp;&nbsp;var $components = array('Auth', 'Session', 'RequestHandler');<br />
&nbsp;&nbsp;var $helpers = array('Form', 'Html', 'Javascript', 'Time', 'Text', 'Layout');<br />
}</code></pre>
<p>Die Components <strong>Auth</strong> und <strong>Session</strong> sind wahrscheinlich schon hinreichend bekannt. Der <strong>RequestHandler</strong> ist mein bester Freund, denn er beinhaltet alle Informationen über den aktuellen Aufruf. Mit seiner Hilfe ist es zum Beispiel möglich zu erkennen ob es sich um <strong>einen asynchronen Aufruf</strong> handelt oder um ein <strong>mobiles Endgerät</strong>.</p>
<p>Die Helper sollten auch soweit klar sein, bis auf <strong>Layout</strong>. Der ist nicht im Core enthalten sondern in der Bakery <a title="Template Inheritance in CakePHP" href="http://bakery.cakephp.org/articles/view/anything_for_layout-making-html-from-the-view-available-to-the-layout" target="_blank">verfügbar</a>. Mit diesem Helper im Projekt ist  <strong>Template Inheritance</strong> möglich. Das heißt man definiert im Layout (<em>/app/views/layouts/default.ctp</em>) einen Block, zum Beispiel den <strong>Footer</strong>.</p>
<pre><code class=''>&lt;div id="footer"&gt;<br />
&nbsp;&nbsp;&lt;? $this-&gt;Layout-&gt;output($footer_for_layout, $this-&gt;element('default_footer')); ?&gt;<br />
&lt;/div&gt;</code></pre>
<p>Im Element <strong>default_footer</strong> (<em>/app/views/elements/default_footer.ctp</em>) befindet sich der Standardfooter. Und den überschreibt man im Bedarf einfach in einem View:</p>
<pre><code class=''>&lt;?=$layout-&gt;blockStart('footer');?&gt;<br />
Ein &lt;strong&gt;neuer&lt;/strong&gt; Footer!<br />
&lt;?=$layout-&gt;blockEnd();?&gt;</code></pre>
<p>Grandios oder? Der im View definierte Inhalt wird dann im entsprechenden Block im Layout ausgegeben. Das Prinzip habe ich bei <strong>Django</strong> gesehen und jetzt zum Glück auch in Cake zur Verfügung.</p>
<p>Noch ein Wort zum <strong>RequestHandler</strong>. In der Funktion <strong>AppController::beforeFilter()</strong> benutze ich folgende Abfrage um auf einen asynchronen Aufruf zu reagieren:</p>
<pre><code class=''>if($this-&gt;RequestHandler-&gt;isAjax()) {<br />
&nbsp;&nbsp;Configure::write('debug', 0);<br />
&nbsp;&nbsp;if($this-&gt;RequestHandler-&gt;prefers() == 'json') {<br />
&nbsp;&nbsp;   die(json_encode($this-&gt;viewVars));<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;   $this-&gt;layout = 'ajax';<br />
&nbsp;&nbsp;}<br />
}</code></pre>
<p>Wenn es sich um einen Ajaxaufruf handelt<strong> $this-&gt;RequestHandler-&gt;isAjax()</strong> dann wird als erstes eine Debugausgabe verhindert <strong>Configure::write('debug', 0);</strong> (das sollte man sich merken!!) und dann überprüft, was für ein Datentyp zurück erwartet wird.</p>
<p>Wenn <strong>JSON Code</strong> angefordert wird, werden alle Variablen für den View in einem JSON Objekt zurück gegeben, andernfalls wird das <strong>Ajax Layout</strong> verwendet, welches einfach den View zurück gibt ohne das ganze HTML Gerüst.</p>
<p>Wichtig ist bei der Verwendung dieser Abfrage daran zu denken <strong>keine sensiblen Daten an den View zu übergeben</strong> und dort zu prüfen ob der Nutzer die Daten sehen darf oder nicht. Aber da wir ja alle strikt dem MVC Pattern folgen, ist das ja auch gar nicht möglich.</p>
<h2>Das Layout</h2>
<p>Okay, <strong>jQuery</strong> keine Frage:</p>
<pre><code class=''>echo $this-&gt;Javascript-&gt;link(array(<br />
&nbsp;&nbsp;'jquery.min'<br />
));</code></pre>
<p>Die Endung .js kann man sich sparen, Cake sucht die angegebenen Dateien automatisch im Ordner <em>/app/webroot/js/</em>.</p>
<p>Zur angenehmen Verteilung des Inhalts benutze ich jetzt immer das <a title="Ein grandioses CSS Framework" href="http://www.960.gs" target="_blank">960.gs CSS Framework</a>. Es gibt einen grandiosen <a title="960.gs Konfigurator" href="http://www.spry-soft.com/grids/" target="_blank">Konfigurator</a> mit dessen Hilfe man sich sehr schnell ein passendes Grid zusammenstellt. Die erzeugte CSS Datei legt man im Ordner <em>/app/webroot/css/</em> ab und bindet sie mit Hilfe des <strong>HTML Helpers</strong> ein.</p>
<p>Außerdem benutze ich den <a href="http://meyerweb.com/eric/tools/css/reset/" target="_blank">CSS Reset von Eric Meyer</a> um eine einheitliche Ausgangslage in allen Browsern zu erreichen. In der Datei <strong>layout.css</strong> binde ich dann je nach Komplexibilität weitere CSS Dateien über <strong>import url()</strong> ein.</p>
<pre><code class=''>echo $this-&gt;Html-&gt;link(array(<br />
&nbsp;&nbsp;'960',<br />
&nbsp;&nbsp;'reset',<br />
&nbsp;&nbsp;'layout'<br />
));</code></pre>
<p>Um in jQuery immer die richtige Baseurl für Ajaxanfragen zur Verfügung zu haben, nutze ich das Base Tag:</p>
<pre><code class=''>&lt;base href="http://&lt;?=env('HTTP_HOST').$this-&gt;base?&gt;/" /&gt;</code></pre>
<h2>HTML Gerüst</h2>
<p>Das<strong> 960.gs</strong> verlangt einen umfassenden Container mit der Klasse <strong>container_XX</strong>, wobei das XX für die Anzahl der Spalten steht. Was sich außerdem bewäht hat ist, <strong>Controller</strong> und <strong>Action</strong> als Klasse auszugeben um per CSS einzelne Ansichten individuell gestallten zu können. In meinem Layout führt das zur folgenden Monsterzeile:</p>
<pre><code class=''>&lt;div id="wrap" class="container_16 &lt;?=$this-&gt;params['controller']?&gt; &lt;?=$this-&gt;params['action']?&gt; &lt;?=$this-&gt;params['controller']?&gt;&lt;?=ucfirst($this-&gt;params['action'])?&gt;"&gt;</code></pre>
<p>Alle Views des Controllers <strong>Blogs</strong> haben jetzt die Klasse <strong>#wrap.blogs</strong>. Und jede einzelne View lässt sich mit <strong>#wrap.blogsAdd</strong> gezielt ansprechen. Außerdem können auch alle Formular zum hinzufügen von neuen Einträgen angesprochen werden: <strong>#wrap.add form</strong>.</p>
<p>Damit ist man schon sehr flexibel.</p>
<p>Noch ein Satz zu <strong>960.gs</strong>: die Aufteilung des Inhalts in Spalten erfolgt über das verteilen von Klassen. Diese haben immer das Format <strong>grid_XX</strong>, darauf folgt immer ein Container mit der Klasse <strong>clear</strong>.</p>
<pre><code class=''>&lt;div class="grid_8"&gt;Linke Hälfte&lt;/div&gt;<br />
&lt;div class="grid_8"&gt;Rechte Hälfte&lt;/div&gt;<br />
&lt;div class="clear"&gt;&lt;/div&gt;</code></pre>
<p>Das teilt den Inhalt in zwei gleiche Teile. Es ist über die Klassen <strong>pull_XX</strong> und <strong>push_XX</strong> auch möglich Abstände einzufügen. Einfach ein bisschen rumspielen.</p>
<h2>Hilfe und Informationen</h2>
<p>Alle <strong>Core Components</strong> und <strong>Helper</strong> liegen bestens dokumentiert in eurem Projekt! Um schnell zu erfahren wie die verdammte Funktion im <strong>RequestHandler</strong> heißt, öffnet man einfach die entsprechende Datei in <em>/cake/libs/controller/components/</em>.</p>
<p>Im Verzeichnis <em>/cake/libs/</em> ist Cake genau so aufgebaut wie im eigenen Ordner <em>/app/</em>. Daran muss man unbedingt denken und diese <strong>wertvolle Quelle </strong>nutzen. Aber: <strong>niemals Änderungen vornehmen!!!</strong> <strong>NIEMALS</strong>. Absolut verboten, denn damit verliert man die Updatefähigkeit. Alle Dateien die man anpacken darf liegen im <em>/app/ </em>Ordner. Wenn man jetzt wirklich nicht drum rum kommt und zum Beispiel im <strong>Time Helper</strong> etwas ändern muss, dann kopiert man die komplette Datei und legt sie in den Ordner <em>/app/views/helpers/</em>. Jetzt darf man sie verändern <strong>wenn es unbedingt sein muss</strong>.</p>
<p>Unter <a href="http://www.cakephp.org" target="_blank">http://www.cakephp.org</a> findet man eine ganze Reihe nützlicher Links und Ressourcen, dass ist ja klar. Für deutschsprachige Cake Entwickler bietet sich außerdem noch das <a title="CakePHP Forum für deutschsprachige Entwickler" href="http://www.cakeforum.de" target="_blank">CakeForum</a> an, da bin <a title="Icke im Cake Forum" href="http://www.cakephp-forum.com/member/paul/" target="_blank">ich</a> auch ab und zu unterwegs.</p>
<h2>Fazit</h2>
<p><strong>CakePHP ist ein grandioses Framework</strong>, die aktuelle Version 1.3 macht großen Spaß und ich kann es kaum erwarten das unsere Projekte endlich das digitale Licht des Internets erblicken.</p>
<p>Infohäppchen gibt es in meinem <a title="Paul Lunow auf Twitter" href="http://www.twitter.com/paul_lunow" target="_blank">Twitter Account</a>, richtig gute Hilfe und Unterstüztung leistet die <a title="Webentwicklung aus Berlin" href="http://www.apeunit.com" target="_blank">Ape Unit GmbH</a> gegen Bares oder Mitarbeit und wenn du einen Job suchst, dann freue ich mich auf einen Besuch auf unserer Seite der <a title="Webentwickler gesucht in Berlin" href="http://www.apeunit.com/jobs" target="_blank">offenen Stellen</a>!</p>
<p>Frohes backen!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/05/17/solide-grundlagen-fur-den-cakephp-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asynchron Inhalte in WordPress nachladen</title>
		<link>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/</link>
		<comments>http://www.interaktionsdesigner.de/2010/05/06/asynchron-inhalte-in-wordpress-nachladen/#comments</comments>
		<pubDate>Thu, 06 May 2010 09:53:39 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=674</guid>
		<description><![CDATA[Neben der Gründung einer neuen Firma die sich um Webentwicklungsthemen und Medienproduktion kümmert (Die Ape Unit GmbH Berlin) hatte ich eine Menge mit WordPress zu tun. Ein guter Grund hier mal wieder etwas Leben in den Blog zu bringen.
Es geht natürlich um den heißen Scheiß: Ajax. Mit aktiviertem JavaScript soll bei einem Klick auf 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>Kiwi Teaser Version 1.1.0</title>
		<link>http://www.interaktionsdesigner.de/2010/03/04/kiwi-teaser-version-1-1-0/</link>
		<comments>http://www.interaktionsdesigner.de/2010/03/04/kiwi-teaser-version-1-1-0/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 11:17:22 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Kiwi Teaser]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=664</guid>
		<description><![CDATA[Seit gestern steht die neue Version meiner Extension Kiwi Teaser im Repository bereit. Neben einem Icon für die Teaser Inhaltselemente ist auch ein kleiner Fehler in den generierten Pfaden zu den Ressourcen behoben. Die wirklich interessante, und diesen Post rechtfertigende Neuerung ist die komplette Konfigurationsmöglichkeit über Typoscript.
Dadurch ist es möglich einen Teaserport direkt per Typoscript [...]]]></description>
			<content:encoded><![CDATA[<p>Seit gestern steht die neue Version meiner Extension Kiwi Teaser im <a title="Kiwi Teaser im TYPO3 Repository" href="http://typo3.org/extensions/repository/view/kiwi_teaser/current/" target="_blank">Repository</a> bereit. Neben einem Icon für die Teaser Inhaltselemente ist auch ein kleiner Fehler in den generierten Pfaden zu den Ressourcen behoben. Die wirklich interessante, und diesen Post rechtfertigende Neuerung ist die <strong>komplette Konfigurationsmöglichkeit über Typoscript</strong>.</p>
<p>Dadurch ist es möglich einen Teaserport direkt per Typoscript einzubinden und zum Beispiel einem Marker zuzuweisen. Außerdem kann man mit dieser praktischen Extension <strong>jede beliebige Tabelle</strong> auslesen!</p>
<p><span id="more-664"></span></p>
<h2>Einbindung über Typoscript</h2>
<p>Nach der Installation steht im Typoscript das Objekt <strong>plugin.tx_kiwiteaser_pi1</strong> bereit. Das kann einem Marker zugewiesen werden und über die Eigenschaften <strong>content</strong> und <strong>ports</strong> mit Inhalt befüllt werden.</p>
<pre><code class=''>page.10.marks.CONTENT &lt; plugin.tx_kiwiteaser_pi1<br />
page.10.marks.CONTENT {<br />
&nbsp;&nbsp;content = pages_21, tt_content_123, pages_22, tx_kiwiteaser_content_2<br />
&nbsp;&nbsp;ports = 4<br />
}</code></pre>
<p>Und zack findet sich im Frontend statt ###CONTENT### ein cooler Kiwi Teaser mit vier Slots und den ausgelesenen Datensätzen, angegeben in <strong>content</strong>. Das Format ist simpel: Name der Datenbank - Unterstrich - UID des Datensatzes. Extra angelegten Teaserinhalte befinden sich in der Datenbank <strong>tx_kiwiteaser_content</strong>.</p>
<h2>Ansprechen von beliebigen Datenbanken</h2>
<p>Wenn man die Inhalte einfach per Typoscript beschreibt, lässt sich natürlich jede beliebige Datenbank ansprechen. Ja, das funktioniert! Damit die Extension weiß, welche Spalten sie auslesen soll, muss man diese per Typoscript bekannt geben. Zum Beispiel könnte man die besten Frontend Benutzer teasern:</p>
<pre><code class=''>plugin.tx_kiwiteaser_pi1 {<br />
tables.fe_users {<br />
&nbsp;&nbsp;title = name<br />
&nbsp;&nbsp;content = address<br />
&nbsp;&nbsp;image = image<br />
}<br />
}</code></pre>
<p>Das Format sollte eigentlich selbsterklärend werden. Der Inhalt aus der Spalte name landet im Marker ###TITLE### usw. Anschließend muss der Datensatz nur noch dem Teaser zugewiesen werden. Dem Beispiel von oben folgend so:</p>
<pre><code class=''>page.10.marks.CONTENT.content = fe_users_1, fe_users_3, pages_12, tt_content_21</code></pre>
<p>Nett, oder?</p>
<h2>Mehr Komfort für Redakteure</h2>
<p>Um <strong>weitere Tabellen</strong> im Teaser zu erlauben, und diese vorallem im Backend auszuwählen muss man im Moment leider noch hart an den Quelltext ran. In der Datei <strong>typo3conf/ext/kiwi_teaser/ext_tables.php</strong> wird im Array <strong>$tempColumns</strong> ab Zeile 33 das Feld <strong>tx_kiwiteaser_teasers</strong> als Datenbankrelationsfeld definiert. In Zeile 41 werden unter dem Schlüssel <strong>allowed</strong> alle erlaubten Datenbanknamen aufgezählt. Um den Redakteuren die Auswahl von Benutzern zu erlauben, muss der Eintrag erweitert werden:</p>
<pre><code class=''>$tempColumns['tx_kiwiteaser_teasers']['allowed'] = 'tx_kiwiteaser_content,pages,tt_content,fe_users';</code></pre>
<h2>Ausblick und Weiterentwicklung</h2>
<p>Der aufmerksame Betrachter wird die auskommentierte Zeile 40 bemerken, in der tt_news noch erlaubt war. Daran arbeiten wir im Moment. Verbessert werden muss die <strong>Verlinkung auf ausgewählte Inhalte</strong>.</p>
<p>Außerdem auf der Liste steht eine <strong>dynamische Darstellung von Teaserinhalten</strong>. Das bedeutet zum Beispiel das auslesen aller Seiten ab einem Einstiegspunkt, oder die Angabe von verschiedenen Bedingungen.</p>
<p>Wer diese Funktionen für sein Projekt gut gebrauchen kann oder mehr Ideen hat, ist natürlich herzlich eingeladen mit <a title="Webentwicklung aus Berlin" href="http://www.apeunit.com" target="_blank">uns</a> darüber zu reden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/03/04/kiwi-teaser-version-1-1-0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TYPO3 Extension Kiwi Accordion Version 1.6</title>
		<link>http://www.interaktionsdesigner.de/2010/02/11/typo3-extension-kiwi-accordion-version-1-6/</link>
		<comments>http://www.interaktionsdesigner.de/2010/02/11/typo3-extension-kiwi-accordion-version-1-6/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 20:28:35 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Kiwi Accordion]]></category>
		<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=654</guid>
		<description><![CDATA[Nach einigen Mails und Forenbeiträgen hatte ich schon Bauchschmerzen und fühlte mich ungut, denn meine kleine, feine Extension Kiwi Accordion setzte die "Rahmen"-Eigenschaft von Inhaltselementen außer kraft.
Aber damit ist jetzt Schluss! Die neue Version legt ihre Container unabhängig von den Rahmen um den Inhalt. Zeitnah im Repository verfügbar. Auf meiner privaten Seite gibt es eine [...]]]></description>
			<content:encoded><![CDATA[<p>Nach einigen Mails und Forenbeiträgen hatte ich schon Bauchschmerzen und fühlte mich ungut, denn meine kleine, feine Extension <a title="Kiwi Accordion im Repository" href="http://typo3.org/extensions/repository/view/kiwi_accordion/current/" target="_blank"><strong>Kiwi Accordion</strong></a> setzte die "Rahmen"-Eigenschaft von Inhaltselementen außer kraft.</p>
<p>Aber damit ist jetzt Schluss! <strong>Die neue Version</strong> legt ihre Container unabhängig von den Rahmen um den Inhalt. Zeitnah im Repository verfügbar. Auf meiner <a title="Webentwickler aus Berlin" href="http://www.paul-lunow.de" target="_blank">privaten Seite</a> gibt es eine Demonstration und im folgenden Eintrag ein paar technische Erklärungen.</p>
<p><span id="more-654"></span></p>
<h2>Für Redakteure</h2>
<p>Die Funktionsweise für Redakteure ist <strong>sehr einfach</strong>. Über die Seiteneigenschaften lässt sich bestimmen, ob mehrere Panels gleichzeitig offen sein dürfen.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/02/HiVars-Demoprojekt-TYPO3-4.3.1.jpg"><img class="aligncenter size-full wp-image-655" title="Kiwi Accordion Seiteneigenschaften" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/02/HiVars-Demoprojekt-TYPO3-4.3.1.jpg" alt="Kiwi Accordion Seiteneigenschaften" width="606" height="114" /></a><br />
Jedes Inhaltselement wiederum hat zwei Eigenschaften, <strong>Aufklappbar</strong> und <strong>Offen</strong>.</p>
<p><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/02/HiVars-Demoprojekt-TYPO3-4.3.1-1.jpg"><img class="aligncenter size-full wp-image-656" title="Inhaltselemente aufklappbar" src="http://www.interaktionsdesigner.de/wp-content/uploads/2010/02/HiVars-Demoprojekt-TYPO3-4.3.1-1.jpg" alt="Inhaltselemente aufklappbar" width="598" height="121" /><br />
</a>Die erste Option initalisiert den Effekt, die zweite öffnet das Inhaltselement beim laden der Seite. Das wars! Eine Beispiel gibt es auf meiner <a title="Webentwickler aus Berlin" href="http://www.paul-lunow.de" target="_blank">privaten Seite</a>.</p>
<h2>Für Techniker</h2>
<p>Der kleinere Teil der Arbeit wird vom mitgelieferten Typoscript übernommen. Über die Eigenschaft <strong>tt_content.stdWrap.innerWrap.prepend</strong> und <strong>append</strong> wird ein DIV Container um den Inhalt gelegt (<strong>div.ka-panel</strong>) und je nach gewählten Eigenschaften die Klasse <strong>open</strong> oder <strong>close</strong> hinzugefügt.</p>
<p>In Version 4.3 hat sich dieser Teil grundlegend geändert. Inhaltselemente werden jetzt immer innerhalb eines DIV Containers ausgegeben was ich wesentlich besser finde als die nervigen Links ala <strong>&lt;a href="#c123"&gt;&lt;/a&gt;</strong>. Das hat leider zur Folge, dass in älteren Versionen der <strong>tt_content.stdWrap.innerWrap</strong> nur ausgeführt wird, wenn ein Rahmen ausgewählt wurde. Um das zu verhindern fügt die Extension einen Standardwert hinzu, damit die Eigenschaft aufjedenfall greift. Möglich wird das über die Abfrage der eingestellten TYPO3 Version.</p>
<pre><code class=''>[compatVersion &lt; 4.3]<br />
tt_content.stdWrap.innerWrap.cObject.default = TEXT<br />
tt_content.stdWrap.innerWrap.cObject.default.value = |<br />
[end]</code></pre>
<p>Der größere Teil der Arbeit erfolgt als jQuery Script. Das Kiwi Accordion arbeitet mit jQuery, <strong>bringt das Framework aber selbst nicht mit</strong>. Ich bin bei der Entwicklung davon ausgegangen, dass es in jedem Projekt integriert ist.</p>
<p>Im Script wird jeder Container mit der Klasse <strong>ka-panel</strong> untersucht und für die weitere Verwendung angepasst. Dabei wird mit <strong>$(':header:first', '.ka-panel')</strong> die erste Überschrift gesucht und als Handler benutzt. Alle Elemente nach der Überschrift werden mit einem Container umschlossen (<strong>div.ka-content</strong>) und bei Klick ein- oder ausgeblendet.</p>
<p>Bei Mauskontakt erhält das Panel zusätzlich die Klasse <strong>hover</strong>, damit lassen sich dann Pfeile anzeigen oder Farben ändern, je nach Vorgabe.</p>
<p>Wenn bei der Initialisierung etwas nicht funktioniert, gibt die Extension ein paar Hinweise in der Firebug Konsole aus. Ich hoffe das hilft weiter. Ansonsten sei auf die <a title="TYPO3, Extensions, Webstandards" href="http://www.paul-lunow.de" target="_blank">Demo auf meiner Seite</a> verwiesen.</p>
<p>Getestet hab ich die Extension mit TYPO3 Version <strong>4.3</strong>, <strong>4.3.1</strong> und <strong>4.2.6</strong>. Über weitere Kompatibilitätshinweise, Fragen und Anregungen freue ich mich natürlich sehr.</p>
<ul>
<li><a href="http://typo3.org/extensions/repository/view/kiwi_accordion/current/" target="_blank">Kiwi Accordion im TYPO3 Repository</a></li>
<li><a href="http://www.interaktionsdesigner.de/wp-content/uploads/2010/02/T3X_kiwi_accordion-1_6_0.t3x">Kiwi Accordion 1.6.0</a></li>
<li><a title="Pauls Seite" href="http://www.paul-lunow.de" target="_blank">Demonstration auf paul-lunow.de</a></li>
</ul>
<p>Danke für die ganzen Mails und die netten Worte! Frohes rumklappen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2010/02/11/typo3-extension-kiwi-accordion-version-1-6/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Auf Inhalte aufmerksam machen: Kiwi Teaser</title>
		<link>http://www.interaktionsdesigner.de/2009/12/17/auf-inhalte-aufmerksam-machen-kiwi-teaser/</link>
		<comments>http://www.interaktionsdesigner.de/2009/12/17/auf-inhalte-aufmerksam-machen-kiwi-teaser/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 19:58:14 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[Kiwi Teaser]]></category>
		<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=647</guid>
		<description><![CDATA[Darf ich vorstellen? Meine neuste Extension, der Kiwi Teaser. Mit dessen Hilfe präsentiert man ganz einfach vorhandene Inhalte auf der einen Seite. Dazu legt man eine Teaseranzeige an und bestimmt wieviele Teaser sie anzeigen soll.
Die Teaser sind entweder Teaserdatensätze (mit Titel, Inhalt, Bild und Link), ganze Seiten oder einzelne Inhaltselemente. Fertig! Auf der Startseite kann [...]]]></description>
			<content:encoded><![CDATA[<p>Darf ich vorstellen? Meine neuste Extension, der <strong>Kiwi Teaser</strong>. Mit dessen Hilfe präsentiert man ganz einfach vorhandene Inhalte auf der einen Seite. Dazu legt man eine Teaseranzeige an und bestimmt wieviele Teaser sie anzeigen soll.</p>
<p>Die Teaser sind entweder <strong>Teaserdatensätze</strong> (mit Titel, Inhalt, Bild und Link), <strong>ganze Seiten</strong> oder einzelne <strong>Inhaltselemente</strong>. Fertig! Auf der Startseite kann der Redakteur jetzt ganz genau bestimmen, auf welche Inhalte die Benutzer aufmerksam gemacht werden sollen und in welcher Reihenfolge.</p>
<p>Die Extension gibts im <a title="Kiwi Teaser im TYPO3 Repositorie" href="http://typo3.org/extensions/repository/view/kiwi_teaser/current/" target="_blank">TYPO3 Repository</a> oder auf <a title="Kiwi Teaser auf GitHub" href="http://github.com/kiwi-service/Kiwi-Teasers" target="_blank">GitHub</a> - live im Einsatz bisher auf unserer <a title="Kiwi Service" href="http://www.kiwi-service.de" target="_blank">Firmenpräsenz</a>.</p>
<p><span id="more-647"></span></p>
<h2>Berechtigung</h2>
<p>Es liegt natürlich nahe tt_news einzusetzen. Aber erst sagt der Redakteur mir, ich soll das Datum ausblenden, denn regelmäßige News gibt es  gar nicht. Als nächstes will er die Reihenfolge ändern und ich sage, pass doch einfach das Datum entsprechend der Reihenfolge an. Klar, das geht aber so richtig genial ist das nicht.</p>
<p>Zumal die meisten Hinweise sich auf entsprechende Seiten in der Präsenz beziehen, auf externe Links oder einfach nur einen kurzen Hinweis darstellen. Das geht jetzt eleganter.</p>
<h2>Inhalte</h2>
<p>Es können verschiedene Inhalte vorgestellt werden. Die Extension bringt eigene Datensätze mit welche Titel, Inhalt, Bild und einen Link aufnehmen. Es können aber auch Seiten oder Seiteninhalte angeteast werden.</p>
<h2>Installation</h2>
<p>Entweder man holt sich die stabile Version aus dem Repository oder die aktuellste, brandheiße aus meinem ersten Projekt auf <a title="Kiwi Teaser auf GitHub" href="http://github.com/kiwi-service/Kiwi-Teasers">GitHub</a>. Ein großartiges Portal!</p>
<p>Die restliche Installation ist alt bekannt und ganz normal. Der Kiwi Teaser <strong>bindet standardmäßig jQuery ins Projekt ein</strong> um ein paar coole Extras zu ermöglichen.</p>
<h2>Konfiguration</h2>
<p>Über Typoscript hat man viele Einstellungsmöglichkeiten. Alles natürlich unter <strong>plugin.tx_kiwiteaser_pi1</strong> im Template - das schreibe ich jetzt nicht jedesmal mit auf. Die angegebenen Typoscriptschnipsel stellen jeweils die Standardeinstellung dar.</p>
<pre><code class=''>include.css.standard = 1</code></pre>
<p>Mit dieser Anweisung wird ein minimales Stylesheet geladen welches dafür sorgt das die Boxen nebeneinander stehen und einen Abstand zueinander haben.</p>
<pre><code class=''>include.javascript.jquery = 1</code></pre>
<p>Bindet die aktuelle jQuery Version ein. Hat man diese schon im Projekt sollte man diese Eigenschaft unbedingt mit <strong>include.javascript.jquery &gt;</strong> löschen (auf diese Art kann man jeden include verhindern).</p>
<pre><code class=''>include.javascript.clickbox = 1</code></pre>
<p>Holt mein Plugin Clickbox ins Projekt, welches <strong>die komplette Teaserbox klickbar</strong> macht und nicht nur den kleinen Link. <a title="Clickbox" href="http://www.interaktionsdesigner.de/2008/04/22/mein-jquery-plugin-clickbox/" target="_blank">Mehr zur Clickbox gibts hier</a>.</p>
<pre><code class=''>include.javascript.height = 1</code></pre>
<p>Bindet ein Script ein, welches dafür sorgt das <strong>alle Teaserboxen die gleiche Höhe</strong> haben. Besonders praktisch wenn man einen Rahmen oder eine Hintergrundfarbe gesetzt hat.</p>
<pre><code class=''>template.file = EXT:kiwi_teaser/res/html/template.html</code></pre>
<p>Der Pfad zum HTML Template. Das Standardtemplate sollte man sich unbedingt angucken und die Klassennamen beibehalten, denn sonst kriegen die oben erwähnten Scripte Schwierigkeiten.</p>
<pre><code class=''>stdWrap</code></pre>
<p>Der StandardWrap ist eine richtig schöne Sache! Damit kann man <strong>jeden Inhalt mit Typoscript bearbeiten</strong> bevor er ausgegeben wird. Dieser kann auf alle Felder angewendet werden: <strong>title, image, link</strong> und <strong>content</strong>. Zum Beispiel:</p>
<pre><code class=''>stdWrap.title.wrap = &lt;b&gt;|&lt;/b&gt;</code></pre>
<p>Außerdem kann man für verschiedene Quellen verschiedene Optionen angeben. Seiten kommen aus der Tabelle <strong>pages</strong>, Seiteninhalte aus <strong>tt_content</strong> und die Standardinhalte aus <strong>tx_kiwiteaser_content</strong>. Mit diesem Wissen kann man die Ausgabe je nach Datenbank bestimmen. Möchte man also die Überschriften von Seiten nicht fett sondern kursiv darstellen, reicht folgende Anweisung:</p>
<pre><code class=''>stdWrap.title.pages.wrap = &lt;i&gt;|&lt;/i&gt;</code></pre>
<p>Besonders wichtig ist diese Möglichkeit für <strong>den Linktext</strong>. Dieser wird über die Eigenschaft <strong>link.value</strong> gesetzt.</p>
<pre><code class=''>stdWrap.link.value = Mehr...</code></pre>
<p>Die Extension setzt den generierten oder angegebenen Wert vor der Verarbeitung in das Feld <strong>stdWrap.link.typolink.parameter</strong>. Das typolink Objekt lässt sich natürlich trotzdem noch erweitern. Will man alle Teaserlinks in einem neuen Fenster öffnen geht das ganz einfach:</p>
<pre><code class=''>stdWrap.link.typolink.target = _blank</code></pre>
<h2>Mapping der Inhalte</h2>
<p>Um zu entscheiden, welche Daten aus einem Datensatz den Titel und welche z.B. den Inhalt darstellen, gibt es eine <strong>Mappingtabelle im Typoscript</strong>. In der Standardkonfiguration wird der Untertitel einer Seite als Inhalt benutzt. Das passiert über folgende Angabe:</p>
<pre><code class=''>tables.pages.content = subtitle</code></pre>
<p>Dabei bezeichnet der Schlüssel das Feld im Teaser und der Wert das Feld in der Zieltabelle. Das lässt sich je nach Anforderung beliebig anpassen. Wenn die Eigenschaft link leer ist, erzeugt die Extension den Link je nach Tabelle automatisch.</p>
<h2>Template</h2>
<p>Im Template stehen verschiedene Marker zur Verfügung:</p>
<ul>
<li><strong>###TITLE### </strong>Ein Beispieltitel</li>
<li><strong>###IMAGE### </strong>uplodas/media/picture.jpg</li>
<li><strong>###CONTENT### </strong>Das ist je nach eingabe verschieden.</li>
<li><strong>###LINK### </strong>&lt;a href="index.php?id=123"&gt;Mehr...&lt;/a&gt;</li>
<li><strong>###CLASS### </strong>teaser-first port1</li>
</ul>
<p><strong>Image</strong> beinhaltet den originalen Inhalt aus der Datenbank, also im Idealfall den Pfad zum Bild, sollte also noch mit einem &lt;img&gt; Tag gewrappt oder per Javascript weiter verarbeitet werden.</p>
<p><strong>Link</strong> ist ein kompletter &lt;a&gt; Tag - generiert über Typoscript.</p>
<p><strong>Class</strong> wird automatisch gesetzt, je nach Position des Teasers steht da <strong>first-teaser</strong> oder <strong>last-teaser</strong> drin. Außerdem kriegt jeder Teaser die Klasse <strong>portX</strong> wobei das X für die aktuelle Position steht. So kann man also den zweiten Teaser gezielt ansprechen:</p>
<pre><code class=''>.tx-kiwiteaser-pi1 .port2 {<br />
&nbsp;&nbsp;font-size:200%;<br />
}</code></pre>
<h2>Alpha</h2>
<p>Heute, am 17.12.2009 habe ich die erste Version fertig gestellt und in meinem Projekt eingesetzt. Als nächstes wird sie in Kundenprojekt eingesetzt und die Redakteure darauf losgelassen. Dabei werde ich sicher noch die eine oder andere Erweiterung entwickeln, <strong>mit mehreren Updates ist also zu rechnen</strong>. <a title="Der Interaktionsdesigner auf Twitter" href="http://twitter.com/paul_lunow/" target="_blank">Auf dem neusten Stand ist man natürlich bei Twitter</a>.</p>
<h2>Ausblick</h2>
<p>Der wichtigeste Punkt auf meiner Liste ist die <strong>Unterstützung von tt_news</strong>. Damit ist es dann auch möglich eine schön ausgearbeitete Nachricht zu teasern. Natürlich muss sich das nicht auf tt_news beschränken, <strong>sondern kann im Prinzip jeden beliebigen Datensatz beinhalten</strong>!</p>
<p>Darüber hinaus sind die Pläne natürlich groß und die Möglichkeiten auch. Ich denke an jQuery Effekte wie das faden von Inhalten, die Integration vom <a title="Der Kiwi Slider" href="http://www.interaktionsdesigner.de/category/kiwi-slider/" target="_blank">Kiwi Slider</a> oder das dynamische Anpassen der Inhalte.</p>
<p><strong>Da wird noch einiges passieren!</strong></p>
<h2>Fazit</h2>
<p>Ich möchte kein zweites tt_news programmieren, hier geht es wirklich nur um das Teasern von eigenen und fremden Inhalten. So bequem und einfach für die Redakteure wie möglich.</p>
<p>Ich hoffe ihr könnt die Extension gut einsetzen - über Ideen, Fragen und Anregungen in den Kommentaren freue ich mich natürlich. Und wenn jemand per GitHub mitarbeiten möchte, ist er hiermit herzlich eingeladen.</p>
<p>Ganz unauffällig sei auch noch auf meine Firma hingewiesen - wenn du die Extension oder ähnliches für dein Projekt brauchst, aber nicht selbst programmieren möchtest oder kannst, dann ist der <a title="Kiwi Service" href="http://www.kiwi-service.de" target="_blank">Kiwi Service</a> ein verantwortungsbewusster und kompetenter Partner!</p>
<p>Wenn dir der Artikel gefällt und du mit uns zusammen mehr solche Lösungen entwickeln möchtest, an das Internet und OpenSource glaubst und einen Job in Berlin suchst, dann <strong>bewirb dich bei uns</strong>. <a title="Webentwickler gesucht in Berlin" href="http://www.kiwi-service.de/jobs/" target="_blank">Wir suchen neue Freunde!</a></p>
<p><em>Danke fürs lesen, und fröhliches teasen!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/12/17/auf-inhalte-aufmerksam-machen-kiwi-teaser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mehrere Domains in einem TYPO3 Projekt verwalten</title>
		<link>http://www.interaktionsdesigner.de/2009/12/08/mehrere-domains-in-einem-typo3-projekt-verwalten/</link>
		<comments>http://www.interaktionsdesigner.de/2009/12/08/mehrere-domains-in-einem-typo3-projekt-verwalten/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 08:00:34 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=639</guid>
		<description><![CDATA[Viele kleinen Projekte brauchen keine eigene TYPO3 Installation. Eine einfache Seite, zum Beispiel mit News, ein paar persönlichen Seiten und einem Kontaktformular legt man nach diesem Tutorial an - ohne Installtion, neue Datenbank und noch einem Eintrag in der Liste für die Bugfix Updates. Aber inklusive RealURL!
Dieses Tutorial bezieht sich auf TYPO3 Version 4.3, aber [...]]]></description>
			<content:encoded><![CDATA[<p>Viele kleinen Projekte brauchen keine eigene TYPO3 Installation. Eine einfache Seite, zum Beispiel mit News, ein paar persönlichen Seiten und einem Kontaktformular legt man nach diesem Tutorial an -<strong> ohne Installtion</strong>, neue Datenbank und noch einem Eintrag in der Liste für die Bugfix Updates. Aber <strong>inklusive RealURL</strong>!</p>
<p>Dieses Tutorial bezieht sich auf TYPO3 <strong>Version 4.3</strong>, aber ich vermute es funktioniert in allen neueren Versionen. Los gehts!</p>
<p><span id="more-639"></span></p>
<h2>Vorbereitungen</h2>
<p>Eine aktuelle TYPO3 Installation mit benötigten Extensions (RealURL vorallem) und ein paar Domains die alle in das gleiche Verzeichnis zeigen. Das reicht.</p>
<h2>Die Seitenstruktur</h2>
<p><img class="alignleft size-full wp-image-641" title="Seitenstruktur mit mehreren Domains" src="http://www.interaktionsdesigner.de/wp-content/uploads/2009/12/mehrere-domains-1.jpg" alt="Seitenstruktur mit mehreren Domains" width="197" height="82" />Direkt unter die Weltkugel kommt die <strong>Root Seite</strong>. Diese beinhaltet ein grundlegendes <strong>Typoscript</strong>, dass sich alle Domains teilen. Es lohnt sich ein einfaches Layout aufzubauen und alle benötigten Marker anzulegen, dann kann man später schnell etwas zeigen. Auch tt_news, mailformplus, kiwi_slider oder was auch immer kann man hier schonmal gut <strong>Vorkonfigurieren</strong>.</p>
<p>Unter Root kriegt <strong>jede Domain eine eigene Seite</strong>. Die besitzen folgende Eigenschaften:</p>
<ul>
<li>Typ: Verweis - auf erste Unterseite</li>
<li>Im Menü verbergen</li>
<li>Seitentitel wie die Domain</li>
<li>Nicht in sprechende URL aufnehmen</li>
</ul>
<p>Jeder Seite müssen über <strong>Liste</strong> &gt; <strong>Neuer Datensatz</strong> &gt; <strong>System Records</strong> &gt; <strong>Domäne</strong> die entsprechenden Domains zugewiesen werden. Am besten man legt als erstes die Hauptdomain an, zum Beispiel www.kiwi-service.de - <strong>ohne Umleitung</strong>.</p>
<p>Ein zweiter Datensatz kriegt dann die Domäne kiwi-service.de <strong>mit Umleitung</strong> auf www.kiwi-service.de. Die Checkbox Parameter zur Umleitungs-URL übertragen sollte man anschalten und speichern.</p>
<h2>Typoscript</h2>
<p>Auf der Root Seite lohnt es sich ein fertiges Template aufzubauen. Die wichtigesten Marker, wie Menü, Inhalt und Sidebar empfehle ich als <strong>COA Elemente</strong> anzulegen, wobei der Hauptinhalt immer auf Ebene 50 eingebunden wird. Damit kann man auf den Unterseiten einfach die Marker erweitern.</p>
<p>Über Konstanten lässt sich sehr viel steuern. Zum Beispiel die <strong>Start ID für das Menü</strong>. Dazu legt man in den Konstanten einen beliebigen Namen fest:</p>
<pre><code class=''>menu.special.value = 123</code></pre>
<p>Im Typoscript kann man auf diese Eigenschaften dann über die Syntax <strong>{$NAME}</strong> zugreifen. Vereinfacht könnte das dann so aussehen:</p>
<pre><code class=''>MENU = COA<br />
MENU.50 = TMENU<br />
MENU.50.special.value = {$menu.special.value}</code></pre>
<p>Mit diesem Vorgehen kann dann jede Seite grundlegend über Konstanten steuern. Man sollte es aber nicht übertreiben. Ideal sind die Grundeinstellungen damit man etwas sieht und klicken kann, alle Strukur- und Layoutanpassungen passieren dann gezielt im Extensiontemplate der Seite.</p>
<p>Am wichtigesten ist die Bekanntmachung der <strong>BaseURL</strong>. Entweder über Konstanten oder direkt im Template:</p>
<pre><code class=''>config.baseURL = http://www.kiwi-service.de</code></pre>
<h2>RealURL</h2>
<p>Jetzt zum schönsten Teil (<em>leichte Ironie</em>), damit man sich über die netten Domains freuen kann: <strong>RealURL</strong>. Installiert, ohne automatische Konfiguration ist die wichtigste Aufgabe, für jede Domain die richtige <strong>rootpage_id</strong> zu setzen.</p>
<p>Um sowenig wie möglich doppelt zu schreiben, legt man dafür als erstes eine Standardkonfiguration an:</p>
<pre><code class=''>$tx_realurl_config = array(<br />
'init' =&gt; array(<br />
'enableCHashCache' =&gt; true,<br />
'appendMissingSlash' =&gt; 'ifNotFile',<br />
'enableUrlDecodeCache' =&gt; true,<br />
'enableUrlEncodeCache' =&gt; true,<br />
'emptyUrlReturnValue' =&gt; '/',<br />
),<br />
'preVars' =&gt; array(),<br />
'postVarSets' =&gt; array(<br />
'_DEFAULT' =&gt; array(),<br />
),<br />
'pagePath' =&gt; array(<br />
'type' =&gt; 'user',<br />
'userFunc' =&gt; 'EXT:realurl/class.tx_realurl_advanced.php:&amp;tx_realurl_advanced-&gt;main',<br />
'spaceCharacter' =&gt; '_',<br />
'languageGetVar' =&gt; 'L',<br />
'expireDays' =&gt; 3,<br />
),<br />
);</code></pre>
<p>Die ist für alle gleich und sollte auch Konfigurationen für tt_news und andere Extensions beinhalten. Diese wird jetzt jeder <strong>Hauptdomain</strong> zugewiesen.</p>
<pre><code class=''>$TYPO3_CONF_VARS['EXTCONF']['realurl'] = array(<br />
&nbsp;&nbsp;'www.alexandrepeschel.de' =&gt; $tx_realurl_config,<br />
&nbsp;&nbsp;'www.kiwi-service.de' =&gt; $tx_realurl_config,<br />
);</code></pre>
<p>Die Aufrufe ohne www kann man vernachlässigen, weil TYPO3 sie weiterleitet. Als nächstes wird für jede Domain die <strong>UID</strong> der entsprechenden TYPO3 Einstiegsseite angegeben. Damit versteht RealURL dann, welcher Teil des Seitenbaums zu welcher Domain gehört.</p>
<pre><code class=''>$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.kiwi-service.de']['pagePath']['rootpage_id'] = 12;<br />
$TYPO3_CONF_VARS['EXTCONF']['realurl']['www.alexandrepeschel.de']['pagePath']['rootpage_id'] = 34;</code></pre>
<p>Beim rumprobieren sollte man daran denken, dass man mit dem Leeren vom Frontend-Cache <strong>nicht</strong> den RealURL-Cache löscht! Das passiert über <strong>Info</strong> &gt; <strong>Root Seite</strong> &gt; <strong>RealURL-Verwaltung</strong>. Da sind sehr interessante Informationen drin versteckt!</p>
<h2>Fazit</h2>
<p>Das war schnell und effektiv! Wer sich das in Aktion ansehen will, geht auf unsere neue Firmenseite <a title="Die neue Agentur aus Berlin" href="http://www.kiwi-service.de" target="_blank">www.kiwi-service.de</a> und auf <a title="Alexandre Peschel" href="http://www.alexandrepeschel.de" target="_blank">www.alexandrepeschel.de</a>, die Seite meines lieben Kollegen. Im Moment ist das zum Teil im Aufbau und demnächst wird meine persönliche Seite auch dahin umziehen. Aber erst wenn die Seite auf dem neuen Server liegt!</p>
<p>Wenn du Spaß an diesem Tutorial hattest, und Lust hast mit uns noch <strong>viel mehr geilen Scheiß</strong> zu entwickeln, dann bewirb dich bei uns! <a title="Agentur aus Berlin sucht coole Leute!" href="http://www.kiwi-service.de/jobs/" target="_blank">Wir suchen Webentwickler mit Ideen und Tatendrang!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/12/08/mehrere-domains-in-einem-typo3-projekt-verwalten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TYPO3 Klickvergrößern durch eine jQuery Lightbox ersetzen</title>
		<link>http://www.interaktionsdesigner.de/2009/12/04/typo3-klickvergrosern-durch-eine-jquery-lightbox-ersetzen/</link>
		<comments>http://www.interaktionsdesigner.de/2009/12/04/typo3-klickvergrosern-durch-eine-jquery-lightbox-ersetzen/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 13:07:44 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=629</guid>
		<description><![CDATA[Wenn jQuery auf einer Seite eingebunden ist (z.B. durch die coole Extension Kiwi Slider) dann beißt sich das Javascriptframework mit anderen wie MooTools oder Prototype. Insgesamt sollte man bevorzugt ein Framework einsetzen, wenn man unbedingt beide braucht, dann lohnt sich die Suche nach dem NoConflict Mode von jQuery.
Wenn aber das unbedingt nur von einer Lightbox [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn jQuery auf einer Seite eingebunden ist (z.B. durch die coole Extension <a title="Kiwi Slider" href="http://www.interaktionsdesigner.de/2008/09/09/typo3-extension-kiwi-slider-2/">Kiwi Slider</a>) dann beißt sich das Javascriptframework mit anderen wie MooTools oder Prototype. Insgesamt sollte man bevorzugt ein Framework einsetzen, wenn man unbedingt beide braucht, dann lohnt sich die Suche nach dem <a title="jQuery noConflict" href="http://docs.jquery.com/Core/jQuery.noConflict" target="_blank">NoConflict Mode</a> von jQuery.</p>
<p>Wenn aber das <em>unbedingt</em> nur von einer Lightbox kommt, dann sollte man sich kurz hinsetzen, einen geeigneten Klon aussuchen (<a title="Lightboxclone Matrix" href="http://planetozh.com/projects/lightbox-clones/" target="_blank">hier ist die große Lightbox Matrix</a>) und die <strong>Klickvergrößerung von TYPO3</strong> damit ersetzen. Das ist schnell, effektiv und in diesem Beitrag erklärt.<span id="more-629"></span></p>
<h2>Vorbereitungen</h2>
<p>Für mein aktuelles Projekt habe ich mich für den Lightbox Clone <a title="TopUp" href="http://gettopup.com/" target="_blank">TopUp</a> entschieden. Sieht sehr vielversprechend aus. Also welcher Klone auch immer: <strong>Daten herunterladen</strong> und <strong>ins Projekt einbinden</strong>. Dazu gehören mind. jQuery und das entsprechende Plugin, in vielen Fällen auch noch eine CSS Datei. Firebug verrät im <em>Script</em> Reiter ob es funktioniert hat.</p>
<p>TopUp benötigt keine CSS Datei, dafür aber <strong>einen Bilder- und einen Players-Ordner</strong> in dem SWF Dateien gespeichert sind um verschiedene Medien wiederzugeben. Per JavaScript können die Pfade angepasst werden:</p>
<pre><code class=''>TopUp.host = 'http://www.kiwi-service.de/';<br />
TopUp.images_path = 'fileadmin/template/img/topup/';<br />
TopUp.players_path = 'fileadmin/template/flash/';</code></pre>
<h2>JavaScript einbinden</h2>
<p>Eine Besonderheit bringt TopUp mit: Es lädt dynamisch die benötigten JavaScriptdateien nach. Dafür braucht er den <strong>kompletten javascripts/jquery Ordner</strong>. Dieser muss im gleichen Ordner liegen wie <strong>top_up-min.js</strong>.</p>
<pre><code class=''>fileadmin/template/js/top_up-min.js<br />
fileadmin/template/js/jquery/...</code></pre>
<h2>Test</h2>
<p>Alle benötigten Dateien sind eingebunden und in Firebug sichtbar. Um zu testen ob es funktioniert, füge ich ein Inhaltselement vom Typ HTML ein und schreibe mein eigenes Bild rein. Testbilder sind im <em>Images</em> Ordner vorhanden.</p>
<pre><code class=''>&lt;a href="fileadmin/template/img/topup/photos/1.jpg" class="top_up"&gt;<br />
&nbsp;&nbsp;&lt;img src="fileadmin/template/img/topup/thumbnails/1.jpg"&gt;<br />
&lt;/a&gt;</code></pre>
<p>Funktioniert, wunderbar! Wenn nicht, dann die eigene Seite mit den <a title="TopUp Beispiele" href="http://gettopup.com/examples" target="_blank">Beispielen</a> vergleichen.</p>
<h2>Typoscript</h2>
<p>Nun muss man <strong>TYPO3</strong> noch das hässliche JavaScript PopUp austreiben. Hier mein Konfiguration für <strong>Version 4.3</strong></p>
<pre><code class=''>temp.imageLinkWrap = 1<br />
temp.imageLinkWrap {<br />
enable = 1<br />
typolink {</p>
<p>parameter.cObject = IMG_RESOURCE<br />
parameter.cObject.file.import.data = TSFE:lastImageInfo|origFile<br />
parameter.cObject.file.maxW = {$styles.content.imgtext.maxW}<br />
parameter.override.listNum.stdWrap.data = register : IMAGE_NUM_CURRENT</p>
<p>title.field = imagecaption // title<br />
title.split.token.char = 10<br />
title.if.isTrue.field = imagecaption // header<br />
title.split.token.char = 10<br />
title.split.returnKey.data = register : IMAGE_NUM_CURRENT<br />
parameter.cObject = IMG_RESOURCE<br />
parameter.cObject.file.import.data = TSFE:lastImageInfo|origFile<br />
ATagParams = target="_blank"<br />
}<br />
}</p>
<p>tt_content.image.20.1.imageLinkWrap &gt;<br />
tt_content.image.20.1.imageLinkWrap &lt; temp.imageLinkWrap<span> </span></code></pre>
<p>Als erstes wird das temporäre Objekt <strong>temp.imageLinkWrap</strong> erzeugt und konfiguriert. Interessant ist die letzte Angabe <strong>ATagParams</strong> - darüber gibt man jedem Link die Klasse <em>top_up</em> mit, damit das Plugin sich um die Bilder kümmert.</p>
<p>Anschließend wird die Standardvergrößerung in <strong>tt_content.image.20.1.imageLinkWrap</strong> überschrieben. <strong>Cache leeren</strong> und Seite neuladen, fertig!</p>
<h2>TopUp Spezialitäten</h2>
<p>Dieses TopUp ist wirklich ein schönes Teil. Mit der Funktion <strong>addPresets()</strong> lassen sich für Links in DOM Bereichen Voreinstellungen treffen. Zum Beispiel alle Bilder die über <strong>ein Inhaltselement</strong> eingestellt sind, zu einer Gruppe zusammenfassen:</p>
<pre><code class=''>TopUp.addPresets({<br />
".csc-textpic-imagewrap a": {<br />
group: "images"<br />
}<br />
});</code></pre>
<p>Das bedeutet alle TopUp-Links im Div <strong>.csc-textpic-imagewrap</strong> werden der Gruppe <em>images</em> zugewiesen. Im Overlay gibts dann Vor- und Zurückpfeile.</p>
<h2>Fazit</h2>
<p>Die Initialisierung und Einstellungen einer Lightbox variieren natürlich. Es gibt aber ein paar schöne und elegante Tools deren Einsatz sich lohnen. Vorallem im Zusammenspiel mit der brand neuen TYPO3 Version 4.3 - ein großartiger Schritt mit schönen Verbesserungen. Unbedingt ansehen. Und TopUp einbinden!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/12/04/typo3-klickvergrosern-durch-eine-jquery-lightbox-ersetzen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
