<?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; TYPO3</title>
	<atom:link href="http://www.interaktionsdesigner.de/category/typo3/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>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>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>
		<item>
		<title>Einen Mini-Blog mit TYPO3 realisieren</title>
		<link>http://www.interaktionsdesigner.de/2009/10/11/einen-mini-blog-mit-typo3-realisieren/</link>
		<comments>http://www.interaktionsdesigner.de/2009/10/11/einen-mini-blog-mit-typo3-realisieren/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 10:26:11 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=613</guid>
		<description><![CDATA[Der Kiwi Service (meine Firma) hat mit großer Freude sein neustes Projekt realisert: Der Internetauftritt der Lauscherlounge erstrahlt in schönem neuen Design und bietet mit TYPO3 im Hintergrund den gewohnten Komfort, die Trauer aber vorallem die Freude und Effizienz!
Eine von vielen schönen Kleinigkeiten ist Olis Notziblog auf der rechten Seite. Es handelt sich um ein [...]]]></description>
			<content:encoded><![CDATA[<p>Der <a title="Computer und Medienservice aus Berlin" href="http://www.kiwi-service.de" target="_blank">Kiwi Service</a> (meine Firma) hat mit großer Freude sein neustes Projekt realisert: Der Internetauftritt der <a title="Kiwi realisiert den Relaunch der Lauscherlounge" href="http://www.lauscherlounge.de" target="_blank">Lauscherlounge</a> erstrahlt in schönem neuen Design und bietet mit TYPO3 im Hintergrund den gewohnten Komfort, die Trauer aber vorallem die Freude und Effizienz!</p>
<p>Eine von vielen schönen Kleinigkeiten ist <strong>Olis Notziblog</strong> auf der rechten Seite. Es handelt sich um ein Widget in dem immer mal wieder, unkompliziert neue Inhalte eingetragen werden sollen. Das Besondere ist, dass ein Inhalt aus einem Bild (der Handschrift) und der Abschrift besteht. Sprich <strong>Text mit Bild</strong>. Das kommt dem geschulten TYPO3 Ohr natürlich bekannt vor. Und genauso werden die Daten vorgehalten. <strong>In Contentelementen.</strong></p>
<p>Dieses Tutorial beschreibt die <strong>Einrichtung</strong>, <strong>Verwaltung</strong> und <strong>Ausgabe</strong> eines Miniblogs, der einfach zu pflegen ist und Informationen ohne große Funktionen zur Verfügung stellt.</p>
<p><span id="more-613"></span></p>
<h2>Backend</h2>
<p>Es wird eine <strong>nicht im Menü sichtbare Seite</strong> angelegt, dem Redakteur freigegeben und die ID (z.B. <em>50</em>) notiert. Hier sollte man jetzt testweise einen Inhalt anlegen. Soweit sehr einfach.</p>
<h2>Typoscript</h2>
<p>Entweder wird ein <strong>eigener Marker</strong> im Template festgelegt, oder, was ich empfehlen würde, der Marker für die rechte Spalte wird als <strong>COA</strong> angelegt. COA beschreibt eine Sammlung von Objekten die nacheinander ausgegeben werden. Im ersten Schritt soll schlicht der <strong>Inhalt der rechten Spalte</strong> aus dem Backend ausgegeben werden:</p>
<pre><code class=''>page.10.marks.RIGHT = COA<br />
page.10.marks.RIGHT.50 = CONTENT<br />
page.10.marks.RIGHT.50 {<br />
&nbsp;&nbsp;table = tt_content<br />
&nbsp;&nbsp;select.orderBy = sorting<br />
&nbsp;&nbsp;select.where = colPos = 2<br />
&nbsp;&nbsp;select.languageField = sys_language_uid<br />
}</code></pre>
<p>Mit dieser Struktur, die man auch bedenkenlos für die linke und die Hauptspalte benutzen kann, hat man <strong>absolute Flexibilität</strong> auf den Unterseiten. Olis Blog erscheint nur auf der Startseite. Also wird ein <strong>Extensiontemplate</strong> angelegt und der Marker <em>RIGHT</em> erweitert:</p>
<pre><code class=''>page.10.marks.RIGHT.40 = PHP_SCRIPT<br />
page.10.marks.RIGHT.40.file = fileadmin/template/scripts/olis_notizblog.php</code></pre>
<p>Vor dem Menü wird dem Marker ein <strong>PHP Script </strong>hinzugefügt.</p>
<h2>PHP Script</h2>
<p>Jetzt ist es nicht mehr weit. Hinter oben angegebenen Pfad erstellt man eine Datei. Zwei Dinge muss man beachten:</p>
<ol>
<li>Alle Inhalte die später im Marker erscheinen sollen, müssen in die Variable <em>$content </em>geschrieben werden</li>
<li>Auch wenn der Testserver die PHP Kurzschreibweise <em>&lt;? ... ?&gt;</em> unterstützt, sollte man diese nicht mehr verwenden! In PHP 6 soll sie abgeschafft werden und etliche Konfigurationen verbieten sie jetzt schon, was zur Folge hat, dass der Code einfach als Text ausgegeben wird.</li>
</ol>
<p>Die erste Aufgabe besteht darin, das neuste Element aus der <strong>tt_content Tabelle</strong> auszulesen. Es muss also nach Zeit sortiert werden und das Element muss auf der richtigen Seite gespeichert werden (<em>ID 50</em>). Das erreicht man über die Abfrage der Spalte <strong>PID</strong>.</p>
<pre><code class=''>$posts = $GLOBALS['TYPO3_DB']-&gt;exec_SELECTgetRows(<br />
&nbsp;&nbsp;'uid, header, bodytext, image',<br />
&nbsp;&nbsp;'tt_content',<br />
&nbsp;&nbsp;'pid = "50" AND deleted = "0" AND hidden = "0"',<br />
&nbsp;&nbsp;'',<br />
&nbsp;&nbsp;'sorting ASC',<br />
&nbsp;&nbsp;1<br />
);</code></pre>
<p>Der äußerst praktische Befehl <em>exec_SELECTgetRows</em> erwartet folgende Parameter: auszulesende Felder, gewünschte Tabelle, WHERE-Bedingung, eventuell Gruppierung, Bedingung zum Sortieren und die Anzahl der erwarteten Ergebnisse.</p>
<p>Das kann man sich natürlich nur schwer merken, aber dafür gibt es zum Glück eine <a title="TYPO3 API" href="http://typo3.org/fileadmin/typo3api-4.2.6/" target="_blank">Dokumentation</a> zum nachsehen.</p>
<p><em>exec_SELECTgetRows</em> liefert im Gegensatz zu <em>exec_SELECTquery</em> keine Datenbankressource zurück, sondern ein Objekt über alle gefundenen Zeilen. In unserem Fall ist das nur eine und es wird auch immer eine bleiben, deshalb kann man immer so an sie herankommen:</p>
<pre><code class=''>$post = $posts[0];</code></pre>
<p>Jetzt ist es nur noch eine Frage der Anforderung und einer testweisen Ausgabe mit <em>print_r($post)</em> um ein Ergebnis zu erhalten:</p>
<pre><code class=''>$content = '&lt;div class="blog"&gt;';<br />
$content.= '&lt;h3&gt;'.$post['header'].'&lt;/h3&gt;';<br />
$content.= '&lt;p&gt;'.$post['bodytext'].'&lt;/p&gt;';<br />
$content.= '&lt;/div&gt;';</code></pre>
<h2>Fazit</h2>
<p>Fertig ist der Lack/<strong>Blog</strong>! Über dem Hauptmenü erscheint jetzt immer das neuste Element aus der versteckten Seite. Sicher hätte man das ganze auch mit puren Typoscript lösen können, aber meiner Ansicht nach ist diese Lösung flexibler. Eventuell sollen die Inhalte demnächst auf Twitter, Facebook, MySpace und SpiegelOnline erscheinen. Da ist es dann schön ein Script zur Verfügung zu haben, in dem man sich austoben kann.</p>
<p>Bleibt noch zu sagen, <a title="Hörbücher, großartige Literatur bei der Lauscherlounge!" href="http://www.lauscherlounge.de" target="_blank">hört mehr Hörbücher</a>!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/10/11/einen-mini-blog-mit-typo3-realisieren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TYPO3 Seiten und tt_news Kategorien synchron halten</title>
		<link>http://www.interaktionsdesigner.de/2009/09/30/typo3-seiten-und-tt_news-kategorien-synchron-halten/</link>
		<comments>http://www.interaktionsdesigner.de/2009/09/30/typo3-seiten-und-tt_news-kategorien-synchron-halten/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 13:40:15 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=608</guid>
		<description><![CDATA[Heute mal wieder ein richtig schönes Thema: Es geht um Seiten in einem TYPO3 Projekt und Nachrichten, die zu diesen Seiten gehören. Die Anforderung besteht darin, beim anlegen oder verändern von Seiten tt_news Kategorien auf dem gleichen Stand zu halten.
Legt der Redakteur eine neue Seite Namens "Zimmerschlacht" an, könnte er anschließend in die Listenansicht wechseln [...]]]></description>
			<content:encoded><![CDATA[<p>Heute mal wieder ein richtig schönes Thema: Es geht um Seiten in einem TYPO3 Projekt und Nachrichten, die zu diesen Seiten gehören. Die Anforderung besteht darin, beim <strong>anlegen</strong> oder <strong>verändern</strong> von Seiten <strong>tt_news Kategorien</strong> auf dem gleichen Stand zu halten.</p>
<p>Legt der Redakteur eine neue Seite Namens "<em>Zimmerschlacht</em>" an, könnte er anschließend in die Listenansicht wechseln und eine neue <strong>News Kategorie</strong> anlegen. Aber mach das mal einem <em>DAR</em> (analog zu DAU) klar. Und warum den Mund fusselig reden, wenn das auch <strong>automatisch</strong> geht?!</p>
<p>Es gibt in TYPO3 eine Möglichkeit mit einem Hook in das <strong>Speichern von Datensätzen</strong> einzugreifen. Da kann man sich dann austoben. Es funktioniert auch mit <strong>DAM Kategorien</strong> und jeder anderen vorstellbaren <strong>Datenbankanforderung</strong>.</p>
<p><span id="more-608"></span></p>
<h2>Vorbereitung</h2>
<p>Wenn der Redakteur in einem bestimmten Zweig des Seitenbaums eine Aktion auslöst (neue Seite erstellen, bearbeiten oder löschen) muss mit einem Script darauf reagiert werden. Dafür legt man an seinem <strong>Lieblingsplatz</strong> eine Datei an und merkt sich sowohl Pfad und Namen. Mein Vorschlag:</p>
<pre><code class=''>fileadmin/template/hooks/class.tx_createCategories_tcemainprocdm.php</code></pre>
<p>In dieser Datei sucht TYPO3 später eine Klasse deren Namen wir auch selbst bestimmen können.</p>
<pre><code class=''>class tx_createCategories_tcemainprocdm {<br />
}</code></pre>
<h2>Hooks verstehen</h2>
<p>Hooks sind Funktionen die während der Abarbeitung eines Scripts aufgerufen werden. Meistens erstellt TYPO3 ein <strong>Objekt von der übergebenen Klasse</strong> und das Script sucht nach einer passenden Funktion mit <strong>fest definiertem Namen</strong>.</p>
<h2>Hooks suchen</h2>
<p>Google ist natürlich Anlaufpunkt Nummer eins, aber auch der <strong>Quelltext</strong> der betreffenden Datei bietet gute Anhaltspunkte. Wie die Vorschläge oben schon deutlich machen geht es mir um <em>class.t3lib_tcemain.php</em> welches sich um sämtliche Datenbankoperationen kümmert. Die <a href="http://typo3.org/documentation/document-library/core-documentation/doc_core_api/4.2.0/view/" target="_self">Core API</a> bietet einen guten Anlaufpunkt. Nach einigem hin und her weiß man dann, dass man den Hook Namens <em>processDatamap_afterDatabaseOperations</em> braucht.</p>
<h2>Hooks registrieren</h2>
<p>Über die Datei <em>localconf.php</em> wird das <em>$GLOBALS Array</em> erweitert. Die genauen Bezeichnungen findet man meistens in der Dokumentation oder dem Quelltext. Um auf das verändern von Seiten zu reagieren muss man folgende Zeile hinzufügen:</p>
<pre><code class=''>$GLOBALS["TYPO3_CONF_VARS"]["SC_OPTIONS"]["t3lib/class.t3lib_tcemain.php"]["processDatamapClass"][] = "fileadmin/template/hooks/class.tx_createCategories_tcemainprocdm.php:tx_createCategories_tcemainprocdm";</code></pre>
<p>Der Inhalt dieser Angabe ist in zwei Teile durch ein Doppelpunkt geteilt: Der erste gibt den <strong>Pfad zur Datei</strong> an, der zweite den <strong>Namen der zu initalisierenden Klasse</strong>.</p>
<p><big><strong>Nicht vergessen den Cache zu löschen!!!</strong></big> Sonst ärgert man sich zu tode!</p>
<h2>Logik hinzufügen</h2>
<p>Bis hierher alles klar? TYPO3 erstellt eine neue Seite, initalisiert anschließend das eben angegebene Objekt und sucht darin die Funktion <em>processDatamap_afterDatabaseOperations</em> und führt sie aus. In dem Script im fileadmin legt man also los und führt aus was man ausführen muss:</p>
<pre><code class=''>class tx_createCategories_tcemainprocdm {<br />
&nbsp;&nbsp;function processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, &amp;$reference) {<br />
&nbsp;&nbsp;}<br />
}</code></pre>
<p>Spannend sind die Parameter:</p>
<ul>
<li><strong>$status</strong> gibt an, was der User getan hat. z.B. "new"</li>
<li><strong>$table</strong> sagt, in welcher Tabelle der User es getan hat. z.B. "pages"</li>
<li><strong>$id</strong> beinhaltet die UID des Datensatzes (aber mit Einschränkungen! Siehe unten).</li>
<li><strong>$fieldArray</strong> enthält die neuen Felder. Wenn der Redakteur nur den Titel geändert hat, dann steht hier nur der neue Titel in einem assoziativen Array drin.</li>
<li><strong>$reference</strong> ist ein Objekt und beinhaltet die ggf. schon vorhandenen Inhalte.</li>
</ul>
<p>Mit diesen Informationen ausgerüstet kann man schon eine ganze Menge erreichen. Mit einem <em>echo</em> kann man sich auch ohne Probleme Daten ausgeben. Die erscheinen dann über dem Formular im Backend. Sieht nicht schön aus, aber man kann etwas lesen.</p>
<h2>Die richtige UID erkennen</h2>
<p>Das Problem ist, dass bei einem neuen Datensatz im Parameter <em>$id</em> eine temporäre UID gespeichert ist. Irgendwas wie<em> NEW_2352</em>. Also definitiv keine Integer sondern ein <strong>String</strong>. Der Hook wird aber nach dem Speichern ausgeführt, deshalb muss man sich über <em>$reference</em> die richtige UID besorgen:</p>
<pre><code class=''>if(!is_numeric($id)) {<br />
&nbsp;&nbsp;$id = $reference-&gt;substNEWwithIDs[$id];<br />
}</code></pre>
<p>Das habe ich auch nur in irgendeiner Mailingliste aufgeschnappt. Selbsterklärend ist etwas anderes.</p>
<h2>Neue Kategorien anlegen</h2>
<p>Zurück zur Anforderung. Wenn ein Redakteur eine neue Seite anlegt, muss <strong>eine neue Kategorie angelegt</strong> werden. Dafür muss als erstes geprüft werden, ob überhaupt eine Seite angelegt wurde und der Titel geändert wurde:</p>
<pre><code class=''>if($table == 'pages' &amp;&amp; $id &gt; 0 &amp;&amp; !empty($fieldArray['title']) {<br />
&nbsp;&nbsp;//hier gehts weiter<br />
}</code></pre>
<p>In dieser Abfrage muss auch noch geklärt werden, ob sich die Seite an der richtigen Stelle befindet. Das kann man über die <strong>PID</strong> erreichen oder wie in meinem Fall über einen eigenen Seitentyp. Beide Angaben findet man im Array <em>$reference-&gt;checkValue_currentRecord</em>.</p>
<pre><code class=''>if($status == 'new')</code></pre>
<p>Endlich mal wieder etwas schönes. Alternativ könnte man auch mit Switch auf die verschiedenen Operationen reagieren. Je nach Vorliebe. Wurde also eine neue Seite an der richtigen Position angelegt, wird nichts weiter getan als eine Zeile in der Tabelle <em>tt_news_cat</em> zu speichern:</p>
<pre><code class=''>$GLOBALS['TYPO3_DB']-&gt;exec_INSERTquery(<br />
&nbsp;&nbsp;'tt_news_cat',<br />
&nbsp;&nbsp;array(<br />
&nbsp;&nbsp;[tab]'pid' =&gt; 194,<br />
&nbsp;&nbsp;[tab]'title' =&gt; $fieldArray['title'],<br />
&nbsp;&nbsp;[tab]'shortcut' =&gt; $id<br />
&nbsp;&nbsp;)<br />
);</code></pre>
<h2>Seiten und Kategorien umbenennen</h2>
<p>Da kommt nochmal das Array <em>$reference-&gt;checkValue_currentRecord</em> zum Einsatz. Wird eine Seite aktualisiert steht dort der alte Titel drin und im <em>$fieldArray</em> der neue. Schöne Sache das und nur eine handvoll Zeilen um die entsprechende Kategorie zu <strong>identifizieren</strong> und <strong>umzubenennen</strong>:</p>
<pre><code class=''>$GLOBALS['TYPO3_DB']-&gt;exec_UPDATEquery(<br />
&nbsp;&nbsp;'tt_news_cat',<br />
&nbsp;&nbsp;'title = "'.$reference-&gt;checkValue_currentRecord['title'].'"',<br />
&nbsp;&nbsp;array(<br />
&nbsp;&nbsp;[tab]'title' =&gt; $fieldArray['title']<br />
&nbsp;&nbsp;)<br />
);</code></pre>
<p>Nach diesen beiden Beispielen sollte das Löschen auch keine Schwierigkeiten mehr bereiten. Der Redakteur wird es gar nicht bemerken, aber der effektive Teil vom Webentwicklerherz schlägt jetzt schon schneller.</p>
<p>Mit ein bisschen PHP Erfahrung sollte man sich unbedingt mit den <strong>Hooks</strong> auseinander setzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/09/30/typo3-seiten-und-tt_news-kategorien-synchron-halten/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ein TYPO3 Menü mit PHP erweitern</title>
		<link>http://www.interaktionsdesigner.de/2009/07/06/ein-typo3-menu-mit-php-erweitern/</link>
		<comments>http://www.interaktionsdesigner.de/2009/07/06/ein-typo3-menu-mit-php-erweitern/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:36:26 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=549</guid>
		<description><![CDATA[Wie wahrscheinlich alle schon gelesen haben, kann meine neuste Extension das TYPO3 Hauptmenü um beliebige Punkte erweitern.
Nötig wurde das, weil Datensätze der neuen Extension über das Hauptmenü erreichbar sein sollen. Das ist doch mal wieder eine richtig schöne Aufgabe die Dank der Genialität von Typoscript auch einfach erledigt werden kann.
Und so funktionierts.

Es fängt mit einem [...]]]></description>
			<content:encoded><![CDATA[<p>Wie wahrscheinlich <a title="Paul Lunow twittert" href="http://twitter.com/paul_lunow/status/2497087195" target="_blank">alle schon gelesen haben</a>, kann meine neuste Extension das<strong> TYPO3 Hauptmenü</strong> um beliebige Punkte <strong>erweitern</strong>.</p>
<p>Nötig wurde das, weil Datensätze der neuen Extension über das Hauptmenü erreichbar sein sollen. Das ist doch mal wieder eine richtig schöne Aufgabe die Dank der Genialität von <strong>Typoscript</strong> auch einfach erledigt werden kann.</p>
<p><em>Und so funktionierts.</em></p>
<p><span id="more-549"></span></p>
<p>Es fängt mit einem ganz <strong>normalen Menü</strong> an.</p>
<pre><code class='html'>MENU = HMENU<br />
MENU {<br />
&nbsp;&nbsp;special = directory<br />
&nbsp;&nbsp;special.value = 1<br />
&nbsp;&nbsp;noBlur = 1</p>
<p>&nbsp;&nbsp;1 = TMENU<br />
&nbsp;&nbsp;1.NO = 1<br />
&nbsp;&nbsp;1.NO.wrapItemAndSub = &lt;li&gt;|&lt;/li&gt;<br />
&nbsp;&nbsp;1.NO.ATagParams = class="first" |*| class="" |*| class="last"</p>
<p>&nbsp;&nbsp;1.ACT = 1<br />
&nbsp;&nbsp;1.ACT &lt; .1.NO<br />
&nbsp;&nbsp;1.ACT.wrapItemAndSub = &lt;li class="activ"&gt;|&lt;/li&gt;<br />
&nbsp;&nbsp;1.ACT.ATagParams = class="first activ" |*| class="activ" |*| class="activ last"</p>
<p>&nbsp;&nbsp;1.wrap = &lt;ul&gt;|&lt;/ul&gt;</p>
<p>&nbsp;&nbsp;2 &lt; .1<br />
}</code></pre>
<p>Dieses Typoscript erzeugt ein verschachteltes Menü, wobei den Links und den umschließenden Li-Tags noch einige Klassen mitgegeben werden, damit sie besser stylebar sind.</p>
<p>Wenn das funktioniert kommen wir zum spannenden Teil. Über die <strong>StdWrap</strong> Eigenschaft wird ein <strong>PHP Script</strong> geladen, das an beliebiger Stelle im Projekt liegen kann. Zum Beispiel im Ordner <em>fileadmin</em>.</p>
<pre><code class='html'>page.10.marks.MENU.1.NO.stdWrap.outerWrap<br />
page.10.marks.MENU.1.NO.stdWrap.outerWrap {<br />
&nbsp;&nbsp;cObject = PHP_SCRIPT<br />
&nbsp;&nbsp;cObject.file = fileadmin/script_mainmenu.php<br />
}</code></pre>
<p>In dem Script wird ein Submenü eingefügt, deshalb benutze ich <strong>outerWrap</strong>, wenn man nur den Linktext bearbeiten möchte, dann langt auch der <strong>innerWrap</strong>. Aus dem PHP Script muss jetzt<strong> ein gültiger Wert</strong> kommen, der den aktuellen Eintrag umschließt.</p>
<pre><code class='php'>$content = "Hallo Menüpunkt: |";</code></pre>
<p>Damit die Rückgabe aus dem Script weiter verarbeitet werden kann, muss sie in der Variable <em>$content</em> stehen. Das Script wird mit <em>include</em> direkt eingebunden, deshalb stehen eine Reihe Daten zur Verfügung. Eine kleine, praktische Auswahl:</p>
<ul>
<li><strong>t3lib_div::_GP($key)</strong> um auf Parameter zu reagieren.</li>
<li><strong>$this-&gt;data</strong> beinhaltet die komplette Zeile aus der Datenbank, welche die Seite repräsentiert, deren Menüpunkt gerade gerendert wird.</li>
<li><strong>$GLOBALS</strong> mit allen üblichen Werten, z.B. <strong>$GLOBALS['TYPO3_DB']</strong> um auf die Datenbank zuzugreifen.</li>
</ul>
<p>In meinem Fall soll also nur bei<strong> einer bestimmten Seiten ID</strong> etwas passieren, nehmen wir an das ist die <strong>ID 123</strong>. Dann sieht das Script ungefähr so aus:</p>
<pre><code class='php'>if($this-&gt;data['uid'] == 123) {<br />
&nbsp;&nbsp;$content = '|&lt;ul&gt;&lt;li&gt;Weiter...&lt;/li&gt;&lt;/ul&gt;';<br />
}<br />
else {<br />
&nbsp;&nbsp;$content = '|';<br />
}</code></pre>
<p><strong><br />
Tipp 1</strong><br />
So ist es möglichdem mit einem PHP Script das Menü nach belieben zu erweitern. Man kann auch direkt Variablen an sein Script übergeben, in dem man dem <strong>cObject</strong> einfach weitere Parameter anhängt:</p>
<pre><code class='html'>page.10.marks.MENU.1.NO.stdWrap.outerWrap.cObject.hallo = Welt</code></pre>
<p>Diese stehen dann im Script in der Variable <em>$conf</em> zur Verfügung.<br />
<strong>Tipp 2</strong><br />
Wenn man verhindern möchte, dass das Script im Cache landet (was es standardmäßig tut), dann muss man das ansagen:</p>
<pre><code class='php'>$GLOBALS['TSFE']-&gt;set_no_cache();</code></pre>
<p>Vergisst man diese Zeile dann kann das zu einigen Verwirrungen führen, wenn man auf Benutzereingaben reagiert.</p>
<p>Das wars! Hoffe es hilft jemandem weiter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/07/06/ein-typo3-menu-mit-php-erweitern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDFs erstellen mit TYPO3</title>
		<link>http://www.interaktionsdesigner.de/2009/06/04/pdfs-erstellen-mit-typo3/</link>
		<comments>http://www.interaktionsdesigner.de/2009/06/04/pdfs-erstellen-mit-typo3/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 10:55:45 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=478</guid>
		<description><![CDATA[Aus irgendeinem Grund möchten so viele Kunden PDFs zum Download auf ihren Seiten anbieten. Vermutlich haben sie keinen Mac.
Als Fullservice Agentur scheut man sich natürlich nicht vor der Arbeit, sondern stürzt sich voller Freude hinein.
Mit der Extension pdf_generator2 wird das zum Kinderspiel! Und das mit CSS Support, inklusive Hintergrundbildern! Dieser Beitrag zeigt wie.

Installation
Mal eine aktuelle [...]]]></description>
			<content:encoded><![CDATA[<p>Aus irgendeinem Grund möchten so viele Kunden <strong>PDFs zum Download</strong> auf ihren Seiten anbieten. Vermutlich haben sie keinen Mac.</p>
<p>Als <a title="Coole Agentur aus Berlin" href="http://www.kiwi-service.de" target="_blank">Fullservice Agentur</a> scheut man sich natürlich nicht vor der Arbeit, sondern stürzt sich voller Freude hinein.</p>
<p>Mit der Extension <a title="pdf_generator2 download" href="http://typo3.org/extensions/repository/view/pdf_generator2/current/" target="_blank">pdf_generator2</a> wird das zum <strong>Kinderspiel</strong>! Und das mit <strong>CSS Support</strong>, inklusive Hintergrundbildern! Dieser Beitrag zeigt wie.</p>
<p><span id="more-478"></span></p>
<h2>Installation</h2>
<p>Mal eine aktuelle <strong>TYPO3</strong> und <strong>PHP</strong> Version auf dem Server vorausgesetzt benötigt man nur noch die Extension <strong>pdf_generator2</strong>. Bei der Installation gibt man einen <strong>Pagetype</strong> an (Standard ist 123), den man sich merken sollte.</p>
<p><strong>Fertig!</strong> Auf einer beliebigen Seite im Projekt kann man jetzt "<em>type=123</em>" an die URL anhängen und bekommt ein schlichtes PDF zum Download angeboten.</p>
<p><strong>Ohne RealUrl</strong> index.php?id=12&amp;type=123<br />
<strong>Mit RealUrl </strong>meine/klasse/struktur/seite-zwei.html?type=123 (bzw. einer erweiterten Anpassung der RealUrl Konfiguration)</p>
<h2>Anpassung</h2>
<p>Die PDF sieht noch nicht so schön aus. Deshalb muss das Pageobjekt erweitert werden. Dazu wird als erstes ein <strong>HTML Template</strong> und eine neue <strong>CSS Datei</strong> angelegt. Ich schlage vor im Ordner <em>fileadmin/template/pdf/</em>.</p>
<p>In beiden Dateien muss man natürlich etwas eintragen. Nehmen wir an, die Marker ###BREADCRUMB###, ###CONTENT### und ###FOOTER### sollen im PDF erscheinen.</p>
<p>Also gehts ins <strong>Typoscript</strong>. Am besten auf Rootebene, damit sich die Einstellungen für das gesamte Projekt durchsetzen. Hat man einen Unterbereich, in dem das PDF anders aussehen soll, kann man das aber natürlich beliebig verschachteln.</p>
<p>Der pdf_generator2 hat <strong>automatisch</strong> ein neues Pageobjekt mit dem Namen <strong>pdf_generator</strong> angelegt. Das wird erweitert:</p>
<pre>pdf_generator {
&nbsp;&nbsp;# passende CSS Dateien laden
&nbsp;&nbsp;includeCSS {
&nbsp;&nbsp;[tab]file1 = fileadmin/template/pdf/style.css
&nbsp;&nbsp;[tab]file1.media = screen
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;# eigenes Template erstellen zur optimierten Ausgabe
&nbsp;&nbsp;10 = TEMPLATE
&nbsp;&nbsp;10 {
&nbsp;&nbsp;[tab]template = FILE
&nbsp;&nbsp;[tab]template.file = fileadmin/template/pdf/template.html
&nbsp;&nbsp;[tab]
&nbsp;&nbsp;[tab]# benötigte Marker kopieren
&nbsp;&nbsp;[tab]marks {
&nbsp;&nbsp;[tab]&nbsp;&nbsp;BREADCRUMB &lt; page.10.marks.BREADCRUMB
&nbsp;&nbsp;[tab]&nbsp;&nbsp;CONTENT &lt; page.10.marks.CONTENT
&nbsp;&nbsp;[tab]&nbsp;&nbsp;FOOTER &lt; page.10.marks.FOOTER
&nbsp;&nbsp;[tab]}
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;# Standard PDF Generatorkram entfernen
&nbsp;&nbsp;50 &gt;
}</pre>
<p>CSS und Template sollten klar sein. Interessant wird es bei den <strong>marks</strong>. Aus dem <strong>Standardobjekt page</strong> werden alle Marker kopiert, damit sie im PDF Template zur Verfügung stehen.</p>
<p>Am Ende wird mit <strong>50 &gt;</strong> das Standardtyposcript der Extension gelöscht. Hier war eine Datenbankabfrage angegeben, die sehr einfach die Inhalte der Seite ausgelesen hat. Vergisst man diese Zeile hat man seinen <strong>Inhalt doppelt im PDF</strong>.</p>
<h2>PDF Downloadlink</h2>
<p>Es gibt in der <a title="Links zur PDF Generierung hinzufügen" href="http://typo3.org/documentation/document-library/extension-manuals/pdf_generator2/0.5.1/view/1/3/#id3921246" target="_blank">Doku der Extension</a> verschiedene Wege einen Downloadlink vom PDF der aktuellen Seite anzugeben. Zum Beispiel mit einer <strong>Benutzerfunktion,</strong> die aus dem Typoscript ein PHP Script aufruft.</p>
<p>Da das <strong>CONTENT Objekt</strong> nach den meisten Anleitungen schon ein Element vom<strong> Typ COA</strong> ist, füge ich einfach eine neue Ebene hinzu:</p>
<pre>CONTENT = COA
CONTENT {
&nbsp;&nbsp;20 = CONTENT
&nbsp;&nbsp;# ... usw usf ....

&nbsp;&nbsp;50 = TEXT
&nbsp;&nbsp;50 {
&nbsp;&nbsp;[tab]value = Download als PDF
&nbsp;&nbsp;[tab]postUserFunc = tx_pdfgenerator2-&gt;makePdfLink
&nbsp;&nbsp;[tab]postUserFunc.target = _blank
&nbsp;&nbsp;}
}</pre>
<p>Und schon findet sich auf jeder Seite ein Downloadlink. Wenn man es auf diese Art macht, sollte man allerdings die Ebene bei der PDF Generierung wieder entfernen, z.B. so:</p>
<pre>pdf_generator.10.marks.CONTENT.50 &gt;</pre>
<h2>Die PDF Ansicht testen</h2>
<p>Es ist natürlich äußerst unpraktisch bei jeder Änderung ein PDF zu generieren, herunter zu laden, anzusehen, nur um dann wieder von vorne anzufangen. Deshalb empfehle ich <strong>temporär einen weiteren Seitentyp anzulegen</strong>, der die gleichen Eigenschaften hat, aber kein PDF generiert sondern einfach die Vorlage anzeigt.</p>
<p>Als erstes erhält der neue Seitentyp <strong>pdf_generator_preview</strong> alle Eigenschaften von <strong>pdf_generator</strong>. Damit kein PDF erzeugt wird, muss die Eigenschaft <strong>config</strong> entfernt werden.</p>
<pre>pdf_generator_preview &lt; pdf_generator
pdf_generator {
&nbsp;&nbsp;config &gt;
&nbsp;&nbsp;typeNum = 272
}</pre>
<p>Damit die Seite ansprechbar ist, wird eine neue Typennummer angegeben. Mit 272 erfolgt der Aufruf dann über</p>
<p>index.php?id=12&amp;type=272</p>
<p>Auf dieser Seite kann man in Ruhe ausprobieren. Es bietet sich auch an darauf zu achten, dass die Seite <a title="Immer schön validieren lassen!" href="http://validator.w3.org/" target="_blank">validiert</a> und weder HTML noch CSS Fehler enthält, dann klappts auch mit der <strong>PDF Erstellung</strong>.</p>
<h2>Downloadname anpassen</h2>
<p>Das mieseste Problem war der <strong>Name im Downloaddialog</strong>. Der Browser hat immer "<em>index.php</em>" vorgeschlagen was bei unkundigen Benutzern schon leichte Schwierigkeiten hervorrufen könnte.</p>
<p>Leider habe ich im Zusammenspiel mit <strong>RealURL</strong> nur einen harten Weg gefunden den Namen anzupassen. Und der geht direkt in die Extension unter<strong> typo3conf/ext/pdf_generator2/class.tx_pdfgenerator2.php</strong> ab Zeile <strong>83</strong>:</p>
<p>Hier wird die Variable <strong>$filename</strong> mit einer Get/Post-Variable belegt. Bitte fragt mich nicht wo die herkommt, sondern ersetzt die Definition der Variable einfach durch den Titel der aktuellen Seite:</p>
<pre><code class='php'>$filename = '; filename = "'.t3lib_div::convUmlauts($GLOBALS['TSFE']-&gt;page['title']).'.pdf"';</code></pre>
<p>Der eigentliche Name ist verpackt um per Header dem Browser übergeben zu werden, der Name steht in <strong>$GLOBALS['TSFE']-&gt;page['title']</strong>. Und die Funktion <strong>t3lib_div::convUmlauts($string)</strong> ersetzt Umlaute in normale Buchstaben, also wird ä zu ae usw. Das spart schon mal ein bisschen Ärger.</p>
<p><strong>Achtung</strong>: Es ist nicht klug Extensions auf diese Art anzupassen, da die Änderungen beim nächsten Update verloren gehen. Da man die Änderung mit Beginn des nächsten Projekts wahrscheinlich <em>vergessen</em> hat, sollte man sich selbst daran erinnern, und zwar in der Datei <strong>ext_emconf.php</strong>. Die hier gespeicherten Inhalte werden im <strong>TYPO3 Backend</strong> dargestellt.</p>
<h2>Eigene Schriftarten benutzen</h2>
<p>Jetzt wird die Sache richtig spannend. Der Kunde möchte in den <strong>PDFs seine Hausschrift</strong> verwendet sehen und nach seiner Erfahrung sollte das ganz einfach zu machen sein (<em>grrrrr...</em>).</p>
<p><strong>Dann mal los!</strong></p>
<p>Wir haben auf dem Server die <a title="PDFlib zur Generierung von PDFs" href="http://www.pdflib.com/de/" target="_blank">PDFlib</a> installiert mit der es funktioniert hat und für die diese Anleitung ist. Ich vermute aber der Weg ist ein ähnlicher für fpdf. <em>Und so gehts:</em></p>
<p><strong>1. pdf_generator2 erklären, dass es die PDFlib benutzen soll.</strong><br />
Das passiert über den <em>Constant Editor</em> in der Kategorie <em>PDF_GENERATOR2</em> unter <em>Others</em> der Eintrag <em>Use pdflib</em>.</p>
<p><strong>2. Extension pdf_generator2_fonts installieren.</strong><br />
<a title="Fonts for PDF_Generator2" href="http://typo3.org/extensions/repository/view/pdf_generator2_fonts/current/" target="_blank">Datei herunterladen</a>, Extension installieren, fertig. Keine große Sache.</p>
<p><strong>3. Eigene Schrift hochladen.</strong><br />
Mit der Installation der Extension <em>pdf_generator2_fonts</em> schnallt die <em>pdf_generator2</em> Extension automatisch, dass sie in dem neuen Ordner nach Schriften suchen soll. Von der gewünschten Schrift braucht man eine <strong>*.ttf Datei</strong>, diese kommt in den Ordner <strong>typo3conf/ext/pdf_generator2_fonts/fonts/</strong>.<strong><br />
</strong></p>
<p><strong>4. Neue Schriftart bekannt machen.</strong> (das ist der nervigste Schritt, durchhalten!)<br />
Zurück zum Generator: in der Datei <strong>typo3conf/ext/pdf_generator2/html2ps/html2ps.config</strong> befindet sich eine <strong>XML Struktur</strong> in der die zur Verfügung stehenden Schriftarten gespeichert sind. Hier muss man den Knoten <strong>&lt;fonts-pdf&gt;</strong> suchen und ein neues Kindelement namens <strong>&lt;family&gt;</strong> anlegen. Am besten man kopiert einen vorhandenen Eintrag.</p>
<p>Im Attribut <strong>name</strong> wird der Name der Schriftfamilie angegeben. Eine Schriftfamilie besteht aus unterschiedlichen Schriftschnitten, z.B. <em>normal</em> und <em>fett</em>. Diese Schriftschnitte bekommen jeder ein weiteres Kindelement.</p>
<pre><code class='html'>&lt;family name="compatil"&gt;<br />
&nbsp;&nbsp;&lt;normal normal="Compatil" italic="Compatil-Italic" oblique="Compatil-Oblique" /&gt;<br />
&nbsp;&nbsp;&lt;bold normal="Compatil-Bold" italic="Compatil-BoldOblique" oblique="Compatil-BoldOblique"/&gt;<br />
&lt;/family&gt;</code></pre>
<p>Der im Attribut <strong>normal</strong> angegebene Name ist wichtig. Schreibweise merken und weiter runter scrollen.</p>
<p>In den Elementen <strong>&lt;ttf&gt;</strong> wird der eben definierte Name einer <strong>TTF Datei</strong> zugeordnet. Braucht man also die Schnitte <em>normal</em> und <em>fett</em>, fügt man hier zwei Einträge hinzu:</p>
<pre><code class='html'>&lt;ttf typeface="Compatil" embed="0" file="COMMECFR.TTF"/&gt;<br />
&lt;ttf typeface="Compatil-Bold" embed="0" file="COMMECFB.TTF"/&gt;</code></pre>
<p>Groß- und Kleinschreibung spielt hierbei eine Rolle! Auch die Schreibweise der Dateiextension.</p>
<p><strong>5. Schriftart zuweisen.</strong><br />
Das passiert ganz entspannt in der CSS Datei, wie gewohnt:</p>
<pre><code class='css'>body {<br />
&nbsp;&nbsp;font-family: "Compatil";<br />
}</code></pre>
<p><strong>Fertig! </strong>Ich drücke die Daumen, dass es bei dir genau so gut klappt und die Besucher bald Tausende interessante PDF Dateien herunterladen können.</p>
<h2>Erweiterung</h2>
<p>David Will hat eine Lösung entwickelt für den Fall, das verschiedene PDFs von einer Seite generiert werden müssen. <a title="Mit pdf_generator2 mehrere PDFs erzeugen" href="http://www.interaktionsdesigner.de/wp-content/uploads/2009/06/Mehrere-PDFs-mit-pdfgenerator2.pdf" target="_blank">Mehrere PDFs mit pdfgenerator2</a>. Vielen Dank!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/06/04/pdfs-erstellen-mit-typo3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Animierte Header mit TYPO3 und jQuery</title>
		<link>http://www.interaktionsdesigner.de/2009/03/03/animierte-header-mit-typo3-und-jquery/</link>
		<comments>http://www.interaktionsdesigner.de/2009/03/03/animierte-header-mit-typo3-und-jquery/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 11:23:45 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.interaktionsdesigner.de/?p=296</guid>
		<description><![CDATA[Viele schöne Seiten präsentieren großflächige und hochauflösende Bilder. Natürlich wollen unsere Designer das auch und damit der geneigte Besucher Abwechslung bekommt und die Bilder mit dem Inhalt der Seite harmonieren können, wird die Seite mit TYPO3 aufgebaut und die Kopfbilder über die Seiteneigenschaften (Ressourcen / Dateien) selbst gepflegt.
Soweit kein Problem und schon tausendmal implementiert. Aber [...]]]></description>
			<content:encoded><![CDATA[<p>Viele schöne Seiten präsentieren großflächige und hochauflösende Bilder. Natürlich wollen unsere Designer das auch und damit der geneigte Besucher Abwechslung bekommt und die Bilder mit dem Inhalt der Seite harmonieren können, wird die <strong>Seite mit TYPO3 aufgebaut</strong> und die Kopfbilder über die <strong>Seiteneigenschaften</strong> (Ressourcen / Dateien) selbst gepflegt.</p>
<p>Soweit kein Problem und schon tausendmal implementiert. Aber wie sieht es aus, wenn der Redakteur <strong>mehrere Bilder</strong> auswählt? Na logisch: auf der Seite werden sie sehr sanft übergelendet (fadeIn, fadeOut). Und klar, das passiert natürlich mit <strong>jQuery</strong> und dem genialen <strong>Plugin <a title="Innerfade Plugin für jQuery" href="http://medienfreunde.com/deutsch/weblog/aus_der_praxis.html?nid=162" target="_blank">innerfade</a> </strong>von den <a title="Die Medienfreunde" href="http://medienfreunde.com/">medienfreunden</a>.</p>
<p>Diese Technik eingesetzt findet sich zum Beispiel auf der Seite zur Ausstellung über <a title="Audrey Hepburn Ausstellung in Berlin" href="http://www.timeless-audrey.de" target="_blank">Audrey Hepburn</a>.<span id="more-296"></span></p>
<h2>TYPO3 Template</h2>
<p>Nachdem eine Seite mit mehreren Dateien über <em>Seiteneigenschaften</em> / <em>Ressourcen</em> / <em>Dateien</em> ausgestattet wurde, wird ins <strong>HTML Template</strong> gewechselt und <strong>ein neuer Marker</strong> eingebunden. Ich nenne ihn mal <strong>rubrikBild</strong> mit der ID <em>head</em>.<pre><code class='html'>&lt;div id="head"&gt;###rubrikBild###&lt;/div&gt;</code></pre></p>
<p>Als nächstes wird der Marker per Typoscript definiert. Er ist vom <strong>Typ COA</strong> und soll aus einer Liste von Bildern bestehen.<pre><code class='javascript'>rubrikBild = COA<br />
rubrikBild {<br />
&nbsp;&nbsp;10 = IMAGE<br />
&nbsp;&nbsp;10.file {<br />
&nbsp;&nbsp;[tab]import = uploads/media/<br />
&nbsp;&nbsp;[tab]import.data = levelmedia : -1, slide<br />
&nbsp;&nbsp;[tab]import.listNum = 0<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;10.wrap = &lt;li&gt;|&lt;/li&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;wrap = &lt;ul&gt;|&lt;/ul&gt;<br />
}</code></pre></p>
<p>Das erste Objekt <strong>10</strong> wird definiert als Bild <strong>= IMAGE</strong>. Über die Angabe <strong>10.file</strong> wird eine Datei angesprochen. <strong>import</strong> gibt den Ursprungsort an, <strong>import.data</strong> bestimmt die <em>Vererbung auf Unterseiten</em>. Damit wird das Bild der übergeordneten Seite angezeigt, sollte kein eigenes bestehen. <strong>import.listNum</strong> wählt aus der Liste das erste Bild aus. Abschließend wird das generierte Img-Tag in einem Listenelement verpackt <strong>10.wrap = &lt;li&gt;|&lt;/li&gt;</strong> und das komplette Objekt als Liste <strong>wrap = &lt;ul&gt;|&lt;/ul&gt;</strong>.</p>
<p>Hm. Mit diesem Code wird jetzt nur ein einziges Bild in einer Liste dargestellt. Eindeutig zuwenig zum Überblenden. Deshalb muss dieser Code <strong>mit einer Schleife ersetzt werden</strong>. Dazu werden die ausgewählten Dateien in einen Text geschrieben und mit der Funktion <a title="Split in der Typoscript Referenz" href="http://www.typo3.net/tsref/functions/split/" target="_blank">split</a> auseinander genommen. Anschließend kann jedes Element einzeln behandelt werden. <pre><code class='javascript'>rubrikBild = COA<br />
rubrikBild {<br />
&nbsp;&nbsp;10 = TEXT<br />
&nbsp;&nbsp;10.data = levelmedia:-1, slide<br />
&nbsp;&nbsp;10.split {<br />
&nbsp;&nbsp;[tab]token = ,<br />
&nbsp;&nbsp;[tab]cObjNum = 1<br />
&nbsp;&nbsp;[tab]1 {<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;10 = IMAGE<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;10.file.import.current = 1<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;10.file.import = uploads/media/<br />
&nbsp;&nbsp;[tab]&nbsp;&nbsp;10.wrap = &lt;li&gt;|&lt;/li&gt;<br />
&nbsp;&nbsp;[tab]}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;wrap = &lt;ul&gt;|&lt;/ul&gt;<br />
}</code></pre></p>
<p>Das Auslesen der Datei und die Wraps sind wie im oberen Beispiel, aber hier werden jetzt <strong>alle angegebenen Dateien </strong>ausgelesen!</p>
<h2>CSS</h2>
<p>Die Darstellung der Liste richtet sich natürlich nach dem Seitenlayout. Auf jeden Fall sollte man es mit <em>position:absolute</em> so einrichten, das alle Bilder übereinander liegen damit <em>Benutzer ohne JavaScript</em> nicht von einem Haufen sinnloser Bilder erschlagen werden.</p>
<h2>JavaScript</h2>
<p>Jetzt fehlen noch <strong>ein paar Zeilen jQuery</strong> und fertig ist die Funktion! Als erstes muss das <strong>Plugin innerfade eingebunden</strong> werden. Natürlich über <strong>Typoscript</strong> im <strong>Roottemplate</strong> und dort entweder per <em>page.10.headerData</em> oder <em>page.includeJS</em>, je nach Geschmack würde ich mal behaupten.</p>
<p>Dann wird eine Datei für eigene Scripte benötigt, ich nenne sie gerne <em>action.js</em> (eingebunden NACH dem jQuery Core und allen benötigten Plugins), die eine Funktion beinhaltet, welche aufgerufen wird sobald alles fertig geladen wurde:<pre><code class='javascript'>jQuery(function($) {<br />
&nbsp;&nbsp;// ... hier gehts los ...<br />
});</code></pre>Als erstes muss geprüft werden, <strong>ob überhaupt mehr als ein Bild vorhanden</strong> ist:<pre><code class='javascript'>if($("#head ul li").length &gt; 1) {<br />
&nbsp;&nbsp;// ...hier gehts weiter ...<br />
}</code></pre>Wenn das der Fall ist, dann muss nur noch das <strong>innerfade Plugin aktiviert</strong> werden:<pre><code class='javascript'>$("#head ul").innerfade({<br />
&nbsp;&nbsp;speed: 2000,<br />
&nbsp;&nbsp;timeout: 4000,<br />
&nbsp;&nbsp;containerheight: '250px'<br />
});</code></pre></p>
<p>Zu beachten ist, dass die Funktion <em>innerfade</em> auf den <strong>umfassenden Container</strong>, also auf das <em>&lt;ul&gt;</em>, angewendet wird und nicht auf die einzelnen Elemente. Wenn man die Angabe <strong>containerheight</strong> <span style="text-decoration: line-through;">vergisst</span> weglässt, dann funktioniert es nicht im Internet Explorer. <strong>Daran denken! </strong>Noch mehr mögliche Einstellungen sind im Quelltext von <em>jquery.innerfade.js</em> dokumentiert.</p>
<h2>Fertig</h2>
<p>Jetzt in der Schulung die <strong>Freude der Auftraggeber</strong> genießen und viele schöne Überblendungen auf den eigenen Seiten beobachten. Sobald unsere neue Seite veröffentlich wurde, wird sie hier als Beispiel dienen. <span style="text-decoration: line-through;">Bitte noch ein bisschen Geduld.</span> Die Ausstellungsseite <a title="Audrey Hepburn Ausstellung in Berlin" href="http://www.timeless-audrey.de" target="_blank">timeless-audrey</a> benutzt diese Technik.</p>
<p>PS: <em>Ein Linktipp; </em>die Firefox Erweiterung <a title="Wappalyer für Firefox" href="https://addons.mozilla.org/de/firefox/addon/10229" target="_blank">Wappalyzer</a> verrät auf einen Blick welche Systeme eine Internetseite einsetzt. Sehr praktisch! Danke <a title="t3n" href="http://t3n.yeebase.com/" target="_blank">t3n</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.interaktionsdesigner.de/2009/03/03/animierte-header-mit-typo3-und-jquery/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
