<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Abt Gaiser Blog - Typo3</title>
    <link>http://www.matthiashaeger.de/</link>
    <description>World Famous Matthias Häger bloggt über Eishockey, IT, Bücher, Filme, Typo3 und was ihn sonst noch so umtreibt</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.3.1 - http://www.s9y.org/</generator>
    <pubDate>Fri, 21 Aug 2009 08:45:19 GMT</pubDate>

    <image>
        <url>http://www.matthiashaeger.de/templates/bulletproof/img/s9y_banner_small.png</url>
        <title>RSS: Abt Gaiser Blog - Typo3 - World Famous Matthias Häger bloggt über Eishockey, IT, Bücher, Filme, Typo3 und was ihn sonst noch so umtreibt</title>
        <link>http://www.matthiashaeger.de/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Isch hasse den Internet Explorer</title>
    <link>http://www.matthiashaeger.de/archives/127-Isch-hasse-den-Internet-Explorer.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/127-Isch-hasse-den-Internet-Explorer.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=127</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=127</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    Eine wirklich kreative Erweiterung für TYPO3 ist mir heute über den Weg gelaufen: &lt;a href=&quot;http://typo3.org/extensions/repository/view/pmkihateie/current/&quot;&gt;PMK &amp;quot;I hate IE&amp;quot;&lt;/a&gt; von Peter Klein blendet im Internet Explorer (Version einstellbar) eine kleine gelbe Zeile oben im Browserfenster ein, wie man es von ActiveX-Warnungen, etc. gewöhnt ist. Der dort erscheinende Text ist frei konfigurierbar, der dahinter stehende Link ebenfalls.&lt;br /&gt;&lt;br /&gt;&lt;div align=&quot;center&quot;&gt;&lt;!-- s9ymdb:43 --&gt;&lt;img width=&quot;598&quot; height=&quot;123&quot; class=&quot;serendipity_image_center&quot; style=&quot;border: 0px none ; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://www.matthiashaeger.de/uploads/ie6.jpg&quot; /&gt;&lt;/div&gt;&lt;br /&gt;Finde ich super-praktisch, da man so den Benutzer komfortabel informieren kann, dass er seinen Browser updaten soll ohne ihn zusehr zu gängeln. Wir setzen das jetzt bei uns ein, um die immer noch knapp 6% IE6-User zu einem Update zu bewegen. &lt;a href=&quot;http://www.savethedevelopers.org/&quot;&gt;Die Sicherheits- und CSS-Probleme des 8 Jahre alten IE6 sind bekannt und für viele Webentwickler Quell jahrelanger Qualen&lt;/a&gt;.  
    </content:encoded>

    <pubDate>Fri, 21 Aug 2009 10:45:19 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/127-guid.html</guid>
    
</item>
<item>
    <title>Powermail Conditions in Multipage-Formular</title>
    <link>http://www.matthiashaeger.de/archives/125-Powermail-Conditions-in-Multipage-Formular.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/125-Powermail-Conditions-in-Multipage-Formular.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=125</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=125</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
&lt;a href=&quot;http://typo3.org/extensions/repository/view/powermail/current/&quot;&gt;Powermail&lt;/a&gt; und &lt;a href=&quot;http://typo3.org/extensions/repository/view/powermail_cond/current/&quot;&gt;Powermail Conditions&lt;/a&gt; sind hervorragende Erweiterungen zum Umgang mit Formularen in TYPO3, die ich gerne immer wieder einsetze. Mit Powermail Conditions lassen sich abhängig von den Eingaben eines Benutzers weitere Formulaelemente ein- bzw. ausblenden. Das funktioniert auch einwandfrei, allerdings nur, wenn die Elemente auf einer Seite liegen. Hat man ein Formular auf mehreren Seiten und möchte z.B. das eine Auswahl auf Seite 1 Auswirkungen auf Seite 3 und 4 hat, dann steht man vor einem kleine Problem. Laut Dokumentation gibt es für Powermail Conditions (noch) keinen Multipage-Support.&lt;br /&gt;&lt;br /&gt;Ich stand jetzt aber vor der Aufgabe, dieses Problem irgendwie zu lösen. Und ich habe es auch geschafft. Und zwar mittels JavaScript. Zuerst habe ich zwei Hilfsfunktionen aus &lt;a href=&quot;http://de.selfhtml.org/javascript/beispiele/seitenbesuche.htm&quot;&gt;SELFHTML genommen&lt;/a&gt;, um einen Cookie schrieben bzw. auslesen zu können:&lt;br /&gt;&lt;p&gt;&lt;i&gt;function WertHolen () {&lt;br /&gt;  var Wert = &amp;quot;&amp;quot;;&lt;br /&gt;  if (document.cookie) {&lt;br /&gt;    var Wertstart = document.cookie.indexOf(&amp;quot;=&amp;quot;) + 1;&lt;br /&gt;    var Wertende = document.cookie.indexOf(&amp;quot;;&amp;quot;);&lt;br /&gt;    if (Wertende == -1)&lt;br /&gt;      Wertende = document.cookie.length;&lt;br /&gt;    Wert = document.cookie.substring(Wertstart, Wertende);&lt;br /&gt;  }&lt;br /&gt;  return Wert;&lt;br /&gt;}&lt;br /&gt;function WertSetzen (Bezeichner, Wert, Verfall) {&lt;br /&gt;  var jetzt = new Date();&lt;br /&gt;  var Auszeit = new Date(jetzt.getTime() + Verfall);&lt;br /&gt;  document.cookie = Bezeichner + &amp;quot;=&amp;quot; + Wert + &amp;quot;; expires=&amp;quot; + Auszeit.toGMTString() + &amp;quot;;&amp;quot;;&lt;br /&gt;}&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Als nächstes habe ich dem Formularelement, das für das weitere Formular die Abhängigkeit bestimmt, eine &lt;a href=&quot;http://www.trashboard.de/2008/10/07/typo3-custom-js-validation-fur-powermail/&quot;&gt;Validierung hinzugefügt&lt;/a&gt;. In meinem Fall handelt es sich um eine Drop-Down Box, bei der der Benutzer &amp;quot;ja&amp;quot; oder &amp;quot;nein&amp;quot; auswählen kann. Entsprechend der Auswahl, wird dann der Wert &amp;quot;1&amp;quot; oder der Wert &amp;quot;0&amp;quot; in das Cookie geschrieben.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Validation.add(&#039;powermail_uid94&#039;,&#039;&#039;,&lt;br /&gt; function(v) {&lt;br /&gt;var i = document.getElementById(&#039;uid94&#039;).selectedIndex;&lt;br /&gt;var text = document.getElementById(&#039;uid94&#039;).options[i].text;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;var Verfallszeit = 1000 * 6&lt;/i&gt;&lt;i&gt;0 * 60 * 24 * 365;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt; if(text == &#039;ja&#039;) {&lt;br /&gt;      WertSetzen(&amp;quot;bfm&amp;quot;, 1, Verfallszeit);&lt;br /&gt;  } else {&lt;br /&gt;        WertSetzen(&amp;quot;bfm&amp;quot;, 0, Verfallszeit);&lt;br /&gt;  }&lt;br /&gt;      return true;&lt;br /&gt; }&lt;br /&gt;)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Der Rest ist einfach. Auf jeder Seite überprüft jetzt ein JavaScript, ob das abhängige Element vorhanden ist. Wenn es auf der Seite ist, wird abhängig vom Cookie-Wert das Element entweder sichtbar oder unsichtbar geschaltet.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;if(WertHolen() == 0) {&lt;br /&gt;    if(document.getElementById(&#039;powermaildiv_uid15&#039;) != null) {&lt;br /&gt;        document.getElementById(&#039;powermaildiv_uid15&#039;).style.display=&#039;none&#039;;&lt;br /&gt;    }&lt;br /&gt;} else {&lt;br /&gt;    if(document.getElementById(&#039;powermaildiv_uid15&#039;) != null) {&lt;br /&gt;        document.getElementById(&#039;powermaildiv_uid15&#039;).style.display=&#039;block&#039;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Zwei kleine Hinweise: Das JavaScript darf erst geladen werden, wenn das Formular bereits generiert ist und die abhängigen Elemente müssen in der CSS-Datei auf jeden Fall eine &amp;quot;display&amp;quot;-Eigenschaft haben. Ist diese Eigenschaft nicht vorhanden, kann man sie auch über JS nicht ändern.&lt;/p&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Mon, 17 Aug 2009 10:42:51 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/125-guid.html</guid>
    
</item>
<item>
    <title>Roll-Out</title>
    <link>http://www.matthiashaeger.de/archives/120-Roll-Out.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/120-Roll-Out.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=120</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=120</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    Am Donnerstag ist offizielle Roll-Out Veranstaltung von TYPO3 bei uns an der Uni. Bin mal gespannt wie der Ansturm der Sekretärinnen nach der Vorstellung ist oder ob sie das System doch komplett ablehnen. Dann hätte man nen Jahr für die Katz gearbeitet. &lt;img src=&quot;http://www.matthiashaeger.de/templates/default/img/emoticons/wink.png&quot; alt=&quot;;-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Tue, 04 Aug 2009 15:23:54 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/120-guid.html</guid>
    
</item>
<item>
    <title>TYPO3 - Breadcrumb als Seitentitel</title>
    <link>http://www.matthiashaeger.de/archives/110-TYPO3-Breadcrumb-als-Seitentitel.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/110-TYPO3-Breadcrumb-als-Seitentitel.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=110</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=110</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    Heute möchte ich mich in Sachen TYPO3 einfach mal bei zwei anderen Blogs bedanken, die mir viel Arbeit und Sucherei erspart haben. Ich wollte nämlich als Seitentitel statt dem Titel der einzelnen Seite einen schönen &lt;a href=&quot;http://de.wikipedia.org/wiki/Breadcrumb&quot;&gt;Breadcrumb-Pfad&lt;/a&gt; haben, der auch die Struktur der Seite widerspiegelt und damit aussagekräftiger ist, als die herkömmliche Variante.&lt;br /&gt;&lt;br /&gt;Für die grundlegende Anpassung des TS-Codes hat mir zuerst der &lt;a href=&quot;http://mediavrog.net/blog/2007/05/30/typo3/ts-snippets/dynamischer-seitentitel-in-typo3-wie-klickpfadbreadcrumb/&quot;&gt;MediaVrog-Blog&lt;/a&gt; geholfen, indem sehr anschaulich und übersichtlich erklärt wird, wie man einen Breadcrumb-Seitentitel einbaut. Damit war ich aber noch nicht 100% zufrieden, denn für den Titel wurde der Navigationstitel anstatt des Seitentitel verwendet. Deshalb habe ich diese Lösung noch mit einem Tipp aus dem &lt;a href=&quot;http://www.typo3-blog.com/typo3-tipps/breadcrumb-navigation-titel-anstelle-des-navigations-titel-ausgeben/&quot;&gt;TYPO3-Blog&lt;/a&gt; kombiniert. Dieser ändert den verwendeten Titel in den tatsächlichen Seitentitel.&lt;br /&gt;&lt;br /&gt;Da hier nichts auf meinem Mist gewachsen ist, bitte ich bei Interesse einfach den Links zu folgen und in den Originalquellen nachzuschauen.&lt;br /&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Tue, 05 May 2009 13:54:15 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/110-guid.html</guid>
    
</item>
<item>
    <title>t3blog - die neue Blog-Extension für TYPO3</title>
    <link>http://www.matthiashaeger.de/archives/95-t3blog-die-neue-Blog-Extension-fuer-TYPO3.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/95-t3blog-die-neue-Blog-Extension-fuer-TYPO3.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=95</wfw:comment>

    <slash:comments>17</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=95</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Die letzten Wochen habe ich mich auf der Arbeit viel mit &lt;a href=&quot;http://blog.snowflake.ch/de/blog-post/2008/11/26/typo3-blog-extension-erste-veroeffentlichung-des-codes/&quot;&gt;t3Blog&lt;/a&gt;, der neuen Blog-Extension der Schweizer Firma &lt;a href=&quot;http://www.snowflake.ch/&quot;&gt;Snowflake&lt;/a&gt; beschäftigt. War die bisherige Arbeit mit tt_news und timtab doch immer eine ziemliche Fummelei, erweckte die überwiegend &lt;a href=&quot;http://typo3blogger.de/turchen-8-typo3-blog-extension/&quot;&gt;positiv&lt;/a&gt; &lt;a href=&quot;http://t3blog.de/2009/01/15/neue-blogextension/&quot;&gt;besprochene&lt;/a&gt; Extension hohe Erwartungen in mir. Sollte man doch mit wenigen Mausklicks einen Blog aufsetzen können. Doch wie die Realität zeigt: So einfach ist das nicht. Besser gesagt: So wie ich das will, ist das nicht einfach.&lt;br /&gt;&lt;br /&gt;Möchte man die Extension Out-of-the-Box installieren und ist mit dem mitgelieferten Layout auch glücklich, dann geht es wirklich schnell und man kann bereits nach wenigen Minuten anfangen zu bloggen. Bei uns sollte das Ganze aber in eine bestehende Seite mit einer bestehenden Navigation integriert werden. Dazu sollten es die einzelnen Backend-Benutzer in ihren Zweigen jeweils einsetzen können, ohne das sich die Blogs ins Gehege kommen und ohne das die Benutzer mit TypoScript in Berührung kommen. Dafür waren einige Änderungen, Erweiterungen und ausführliche Tests nötig. Insgesamt ist das Konzept, die einzelnen Anwendungen in sogenannte Widgets zu kapseln, sehr gelungen. Dadurch weiß man recht gut wie und wo man ansetzen muss und will.&lt;br /&gt;&lt;br /&gt;Ich möchte mich auch bei &lt;a href=&quot;http://www.thorsten-schneider.org/de/mainmenu/blog/blog-post/2009/02/09/rss-jetzt-auch-gleich-mit-text.html&quot;&gt;Thorsten Schneider&lt;/a&gt; und beim &lt;a href=&quot;http://www.kaktusteam.de/index.php?id=mimis_blog&amp;tx_t3blog_pi1[blogList][showUid]=7&amp;tx_t3blog_pi1[blogList][year]=2009&amp;tx_t3blog_pi1[blogList][month]=02&amp;tx_t3blog_pi1[blogList][day]=05&amp;cHash=a981decb7c&quot;&gt;Kaktusteam&lt;/a&gt; bedanken, die mir besonders beim RSS-Feed mit ihren Einträgen geholfen haben. Den Blog bei uns im Einsatz, gut eingepasst in die bestehende Navigation und Seitenstruktur sieht man auf unseren &lt;a href=&quot;http://www.rz.uni-konstanz.de/index.php?id=1675&quot;&gt;Seiten des Rechenzentrums&lt;/a&gt;. In den nächsten Zeilen werde ich grob auf einige Klippen und Hürden eingehen, die umschifft werden mussten. Einigen Code dazu in der Langfassung des Artikels.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. TemplaVoila:&lt;/b&gt; Hauptproblem mit TemplaVoila ist, dass die Inhaltselemente doppelt angezeigt werden. Um dies zu umgehen habe ich ein neues TO erschaffen, dass einen zusätzlichen Inhaltsbereich, deckungsgleich mit dem eigentlich Inhaltsbereich enthält. Der eigentliche Inhaltsbereich wird über CSS ausgeblendet. Jetzt kommen die für den Blog genutzten Content Element in den nicht-sichtbaren Bereich und die Blog-Elemente in den sichtbaren Bereich. So kann man recht elegant das Problem der doppelt angezeigten Elemente bei t3blog umgehen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. BE-User Autorfeld:&lt;/b&gt; Blöd ist, dass ein eingeloggter BE-User alle anderen User als Autor auswählen kann, nicht nur die aus seiner BE-Gruppe. Das kann man umgehen, in dem man das Auswahlfeld nicht sichtbar macht und den Autor vorbelegt.&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;TCAdefaults.tx_t3blog_post.author :=author_return(uid)&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;3. Template Einstellungen:&lt;/b&gt; Ich finde es zwar nicht schlecht, dass man den Blog nahezu komplett über TS konfigurieren kann, aber es ist nicht immer ganz ersichtlich, ob man jetzt pi1 oder pi2 ansprechen muss. Da ist Rumprobiererei angesagt. Danach lassen sich aber Labels und Einstellungen sehr gut ansprechen. Trotzalledem bin ich nicht drumherum gekommen in den eigentlich setup.txt - Dateien Einstellungen vorzunehmen. Da diese mehrfach verschachtelt und sehr komplex sind, war es für mich weniger aufwendig schnell die setup.txt zu editieren und die Änderungen für spätere Updates zu dokumentieren, als das alles in das TS-Setup der Seite zu packen. Ich habe einige Einstellungen in den Wraps vorgenommen um z.B. das Autorenbild auszublenden, die Anzahl der Kommentare einzuklammern, Kategorie und Autor mit einem Bezeichner zu versehen und Elemente mit einer zusätzlichen umgebenden &amp;lt;div&amp;gt;-Box zu versehen, um sie mittels CSS besser stylen zu können.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. CoolURI:&lt;/b&gt; Leider arbeitet t3blog noch nicht korrekt mit CoolURI zusammen. Um das zu umgehen, habe ich mir eine kleine userFunc in der localconf.php geschrieben, die abfragt ob auf der jeweiligen Seite ein Blog-Element vorhanden ist. Wenn dem so ist, dann wird CoolURI für die Seite einfach abgeschaltet. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Kommentar E-Mails:&lt;/b&gt; Bei neuen Kommentaren wird eine E-Mail an den Adminstrator verschickt. Normalerweise kann man den über den Constant Editor einstellen. Da ich diesen dem Benutzer nicht zur Verfügung stellen will, habe ich die Widget-Auswahl-Maske um ein Feld zur Eingabe einer E-Mail-Adresse erweitert. Jetzt kann der Benutzer beim Anlegen eines Blogs selber festlegen, an welche Adresse er die Mails haben möchte.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. TagCloud:&lt;/b&gt; Leider sortiert die TagCloud standardmäßig nach dem Vorkommen der Begriffe. Ich wollte aber lieber eine Sortierung nach Alphabet. Dazu muss man einfach in der Datei class.tagCloud.php die Funktion sortByCountValue() auskommentieren.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. JS-Files:&lt;/b&gt; Die JS-Files binden wir manuell ein und auch nur dann, wenn sich auf der Seite auch ein Blog befindet. Dazu bedienen wir uns wieder der userFunc die ich schon für CoolUri geschrieben habe.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. CSS Styling:&lt;/b&gt; Das Styling des Blogs erfolgt in CSS-Dateien. Hier war auch einiges an Anpassung nötig, da die von Snowflake mitgelieferten Vorgaben nur auf das vorgegebene Layout passten. Aber mit viel Ausprobieren habe ich eine schöne Lösung gefunden, die die BlogList links und alle Widgets rechts auf der Seite positioniert. Von den Maßen her ist es sehr an unsere TYPO3-Installation angepasst, eine Weitergabe bringt nicht viel.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;9. RSS-Feeds: &lt;/b&gt;Am meisten Probleme bereiteten die RSS-Feeds. Hier musste ich einige Eingriffe im Code vornehmen, damit nur die Beiträge aus dem zugehörigen Blog und nicht alle angezeigt werden. Außerdem wollte ich lieber einen Full-Feed statt einen Short-Feed. Auch hierzu musste der Quelltext abgeändert werden, da wir statt dem Text die UID brauchten um das zugehörige Content Element manuell zu rendern. Ansonsten habe ich keinen schönen Feed bekommen. Bei den Links musste man das vorkommende &amp;amp; maskieren und durch &amp;amp;#38; ersetzen.&lt;b&gt; &lt;/b&gt;Zum Schluß habe ich noch die komplette Feed-Metadaten, die man normalerweise über den Constant Editor setzen kann so umgeschrieben, dass sie entweder automatisch generiert werden, von mir allgemein vorgegeben werden oder vom Benutzer selber über zusätzliche Felder bei der Widget-Auswahl eingegeben werden können.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fazit:&lt;/b&gt; Ein hartes Stück Arbeit, aber im Ergebnis eine sehr gut in TYPO3 integrierte Blog-Umgebung die jeder Benutzer komfortabel in seinem eigenen Zweig nutzen kann. Als kleinen Bonus gibt es noch einen Auszug aus dem Handbuch für unsere Benutzer zum Download: &lt;a target=&quot;_blank&quot; title=&quot;Benutzerhandbuch_Blog.pdf&quot; href=&quot;http://www.matthiashaeger.de/uploads/Benutzerhandbuch_Blog.pdf&quot;&gt;Benutzerhandbuch_Blog.pdf&lt;/a&gt;&lt;/p&gt; &lt;br /&gt;
&lt;b&gt;CoolURI&lt;/b&gt;&lt;br /&gt;#Keine Umschreibung, wenn Blog-Element&lt;br /&gt;[userFunc = user_isBlog()]&lt;br /&gt;config.tx_cooluri_enable = 0&lt;br /&gt;[end]&lt;br /&gt;&lt;br /&gt;Diese Funktion ruft die Methode user_isBlog auf. Gibt die true zurück, dann wird die URL-Umschreibung ausgeschaltet. Die entsprechende Methode in der Datei localconf.php sieht so aus:&lt;br /&gt;&lt;br /&gt;//UserFunc um zu überprüfen, ob sich auf der Seite ein Kalender befindet&lt;br /&gt;function user_isBlog() {&lt;br /&gt;    $id = $GLOBALS[&#039;TSFE&#039;]-&amp;gt;page[&#039;uid&#039;];&lt;br /&gt;    $res = $GLOBALS[&#039;TYPO3_DB&#039;]-&amp;gt;exec_SELECTquery(&lt;br /&gt;    &#039;*&#039;,&lt;br /&gt;    &#039;tt_content&#039;,&lt;br /&gt;    &#039;pid=&#039;.$id.&#039; AND list_type = &amp;quot;t3blog_pi2&amp;quot;&#039;,&lt;br /&gt;    &#039;&#039;,&lt;br /&gt;    &#039;&#039;,&lt;br /&gt;    &#039;&#039;);&lt;br /&gt;    $num = mysql_num_rows($res);&lt;br /&gt;    if($num &amp;gt; 0) {    &lt;br /&gt;        return true;&lt;br /&gt;    } else {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Kommentar E-Mails:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Damit jeder Benutzer hier eine eigene Adresse eintragen kann, müssen wir das Flexform für die Widget-Auswahl erweitern. Dies geschieht in der Datei flexform_pi2.xml im Extension-Verzeichnis. Nach der Beschreibung des &amp;lt;storagePid&amp;gt; Feldes fügen wir folgenden Code ein:&lt;br /&gt;&lt;br /&gt;    &amp;lt;commentEmail&amp;gt;&lt;br /&gt;        &amp;lt;TCEforms&amp;gt;&lt;br /&gt;            &amp;lt;exclude&amp;gt;1&amp;lt;/exclude&amp;gt;&lt;br /&gt;            &amp;lt;label&amp;gt;LLL:EXT:t3blog/pi2/locallang.xml:pi_flexform.commentEmail&amp;lt;/label&amp;gt;&lt;br /&gt;            &amp;lt;config&amp;gt;&lt;br /&gt;                &amp;lt;type&amp;gt;input&amp;lt;/type&amp;gt;&lt;br /&gt;                &amp;lt;size&amp;gt;50&amp;lt;/size&amp;gt;&lt;br /&gt;            &amp;lt;/config&amp;gt;&lt;br /&gt;        &amp;lt;/TCEforms&amp;gt;&lt;br /&gt;    &amp;lt;/commentEmail&amp;gt;&lt;br /&gt;&lt;br /&gt;In der referenzierten locallang.xml Datei muss der gewünschte Text eingetragen werden:&lt;br /&gt;&lt;br /&gt;    &amp;lt;label index=“pi_flexform.commentEmail“&amp;gt;E-Mail Adresse des Blog-Verantwortlichen (Bei Blog list- und RSS-Widget eintragen):&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;Damit kann der Benutzer jetzt eine E-Mail Adresse angeben. Damit die dort eingegebene Adresse vom Blog bei Kommentaren auch verwendet wird, müssen wir Änderungen im Code vornehmen:&lt;br /&gt;&lt;br /&gt;In der Datei pi2/class.tx_t3blog_pi2.php fügen wir in der init-Methode nach Zeile 75 ein:&lt;br /&gt;&lt;br /&gt;$this-&amp;gt;internal[‚commentEmail‘] = this-&amp;gt;pi_getFFvalue($this-&amp;gt;cObj-&amp;gt;data[‘pi_flexform’], ‘commentEmail’, ‘sDEF’)&lt;br /&gt;&lt;br /&gt;Anschließend schreiben wir so ermittelte Adresse in der main-Methode nach Zeile 54 in das globale Array. Dazu rufen wir eine Methode aus der Library auf:&lt;br /&gt;&lt;br /&gt;    t3blog_div::setCommentEmail($this-&amp;gt;internal[‚commentEmail‘]);&lt;br /&gt;&lt;br /&gt;In der Datei pi1/lib/class.t3blog_div.php müssen wir die Methode natürlich implementieren. Zusätzlich implementieren wir eine Methode, die die E-Mail Adresse zurückgibt und von außen aufgerufen werden darf.&lt;br /&gt;&lt;br /&gt;    function setCommentEmail($mail) {&lt;br /&gt;        if($mail == „“) {&lt;br /&gt;$GLOBALS[‚commentEmail‘] = “root”&lt;br /&gt;        } else {&lt;br /&gt;$GLOBALS[‚commentEmail‘] = $mail;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function getCommentEmail() {&lt;br /&gt;        return $GLOBALS[‚commentEmail‘];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;Zum Schluß ist dann im blogList-Widget die Datei class.singleFunctions.php zu ändern. In der Methode adminMailComment() ab Zeile 830 lesen wir die entsprechende Variable aus und fügen die E-Mail_Adresse als Zieladresse in den Aufruf der plainMailEncoded Methode ein.&lt;br /&gt;&lt;br /&gt;    $mailTo = t3blog_div::getCommentEmail();&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RSS-Feeds:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Damit der RSS-Feed funktioniert, sind ein paar Einstellungen nötig. RSS-Feeds werden über den speziellen Seitentyp 100 gekennzeichnet. Dieser muss definiert werden, dies geschieht im TS-Setup des Root-Templates:&lt;br /&gt;&lt;br /&gt;#Definition des Seitentypes 100 um RSS-Feeds in Blogs anzuzeigen&lt;br /&gt;xmlnews = PAGE&lt;br /&gt;xmlnews {&lt;br /&gt;        typeNum = 100&lt;br /&gt;        config {&lt;br /&gt;                disableAllHeaderCode = 1&lt;br /&gt;                additionalHeaders = Content-type:text/xml&lt;br /&gt;                linkVars = L&lt;br /&gt;                no_cache = 1&lt;br /&gt;               xhtml_cleaning = 0&lt;br /&gt;               admPanel = 0&lt;br /&gt;        }&lt;br /&gt;        10 = USER&lt;br /&gt;        10 {&lt;br /&gt;                # Call the user function&lt;br /&gt;                userFunc = tx_t3blog_pi1-&amp;gt;main&lt;br /&gt;                widget.rss &amp;lt; plugin.tx_t3blog_pi1.rss&lt;br /&gt;          # Load &amp;quot;design&amp;quot; of the RSS-stuff&lt;br /&gt;                # Attention! This will only work, when you are&lt;br /&gt;                # using the static template &amp;quot;T3BLOG Layout&amp;quot;.&lt;br /&gt;                # The static template has included the full design of&lt;br /&gt;                # a blog (position of widgets and much more)t&lt;br /&gt;                &lt;br /&gt;                template =&amp;lt; plugin.tx_t3blog_pi1.layoutBlog.40.80&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Weiterhin setzen wir im TS-Setup noch die folgenden Einstellungen:&lt;br /&gt;&lt;br /&gt;#t3Blog: RSS Feed&lt;br /&gt;plugin.tx_t3blog_pi1 {&lt;br /&gt;  rss {&lt;br /&gt;    postItemCount = 10&lt;br /&gt;    feedCopyright = 2009 Universität Konstanz&lt;br /&gt;    feedWebMaster = typo3@uni-konstanz.de&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;plugin.tx_t3blog_pi2 {&lt;br /&gt;  rss {&lt;br /&gt;    _LOCAL_LANG.de.rss_click_here = Feeds!&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Der erste Block (pi1) setzt die Anzahl der Beiträge im Feed auf 10 und definiert einige Metadaten, die für alle Feeds im System gelten. Weitere Metadaten werden in einem separaten Unterkapitel behandelt. Der zweite Block (pi2) ändert die Überschrift im Frontend für die Feeds in der deutschen Sprachdatei.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nur eigener Blog:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In der Methode getContentResult fügen wir ab Zeile 200 ein:&lt;br /&gt;&lt;br /&gt;//Nur Beiträge/Comments aus dem zugehörigen Blog-Folder&lt;br /&gt;$pid = t3blog_div::getBlogPid();&lt;br /&gt;&lt;br /&gt;Und erweitern die where-Klausel für die Datenbankabfrage um die Abfrage der PID:&lt;br /&gt;&lt;br /&gt;$where = ‚WHERE ‘.$table.‘deleted = 0 AND ‘.$table.’.hidden = 0 AND ‘.$table.’.pid = ‘.$pid;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Full-Feed statt Short-Feed:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Um den Benutzern einen Full-Feed anzubieten, der die kompletten Inhalte ausliefert, ist ebenfalls eine Änderung im Code notwendig. In der Methode make_xml erweitern wir in Zeile 137 &amp;amp; 147 den Methoden Aufruft setRecFields um den Parameter text.&lt;br /&gt;&lt;br /&gt;    $xmlObj-&amp;gt;setRecField(‚tx_t3blog_com‘, ‚title,author,uid,fk_post,date,text‘);&lt;br /&gt;&lt;br /&gt;Der ausgelesene Text muss aber noch gerendert werden, ansonsten ist er unformatiert und ohne Zeilenumbrüche. Zu diesem Zweck ändert man die Abfrage der Datenbank in Zeile 227. Die SELECT-Klausel lautet neu:&lt;br /&gt;&lt;br /&gt;    $select .= ‚, tt-content.uid AS text ‚;&lt;br /&gt;&lt;br /&gt;Anstatt also über eine CONCAT-SQL-Funktion den Text direkt auszulesen, lassen wir nur die ID des Content Elements ausgeben.&lt;br /&gt;&lt;br /&gt;Im weiteren Verlauf ändert man in der der fieldWrap – Methoden den case ‚text‘: Anstatt des Textes bekommen wir hier die ID übergeben und rendern das Content Element mit den folgenden zwei Zeilen manuell:&lt;br /&gt;&lt;br /&gt;$getBodytext = array(‚tables‘ =&amp;gt; ‚tt_content‘, ‚source‘ =&amp;gt; $value, ‚dontCheckPid‘ =&amp;gt; 1);&lt;br /&gt;$this-&amp;gt;item = $this-&amp;gt;cObj-&amp;gt;RECORDS($getBodytext);&lt;br /&gt;&lt;br /&gt;Das ist natürlich nicht 100% sauber, da man auch einen eigenen case-Fall dafür bauen könnte.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Link-Generierung:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;//Temporäre Generierung der Link-URL&lt;br /&gt;$linkTempGen = &lt;br /&gt;&#039;&#039;.(stripos(&#039;http://&#039;,t3lib_div::getIndpEnv(&#039;HTTP_HOST&#039;))?&#039;&#039;:&#039;http://&#039;).t3lib_div::getIndpEnv(&#039;HTTP_HOST&#039;).&#039;/&#039;.tslib_pibase::pi_getPageLink(t3blog_div::getBlogPid(), &#039;&#039;, array(&#039;no_cache&#039; =&amp;gt; 1, &#039;tx_t3blog_pi1[blogList][year]&#039; =&amp;gt; $year, &#039;tx_t3blog_pi1[blogList][month]&#039; =&amp;gt; $month, &#039;tx_t3blog_pi1[blogList][day]&#039; =&amp;gt; $day, &#039;tx_t3blog_pi1[blogList][showUid]&#039; =&amp;gt; $this-&amp;gt;conf[&#039;feedItemLinkPrefix&#039;].$postid)).&#039;&#039;;&lt;br /&gt;$linkTempGen = str_replace(&amp;quot;&amp;amp;&amp;quot;,&amp;quot;&amp;amp;#38;&amp;quot;,$linkTempGen);&lt;br /&gt;return &#039;&amp;lt;link&amp;gt;&#039;.$linkTempGen.&#039;&amp;lt;/link&amp;gt;&amp;lt;guid&amp;gt;&#039;.$linkTempGen.&#039;&amp;lt;/guid&amp;gt;&#039;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feed-Metadaten:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Damit der Benutzer von TypoScript verschont bleibt, ist es notwendig die FlexForm Variablen auch in den Widgets verfügbar zu machen. Dazu ist eine Methode nötig, die die FlexForm Daten manuell aus der Datenbank holt und zur Verfügung stellt. Diese Methode wird als eigene Funktion implementiert:&lt;br /&gt;&lt;br /&gt;    function getFlexform($value) {&lt;br /&gt;        //Seiten ID&lt;br /&gt;        $id = intval(t3lib_div::GP(‚id‘);&lt;br /&gt;        //RSS Widget ist Nummer 7&lt;br /&gt;        $like = “’%&amp;lt;value index=\”vDEF\”&amp;gt;7&amp;lt;/value&amp;gt;%’”;&lt;br /&gt;        //Flexform Daten besorgen&lt;br /&gt;        $sql = $GLOBALS[‘TYPO3_DB’]-&amp;gt;exec_SELECTquery (&lt;br /&gt;            ‚pi_flexform‘,&lt;br /&gt;            ‚tt_content‘,&lt;br /&gt;            ‚pid = ‚.$id.‘ AND pi_flexform LIKE ‚.$like,&lt;br /&gt;            ‘’,&lt;br /&gt;            ‘’,&lt;br /&gt;            ‘’&lt;br /&gt;        );&lt;br /&gt;        $row = $GLOBALS[‘TYPO3_DB’]-&amp;gt;sql_fetch_assoc($sql);&lt;br /&gt;        //Flexform-XML in Array umwandeln&lt;br /&gt;        $flex = t3lib_div::xml2array($row[‘pi_flexform’]);&lt;br /&gt;        Return $this-&amp;gt;pi_getFFvalue($flex, $value, ‘sDEF’);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Der Zugriff und die Zuweisung zu den einzelnen Feldern erfolgt dann im Kopf der renderHeader-Methode mit den folgenden Aufrufen:&lt;br /&gt;&lt;br /&gt;    $this-&amp;gt;conf[‚feedManagingEditor‘] = $this-&amp;gt;getFlexform(„commentEmail“);&lt;br /&gt;    $this-&amp;gt;conf[‚feedDescription‘] = $this-&amp;gt;getFlexform(„feedDescription“);&lt;br /&gt;    $this-&amp;gt;conf[‚feedTitle‘] = $this-&amp;gt;getFlexform(„feedTitle“);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wichtig ist dabei, dass der der Methode getFlexform übergebene Wert dem Wert entspricht, der auch in der flexform_pi2.xml so definiert ist. Die E-Mail Adresse wurde bereits für Kommentar-Emails definiert, die anderen Einstellungen müssen wir noch festlegen. Dies geschieht nach dem Block commentEmail.&lt;br /&gt;&lt;br /&gt;    &amp;lt;feedTitle&amp;gt;&lt;br /&gt;        &amp;lt;TCEforms&amp;gt;&lt;br /&gt;            &amp;lt;exclude&amp;gt;1&amp;lt;/exclude&amp;gt;&lt;br /&gt;            &amp;lt;label&amp;gt;LLL:EXT:t3blog/pi2/locallang.xml:pi_flexform.feedTitle&amp;lt;/label&amp;gt;&lt;br /&gt;            &amp;lt;config&amp;gt;&lt;br /&gt;                &amp;lt;type&amp;gt;input&amp;lt;/type&amp;gt;&lt;br /&gt;                &amp;lt;size&amp;gt;50&amp;lt;/size&amp;gt;&lt;br /&gt;            &amp;lt;/config&amp;gt;&lt;br /&gt;        &amp;lt;/TCEforms&amp;gt;&lt;br /&gt;    &amp;lt;/feedTitle&amp;gt;&lt;br /&gt;    &amp;lt;feedDescription&amp;gt;&lt;br /&gt;        &amp;lt;TCEforms&amp;gt;&lt;br /&gt;            &amp;lt;exclude&amp;gt;1&amp;lt;/exclude&amp;gt;&lt;br /&gt;            &amp;lt;label&amp;gt;LLL:EXT:t3blog/pi2/locallang.xml:pi_flexform.feedDescription&amp;lt;/label&amp;gt;&lt;br /&gt;            &amp;lt;config&amp;gt;&lt;br /&gt;                &amp;lt;type&amp;gt;input&amp;lt;/type&amp;gt;&lt;br /&gt;                &amp;lt;size&amp;gt;50&amp;lt;/size&amp;gt;&lt;br /&gt;            &amp;lt;/config&amp;gt;&lt;br /&gt;        &amp;lt;/TCEforms&amp;gt;&lt;br /&gt;    &amp;lt;/feedDescription&amp;gt;&lt;br /&gt;&lt;br /&gt;In der verlinkten locallang-Datei müssen noch die Beschriftungen eingetragen werden.&lt;br /&gt;&lt;br /&gt;    &amp;lt;label index=“pi_flexform.feedTitle“&amp;gt;Titel des RSS-Feeds (Bei RSS-Widget eintragen):&amp;lt;/label&amp;gt;&lt;br /&gt;    &amp;lt;label index=“pi_flexform.feedDescription“&amp;gt;Kurzbeschreibung des RSS-Feed (Bei RSS-Widget eintragen):&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;feedLink&lt;br /&gt;&lt;br /&gt;Der Link wird zur Startseite des Blogs generiert. Diese ermitteln wir und generieren daraus den Link mit folgender Befehlszeile am Anfang der renderHeader-Methode:&lt;br /&gt;&lt;br /&gt;    $this-&amp;gt;conf[‚feedLink‘] =&lt;br /&gt;(stripos(‚http://‘,t3lib_div::getIndpEnv(‚HTTP_HOST’))?’’:’http://’).t3lib_div::getIndpEnv(‘HTTP_HOST’).’/’.tslib_pibase::pi_getPageLink(t3blog_div::getBlogPid(),’’,’’);&lt;br /&gt;&lt;br /&gt;feedImage&lt;br /&gt;&lt;br /&gt;Ein Bild zum Feed wollen wir nicht anzeigen, deshalb kommentieren wir den Teil zur Generierung des Feed-Bildes im Code aus. Das geschieht in der Methode renderHeader ab Zeile 294.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Thu, 12 Mar 2009 15:46:06 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/95-guid.html</guid>
    
</item>
<item>
    <title>TYPO3 an den Hochschulen in Baden-Württemberg</title>
    <link>http://www.matthiashaeger.de/archives/85-TYPO3-an-den-Hochschulen-in-Baden-Wuerttemberg.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/85-TYPO3-an-den-Hochschulen-in-Baden-Wuerttemberg.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=85</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=85</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    Es ist zwar schon etwas her, genauer gesagt 9 Tage, aber am letzten Mittwoch war das erste TYPO3-Webmaster-Treffen in &lt;a href=&quot;www.hfwu.de&quot;&gt;Nürtingen&lt;/a&gt;. Organisiert von der HfWU und der &lt;a href=&quot;https://www.uni-hohenheim.de/&quot;&gt;Universität Hohenheim&lt;/a&gt; trafen sich dort die TYPO3-Verantwortlichen der Hochschulen in Baden-Württemberg. Gedacht zum gemeinsamen Kennenlernen und Erfahrungsaustausch über das TYPO3-System trafen sich dort Vertreter aus Konstanz (Uni + HTWG), Ulm, Rottenburg, Reutlingen, Hohenheim, Nürtingen-Geislingen, Esslingen und Tübingen.&lt;br /&gt;&lt;br /&gt;Es war seht interessant zu erfahren, mit welchen Problemen andere Hochschulen zu kämpfen haben und welch unterschiedliche Lösungen für ähnliche Probleme gefunden wurden. Insgesamt zeigt sich doch, dass es zwischen den Hochschulen viele Gemeinsamkeiten gibt. Die Anbindung von &lt;a href=&quot;http://www.his.de/&quot;&gt;HIS&lt;/a&gt;-Systemen für Prüfungs- und Vorlesungsverwaltung und die Nutzung von eLearning-Plattformen steht bei nahezu allen Hochschule auf der Agenda.&lt;br /&gt;&lt;br /&gt;Für die Zukunft wurden weitere Treffen und eine engere Zusammenarbeit vereinbart. Ich bin gespannt, ob sich daraus wirklich Synergieeffekte und Erleichterungen ergeben, der Start war schonmal vielversprechend. Das nächste Treffen soll im Mai in Hohenheim stattfinden.  
    </content:encoded>

    <pubDate>Fri, 13 Feb 2009 10:52:16 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/85-guid.html</guid>
    
</item>
<item>
    <title>Extension Mail2BE-User</title>
    <link>http://www.matthiashaeger.de/archives/75-Extension-Mail2BE-User.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/75-Extension-Mail2BE-User.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=75</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=75</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
&lt;b&gt;TYPO3: Mail an alle BE-User&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Wieder eine kleine TYPO3 Extension von mir. Das Problem war, das ich als zentraler Administrator gerne E-Mails an alle registrierten BE-User verschicken wollte. Diese Funktion brauchte ich für Rundbriefe, News, etc. und sie ist leider von TYPO3 nicht vorgesehen. Zwar sollte das Ganze über &lt;a href=&quot;http://typo3.org/extensions/repository/view/direct_mail/current/&quot;&gt;DirectMail&lt;/a&gt; gehen, aber diese Extension war mir dann doch zu groß und umfangreich für den kleinen Anwendungszweck.&lt;br /&gt;&lt;br /&gt;Also habe ich selber ein schnelles Backend-Modul programmiert, das eine Eingabemaske bereitstellt, in der Mailbetreff und Mailtext eingegeben werden können. Mittels Checkboxen können die Empfänger ausgewählt werden, die mit dieser E-Mail beglückt werden.&lt;br /&gt;&lt;br /&gt;&lt;div align=&quot;center&quot;&gt;&lt;!-- s9ymdb:20 --&gt;&lt;img height=&quot;738&quot; width=&quot;669&quot; src=&quot;http://www.matthiashaeger.de/uploads/screenshot.jpg&quot; style=&quot;border: 0px none ; padding-left: 5px; padding-right: 5px;&quot; class=&quot;serendipity_image_center&quot; /&gt;&lt;/div&gt;&lt;br /&gt;Die Extension lässt sich bequem mit einer vorgegebenen Betreffzeile und einem vorgegebenen Absender vorkonfigurieren. Dies geschieht ohne TypoScript oder ähnliches über die Konfiguration im Erweiterungsmanager.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://typo3.org/extensions/repository/view/rz_mailbeuser/current/&quot;&gt;Extension im TER!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Tue, 13 Jan 2009 09:51:15 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/75-guid.html</guid>
    
</item>
<item>
    <title>TYPO3 - LDAP-Anbindung mit eu_ldap plus Modifikationen</title>
    <link>http://www.matthiashaeger.de/archives/63-TYPO3-LDAP-Anbindung-mit-eu_ldap-plus-Modifikationen.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/63-TYPO3-LDAP-Anbindung-mit-eu_ldap-plus-Modifikationen.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=63</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=63</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Endlich komme ich gegen Ende der Woche mal wieder dazu etwas über meine Arbeit an &lt;a href=&quot;http://typo3.org/&quot;&gt;TYPO3&lt;/a&gt; zu bloggen. Die letzte Zeit hatten wir ziemlich damit zu kämpfen, unsere TYPO3-Instanz an das universitäte &lt;a href=&quot;http://de.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol&quot;&gt;LDAP&lt;/a&gt; anzubinden.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Ausgangslage&lt;/u&gt;: Bei uns an der Universität ist ein LDAP-Verzeichnis aktiv, dass die Accountdaten für sämtliche Mitglieder der Universität speichert. Es wäre also sinnvoll auch die Authentifzierung für unser TYPO3 darüber zu machen, da wir uns eine eigene Passwort- und Benutzerverwaltung innerhalb TYPO3 damit zumindest erleichtern können. Auch wenn sie nicht ganz wegfällt. Problematisch dabei ist, dass das LDAP wie so häufig historisch gewachsen ist und das LDAP-Schema dadurch nicht gerade komfortabel.&lt;br /&gt;&lt;div class=&quot;serendipity_imageComment_google&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;&lt;!--&lt;br /&gt;
google_ad_client = &quot;pub-0009322791207132&quot;;&lt;br /&gt;
/&lt;strong&gt; 234x60, Erstellt 18.09.08 &lt;/strong&gt;/&lt;br /&gt;
google_ad_slot = &quot;5594190642&quot;;&lt;br /&gt;
google_ad_width = 234;&lt;br /&gt;
google_ad_height = 60;&lt;br /&gt;
//--&gt;&lt;br /&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;script src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot; type=&quot;text/javascript&quot;&gt;&lt;br /&gt;
&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;
&lt;u&gt;Weg und Lösung:&lt;/u&gt; Wir begannen als Basis mit der verbreiteten &lt;a href=&quot;http://typo3.org/extensions/repository/view/eu_ldap/current/&quot;&gt;eu_ldap Extension&lt;/a&gt;, die unseren Anforderungen relativ nahe kam. Trotzdem waren noch einige Anpassungen nötig. Zuerst ist es bei uns so, dass die Benutzer über eine eindeutige ID identifiziert werden, wir aber den Login über den leichter zu merkenden E-Mail-Alias (vorname.nachname) haben wollten. Deshalb mussten wir in eu_ldap einen Zwischenschritt einbauen, der zuerst den Benutzer mit dem Alias gegen das LDAP-Verzeichnis authentifziert, dann die eindeutige ID ermittelt und mit dieser im weiteren Verlauf die Gruppenzuordnung herstellt.&lt;br /&gt;&lt;br /&gt;Leider konnten wir nicht dem Benutzer einfach ein Attribut zuweisen, sondern mussten den Weg gehen für das TYPO3 eine neue Gruppe (ou=typo3) anzulegen, in der die IDs der erlaubten Benutzer (memberUID) geschrieben werden. Über die Einschränkung &lt;i&gt;nur Benutzer aus Gruppe&lt;/i&gt; in eu_ldap können wir so die Authentifzierung nach unseren Wünschen durchführen.&lt;br /&gt;&lt;br /&gt;Als nächstes Problem stellte sich der Import neuer User ins TYPO3 dar. Benutzer werden in einer externen, proprietären Anwendung in die TYPO3-Gruppe verschoben oder entfernt und stehen dann für TYPO3 zur Verfügung. Entweder wartet man bis sich der Benutzer das erste Mal einloggt, dann wird er importiert. Dies ist aber sehr unkomfortabel, da wir ihm erst nach dem 1. Einloggen die TYPO3-Gruppen zuordnen können, die ihm Rechte und Zugriff auf bestimmte Zweige des Baumes geben. Der manuelle Import neuer Benutzer durch eu_ldap funktionierte zwar im Prinzip, zeigte aber den unschönen Effekt, dass der gesamte LDAP-Baum durchlaufen und jeder Benutzer einzeln auf Zugehörigkeit überprüft wird. Bei knapp 15.000 Benutzern im LDAP aus Performance-Gründen nicht akzeptabel. Wir haben daraufhin das Backend-Modul von eu_ldap um zwei Importmöglichkeiten erweitert. Entweder ein einzelner Benutzer kann über seinen Alias importiert werden, oder gleich eine ganze komma-separierte Liste an Benutzern. Dabei wird nicht der ganze Baum, sondern nur der eingegebene Benutzer überprüft.&lt;br /&gt;&lt;br /&gt;Das letzte Problem war schließlich ein altbekanntes von eu_ldap. Manuell zugeordnete Gruppen werden beim Re-Import des Benutzers nach dem Einloggen gelöscht. Da wir aber die TYPO3-Gruppen nicht im LDAP zuordnen können, sondern dies weiterhin in TYPO3 geschehen muss, mussten wir eine Unterscheidung zwischen LDAP-Gruppen und &amp;quot;normalen&amp;quot; Gruppen herstellen. Hierbei half uns der von Tom Gottschalk in seiner Diplomarbeit &amp;quot;&lt;a href=&quot;http://www.develounge.de/diplomarbeit/&quot;&gt;Entwicklung einer interaktiven Publikations-Plattform mit Redaktionssystem für den Fachbereich Medien der Hochschule Mittweida (FH)&lt;/a&gt;&amp;quot; entwickelte Hack sehr weiter, den wir nahezu unverändert übernehmen konnten. Danke schön!&lt;br /&gt;&lt;br /&gt;Daneben waren noch einige kleiner Anpassungen am Code, eine eigene Logging-Funktion zum Debuggen und vieles mehr nötig, so dass wir &lt;a href=&quot;http://www.entios.de/t3/neue-version-von-eu-ldap-in-arbeit.html&quot;&gt;eu_ldap&lt;/a&gt; doch deutlich modifziert und auf uns zugeschnitten haben. OpenSource zeigt hier seine Stärken, die Flexibilität und Anpassbarkeit - besonders von TYPO3 - ist klasse.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Jetzige Situation:&lt;/u&gt; Derzeit läuft es so ab, dass wir einen neuen Benutzer extern zum TYPO3-User machen, ihn danach über unser modifiziertes eu_ldap ins TYPO3-Backend importieren und dort dann die Gruppen zuweisen. Soll ein Benutzer kein TYPO3-Admin mehr sein, dann nehmen wir einfach aus der LDAP-Gruppe raus oder der Account wird durch Ausscheiden aus der Uni automatisch inaktiv.&lt;br /&gt;&lt;br /&gt;Im nächsten Schritt müssen wir uns noch Gedanken über die Realisierung von Frontend-Login machen, um bestimmte Bereiche nur Mitgliedern der Universität oder einzelnen Fachbereichen zugänglich zu machen. Das steht auf der Agenda aber nicht ganz oben.&lt;p /&gt;  
    </content:encoded>

    <pubDate>Fri, 05 Dec 2008 14:47:00 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/63-guid.html</guid>
    
</item>
<item>
    <title>TYPO3 - Anwendertag</title>
    <link>http://www.matthiashaeger.de/archives/53-TYPO3-Anwendertag.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/53-TYPO3-Anwendertag.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=53</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=53</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Wie angekündigt war ich gestern auf dem &lt;a href=&quot;http://typo3-anwendertag.de/&quot;&gt;TYPO3&lt;/a&gt;-&lt;a href=&quot;http://typo3blogger.de/typo3-vs-sap-und-fazit/&quot;&gt;Anwendertag&lt;/a&gt; in Frankfurt, um mir neue Inputs zu holen und mich einfach mal darüber zu informieren was andere so machen. Meine Meinung dazu ist zweigeteilt, denn die Qualität der Vorträge und Beiträge war stark unterschiedlich. Nicht nur inhatlich, sondern auch in der Präsentation. Bei manchen Leuten kann man wirklich nur sagen: &amp;quot;Geht in Euer Büro, schließt Euch ein, programmiert - aber stellt Euch nie wieder vor Leute und redet.&amp;quot; Von &amp;quot;zu leise&amp;quot; über &amp;quot;zu eintönig&amp;quot; bis zu &amp;quot;20 Minuten mit der Leinwand statt mit dem Publikum reden&amp;quot; und &amp;quot;falsch angezeigten Folien&amp;quot; waren eigentlich alle &amp;quot;No-Gos&amp;quot; für Präsentationen vertreten.&lt;br /&gt;&lt;br /&gt;Inhaltlich setzte sich die unterschiedliche Qualität fort. Bei einem Teil der Beiträge dachte ich mir &amp;quot;Ja ganz nett, aber nix Neues&amp;quot; Dazu blieben auch einige zu sehr an der Oberfläche, die Präsentationen hätte man auch gut einem nicht-typo3-affinen Publikum vorsetzen können. Bei einer mit genügend Vorkenntnissen ausgestatteten Zuhörergruppe hätte ich mitunter schon etwas technischere und detailliertere Angaben gewünscht. Aber es soll jetzt nicht nur nach Kritik hier aussehen, einige Vorträge waren wirklich top und sehr informativ und haben auch eine Menge neue Ideen geliefert. Hierzu zähle ich besonders die Vorträge von Cisco Webex, tobaccoland und TYPO3 mit SAP, die - alle am Ende platziert - die Veranstaltung zum Schluß nocheinmal auf ein deutlich höheres Niveau gehoben haben.&lt;br /&gt;&lt;br /&gt;Mein Fazit sieht so aus: Diejenigen die TYPO3 selbst umsetzen, kochen alle nur mit Wasser und liefern auch keine besonderen Lösungen. Nichts, hinter dem &lt;a href=&quot;http://www.rz.uni-konstanz.de/&quot;&gt;wir&lt;/a&gt; uns verstecken müssen und auch nicht viel was ich jetzt für besonders speziell und erwähnenswert halte. Diejnigen die spezialisierte Agenturen wie &lt;a href=&quot;http://www.aoemedia.de/&quot;&gt;AOEMedia&lt;/a&gt; oder &lt;a href=&quot;http://www.dkd.de/de/home/&quot;&gt;d.k.d.&lt;/a&gt; zu Rate ziehen, die erhalten auch innovative und teils spektakuläre Lösungen bei denen TYPO3 seine ganze Flexbilität und Erweiterbarkeit demonstrieren kann. Hier kann man sich auf jeden Fall Ideen abgucken und neue Impulse sammeln, zumal die individuelle Lösungen auch der Community wieder &lt;a href=&quot;http://typo3.org/podcasts/kasper&quot;&gt;zur Verfügung gestellt &lt;/a&gt;werden.&lt;br /&gt;&lt;br /&gt;Insgesamt also ein durchwachsener Tag, für die doch stolze Teilnahmegebühr von 238,00 Euro hätte ich mir persönlich etwas mehr Qualität erwartet.&lt;br /&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Wed, 12 Nov 2008 09:25:32 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/53-guid.html</guid>
    
</item>
<item>
    <title>Meine erste Typo3 Extension im TER: ActiveKB Top 10</title>
    <link>http://www.matthiashaeger.de/archives/52-Meine-erste-Typo3-Extension-im-TER-ActiveKB-Top-10.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/52-Meine-erste-Typo3-Extension-im-TER-ActiveKB-Top-10.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=52</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=52</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Jawoll. Es ist vollbracht. Meine erste eigene Extension findet sich im Typo3 Extension Repository, kurz &lt;a href=&quot;http://typo3.org/extensions/repository/view/activekbtop10/current/&quot;&gt;TER,&lt;/a&gt; wieder. Nachdem meine bisherigen Programmierungen immer &lt;a href=&quot;http://www.matthiashaeger.de/categories/1-Typo3&quot;&gt;sehr individuelle&lt;/a&gt;, auf die Bedürfnisse bei uns an der &lt;a href=&quot;http://www.uni-konstanz.de&quot;&gt;Uni&lt;/a&gt; zugeschnittene Erweiterungen hervorbrachten, freue ich mich jetzt, eine Extension an die Community zurückzugeben, die mir bisher auch schon viel geholfen hat. Und zwar handelt es sich um die Extension &lt;b&gt;ActiveKB Top 10&lt;/b&gt;. Nun - was tut sie?&lt;br /&gt;&lt;br /&gt;Wir setzen bei uns an der Universität zusätzlich zu Typo3 die &lt;a href=&quot;http://www.rz.uni-konstanz.de/activekb/&quot;&gt;ActiveKB Knowledge Base&lt;/a&gt; der Firma &lt;a href=&quot;http://www.interspire.com/&quot;&gt;Interspire&lt;/a&gt; ein. Mittlerweile heißt das Ding glaube ich Knowledge Manager. Es ist eine für unsere Zwecke sehr geeignete Software um FAQs, Tutorials und Co. in Form einer durchsuch- und bewertbaren Wissensdatenbank den Benutzern zur Verfügung zu stellen. Eine meiner Aufgaben ist es nun, diese Knowledge Base bestmöglichst mit Typo3 zu &amp;quot;verheiraten&amp;quot;. Diese kleine Extension ist das erste Ergebnis davon.&lt;br /&gt;&lt;br /&gt;&lt;!-- s9ymdb:16 --&gt;&lt;div align=&quot;center&quot;&gt;&lt;img height=&quot;170&quot; width=&quot;640&quot; class=&quot;serendipity_image_center&quot; style=&quot;border: 0px none ; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://www.matthiashaeger.de/uploads/activekbtop10.jpg&quot; /&gt;&lt;/div&gt;&lt;br /&gt;Sie erlaubt es auf jeder beliebigen Seite ein Inhaltselement vom Typ Plug-In zu setzen und in den Einstellungen eine Kategorie der Knowledge Base und die Anzahl der zu zeigenden Artikel auszuwählen. Auf der Typo3 Seite werden dann die &lt;i&gt;X&lt;/i&gt; beliebtesten Artikel aus der KB direkt angezeigt. So, wie auf dem Screenshot ersichtlich. Die Extension heißt Top 10, weil standardmäßig die 10 beliebtesten Artikel angezeigt werden.&lt;br /&gt;&lt;br /&gt;Technisch gesehen stellt die Extension eine Verbindung zur KB-Datenbank her, ermittelt die vorhandenen Kategorien und - nach Auswahl einer Kategorie durch den Benutzer - die zugehörigen Einträge, die dann einfach dargestellt werden. Mittels TypoScript Einträgen werden KB-Pfade und Datenbanknamen gesetzt.&lt;br /&gt;&lt;br /&gt;Ich weiß nicht, wer diese Extension brauchen kann, denn meine bisherigen Recherchen haben keine Anzeichen dafür ergeben, dass schonmal jemand Typo3 und Interspire ActiveKB gemeinsam eingesetzt hat. Trotzdem würde ich mich freuen, wenn meine Extension jemandem helfen kann.&lt;br /&gt;&lt;br /&gt;Apropos Typo3: Morgen bin ich in Frankfurt auf dem &lt;a href=&quot;http://www.typo3-anwendertag.de/&quot;&gt;Typo3-Anwendertag&lt;/a&gt;. Da bin ich mal gespannt, was man da so für neue Ideen und Anregungen bekommt.  
    </content:encoded>

    <pubDate>Mon, 10 Nov 2008 19:06:00 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/52-guid.html</guid>
    
</item>
<item>
    <title>Neue Typo3 Extension - CSS Editor</title>
    <link>http://www.matthiashaeger.de/archives/46-Neue-Typo3-Extension-CSS-Editor.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/46-Neue-Typo3-Extension-CSS-Editor.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=46</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=46</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Ich möchte eine weitere neue selbstentwickelte &lt;a href=&quot;http://www.typo3.org&quot;&gt;Typo3&lt;/a&gt; Extension vorstellen.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ausgangslage:&lt;/u&gt;&lt;/b&gt; Wir wollen wie bekannt an der &lt;a href=&quot;http://www.uni-konstanz.de/&quot;&gt;Universität Konstanz&lt;/a&gt; Typo3 als uniweites CMS einführen. Das Problem ist dabei, dass wir zwar das Layout vorgeben, jeder Fachbereich und jede Einrichtung (BE-Gruppe mit eigenem Zweig) aber die Farben selber wählen darf. Beispiel: &lt;a href=&quot;http://www.rz.uni-konstanz.de/&quot;&gt;Rechenzentrum&lt;/a&gt; und &lt;a href=&quot;http://www.kim.uni-konstanz.de/&quot;&gt;KIM&lt;/a&gt;. Gleiches Layout, unterschiedliche Farben. Die Zuweisung der Farben erfolgt über CSS-Dateien, die für jede Gruppe eingebunden werden. Der Benutzer soll nun die Farben ändern können, ohne CSS lernen und eingeben zu müssen, ohne die CSS-Datei auf dem Server direkt zu manipulieren und ohne mit TypoScript-Code in Berührung zu kommen. Gefragt war also eine grafische Möglichkeit. Eine bestehende Lösung konnte ich nicht finden.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;&lt;div class=&quot;serendipity_imageComment_right&quot; style=&quot;width: 110px;&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;a class=&quot;serendipity_image_link&quot; href=&quot;http://www.matthiashaeger.de/uploads/css_edit.jpg&quot; onclick=&quot;F1 = window.open(&#039;/uploads/css_edit.jpg&#039;,&#039;Zoom&#039;,&#039;height=436,width=515,top=301.5,left=390,toolbar=no,menubar=no,location=no,resize=1,resizable=1,scrollbars=yes&#039;); return false;&quot;&gt;&lt;!-- s9ymdb:15 --&gt;&lt;img height=&quot;93&quot; width=&quot;110&quot; class=&quot;serendipity_image_right&quot; src=&quot;http://www.matthiashaeger.de/uploads/css_edit.serendipityThumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;CSS Editor&lt;/div&gt;&lt;/div&gt;Lösung:&lt;/b&gt;&lt;/u&gt; Die von mir entwickelt Extension baut auf folgendem Grundprinzip auf. Es wird die dem aktuelle eingeloggten Backend-Benutzer zugehörige Gruppe ermittelt und das bestehende CSS-File eingelesen, das den Namen der Gruppe tragen muss. Im CSS-File sind die zu verändernden Parameter durch eindeutige Marker gekennzeichnet. Das Backend-Modul liest die Werte ein und stellt sie mit Erläuterungen in Textfeldern dar. Die Hex-Werte können direkt manipuliert werden.&lt;br /&gt;&lt;br /&gt;Um dem Benutzer, der mit Hex-Werten nichts anfangen kann, Unterstützung zu geben ist ein Color Chooser eingebaut. Er ist aus der &lt;a href=&quot;http://developer.yahoo.com/yui/colorpicker/&quot;&gt;Yahoo UI Library&lt;/a&gt; entnommen. Jeder Wert eines Parameters kann im Color Chooser angezeigt und dann bequem durch Ziehen manipuliert werden. RGB- und HSV-Werte können direkt eingegeben werden.&lt;br /&gt;&lt;br /&gt;Unterhalb des Eingabebereiches findet sich eine Live-Vorschau, die das Layout unserer Webseiten zeigt. Bei Veränderung einer Farbe wird die Vorschau direkt verändert, so dass man die Wirkung von geänderten Farben direkt ersehen kann. Sind die Farben nach Wunsch verändert, dann können sie per Mausklick in die CSS-Datei geschrieben werden und sind dann im jeweiligen Webauftritt verfügbar.&lt;br /&gt;&lt;br /&gt;Also ein grafischer Farbeditor für CSS-Dateien mit dem man die Stylesheets bequem und ohne Vorkenntnisse ändern kann. Zusammen mit einem in der neuen Version dann hoffentlich vernünftigen &lt;a href=&quot;http://typo3blogger.de/neues-frontend-editing-in-typo3-43/&quot;&gt;Frontend Editing&lt;/a&gt; kann man dann auch wenig technik-affine Sekretärinnen (Achtung: 5€ in die Chauvi-kasse) auf das System loslassen.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Demonstration:&lt;/b&gt;&lt;/u&gt; Eine kurze Tour durch den CSS Editor zeigt das von mir am Bildschirm aufgenommene Youtube - Video indem man die Benutzerführung und das Look &amp;amp; Feel grob erkennen kann.&lt;br /&gt;&lt;br /&gt;
&lt;center&gt;&lt;object height=&quot;349&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/80bryYhXcOY&amp;hl=de&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed height=&quot;349&quot; width=&quot;425&quot; src=&quot;http://www.youtube.com/v/80bryYhXcOY&amp;hl=de&amp;fs=1&amp;rel=0&amp;color1=0x234900&amp;color2=0x4e9e00&amp;border=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; /&gt;&lt;/object&gt;&lt;/center&gt;&lt;br /&gt;
&lt;u&gt;&lt;b&gt;Weiterverwendung&lt;/b&gt;&lt;/u&gt;: Leider ist die Extension momentan sehr auf unsere lokalen Verhältnisse zugeschnitten. Deshalb ist sie auch nicht im &lt;a href=&quot;http://typo3.org/extensions&quot;&gt;TER&lt;/a&gt; verfügbar. Durch die individuellen Marker in den CSS-Dateien und die individuelle Vorschau halte ich es auch für sehr schwierig sie so anzupassen, dass man sie universell verwenden kann. Für alle Interessierten habe ich trotzdem den Code der &lt;i&gt;mod1/index.php&lt;/i&gt; und der Beispiel-CSS Datei &lt;i&gt;vorlage.css &lt;/i&gt;im erweiterten Blogeintrag hinterlegt&lt;br /&gt;&lt;br /&gt;
 &lt;br /&gt;
&lt;u&gt;&lt;b&gt;&lt;p&gt;mod1/index.php&lt;/p&gt;&lt;/b&gt;&lt;/u&gt;&lt;p /&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;/***************************************************************&lt;br /&gt;*  Copyright notice&lt;br /&gt;*&lt;br /&gt;*  (c) 2008 Matthias Häger &amp;lt;matthias.haeger@uni-konstanz.de&amp;gt;&lt;br /&gt;*  All rights reserved&lt;br /&gt;*&lt;br /&gt;*  This script is part of the TYPO3 project. The TYPO3 project is&lt;br /&gt;*  free software; you can redistribute it and/or modify&lt;br /&gt;*  it under the terms of the GNU General Public License as published by&lt;br /&gt;*  the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;*  (at your option) any later version.&lt;br /&gt;*&lt;br /&gt;*  The GNU General Public License can be found at&lt;br /&gt;*  http://www.gnu.org/copyleft/gpl.html.&lt;br /&gt;*&lt;br /&gt;*  This script is distributed in the hope that it will be useful,&lt;br /&gt;*  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;*  GNU General Public License for more details.&lt;br /&gt;*&lt;br /&gt;*  This copyright notice MUST APPEAR in all copies of the script!&lt;br /&gt;***************************************************************/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // DEFAULT initialization of a module [BEGIN]&lt;br /&gt;unset($MCONF);&lt;br /&gt;require_once(&#039;conf.php&#039;);&lt;br /&gt;require_once($BACK_PATH.&#039;init.php&#039;);&lt;br /&gt;require_once($BACK_PATH.&#039;template.php&#039;);&lt;br /&gt;&lt;br /&gt;$LANG-&amp;gt;includeLLFile(&#039;EXT:rz_csseditor/mod1/locallang.xml&#039;);&lt;br /&gt;require_once(PATH_t3lib.&#039;class.t3lib_scbase.php&#039;);&lt;br /&gt;$BE_USER-&amp;gt;modAccess($MCONF,1);    // This checks permissions and exits if the users has no permission for entry.&lt;br /&gt;    // DEFAULT initialization of a module [END]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; &lt;strong&gt; Module &#039;CSS Editor&#039; for the &#039;rz_csseditor&#039; extension.&lt;br /&gt; *&lt;br /&gt; &lt;/strong&gt; @author    Matthias Häger &amp;lt;matthias.haeger@uni-konstanz.de&amp;gt;&lt;br /&gt; &lt;strong&gt; @package    TYPO3&lt;br /&gt; &lt;/strong&gt; @subpackage    tx_rzcsseditor&lt;br /&gt; */&lt;br /&gt;class  tx_rzcsseditor_module1 extends t3lib_SCbase {&lt;br /&gt;                var $pageinfo;&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Initializes the Module&lt;br /&gt;                 &lt;/strong&gt; @return    void&lt;br /&gt;                 */&lt;br /&gt;                function init()    {&lt;br /&gt;                    global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;&lt;br /&gt;&lt;br /&gt;                    parent::init();&lt;br /&gt;&lt;br /&gt;                    /*&lt;br /&gt;                    if (t3lib_div::&lt;u&gt;GP(&#039;clear_all_cache&#039;))    {&lt;br /&gt;                        $this-&amp;gt;include_once[] = PATH_t3lib.&#039;class.t3lib_tcemain.php&#039;;&lt;br /&gt;                    }&lt;br /&gt;                    &lt;strong&gt;/&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;/strong&gt; Adds items to the -&amp;gt;MOD_MENU array. Used for the function menu selector.&lt;br /&gt;                 *&lt;br /&gt;                 &lt;strong&gt; @return    void&lt;br /&gt;                 */&lt;br /&gt;                function menuConfig()    {&lt;br /&gt;                    global $LANG;&lt;br /&gt;                    $this-&amp;gt;MOD_MENU = Array (&lt;br /&gt;                        &#039;function&#039; =&amp;gt; Array (&lt;br /&gt;                            &#039;1&#039; =&amp;gt; $LANG-&amp;gt;getLL(&#039;function1&#039;),&lt;br /&gt;                            &#039;2&#039; =&amp;gt; $LANG-&amp;gt;getLL(&#039;function2&#039;),&lt;br /&gt;                            &#039;3&#039; =&amp;gt; $LANG-&amp;gt;getLL(&#039;function3&#039;),&lt;br /&gt;                        )&lt;br /&gt;                    );&lt;br /&gt;                    parent::menuConfig();&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;/strong&gt; Main function of the module. Write the content to $this-&amp;gt;content&lt;br /&gt;                 &lt;strong&gt; If you chose &amp;quot;web&amp;quot; as main module, you will need to consider the $this-&amp;gt;id parameter which will contain the uid-number of the page clicked in the page tree&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @return    [type]        ...&lt;br /&gt;                 */&lt;br /&gt;                function main()    {&lt;br /&gt;                    global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;&lt;br /&gt;&lt;br /&gt;                    // Access check!&lt;br /&gt;                    // The page will show only if there is a valid page and if this page may be viewed by the user&lt;br /&gt;                    $this-&amp;gt;pageinfo = t3lib_BEfunc::readPageAccess($this-&amp;gt;id,$this-&amp;gt;perms_clause);&lt;br /&gt;                    $access = is_array($this-&amp;gt;pageinfo) ? 1 : 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                    //Einführung einer zusätzlichen Abfrage um die Extension auch für Nicht-Admins nutzbar zu machen.&lt;br /&gt;                    if (($this-&amp;gt;id &amp;amp;&amp;amp; $access) || ($BE_USER-&amp;gt;user[&#039;admin&#039;] &amp;amp;&amp;amp; !$this-&amp;gt;id) || 1==1)    {&lt;br /&gt;&lt;br /&gt;                            // Draw the header.&lt;br /&gt;                        $this-&amp;gt;doc = t3lib_div::makeInstance(&#039;mediumDoc&#039;);&lt;br /&gt;                        $this-&amp;gt;doc-&amp;gt;backPath = $BACK_PATH;&lt;br /&gt;                        $this-&amp;gt;doc-&amp;gt;form=&#039;&amp;lt;form action=&amp;quot;&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;&#039;;&lt;br /&gt;&lt;br /&gt;                            // JavaScript&lt;br /&gt;                        $this-&amp;gt;doc-&amp;gt;JScode = &#039;&lt;br /&gt;                            &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;                                script_ended = 0;&lt;br /&gt;                                function jumpToUrl(URL)    {&lt;br /&gt;                                    document.location = URL;&lt;br /&gt;                                }&lt;br /&gt;                            &amp;lt;/script&amp;gt;&lt;br /&gt;                        &#039;;&lt;br /&gt;                        $this-&amp;gt;doc-&amp;gt;postCode=&#039;&lt;br /&gt;                            &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;                                script_ended = 1;&lt;br /&gt;                                if (top.fsMod) top.fsMod.recentIds[&amp;quot;web&amp;quot;] = 0;&lt;br /&gt;                            &amp;lt;/script&amp;gt;&lt;br /&gt;                        &#039;;&lt;br /&gt;&lt;br /&gt;                        $headerSection = $this-&amp;gt;doc-&amp;gt;getHeader(&#039;pages&#039;,$this-&amp;gt;pageinfo,$this-&amp;gt;pageinfo[&#039;_thePath&#039;]).&#039;&amp;lt;br /&amp;gt;&#039;.$LANG-&amp;gt;sL(&#039;LLL:EXT:lang/locallang_core.xml:labels.path&#039;).&#039;: &#039;.t3lib_div::fixed_lgd_pre($this-&amp;gt;pageinfo[&#039;_thePath&#039;],50);&lt;br /&gt;&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;startPage($LANG-&amp;gt;getLL(&#039;title&#039;));&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;header($LANG-&amp;gt;getLL(&#039;title&#039;));&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;spacer(5);&lt;br /&gt;                        //$this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;section(&#039;&#039;,$this-&amp;gt;doc-&amp;gt;funcMenu($headerSection,t3lib_BEfunc::getFuncMenu($this-&amp;gt;id,&#039;SET[function]&#039;,$this-&amp;gt;MOD_SETTINGS[&#039;function&#039;],$this-&amp;gt;MOD_MENU[&#039;function&#039;])));&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;divider(5);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                        // Render content:&lt;br /&gt;                        $this-&amp;gt;moduleContent();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                        // ShortCut&lt;br /&gt;                        if ($BE_USER-&amp;gt;mayMakeShortcut())    {&lt;br /&gt;                            $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;spacer(20).$this-&amp;gt;doc-&amp;gt;section(&#039;&#039;,$this-&amp;gt;doc-&amp;gt;makeShortcutIcon(&#039;id&#039;,implode(&#039;,&#039;,array_keys($this-&amp;gt;MOD_MENU)),$this-&amp;gt;MCONF[&#039;name&#039;]));&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;spacer(10);&lt;br /&gt;                    } else {&lt;br /&gt;                            // If no access or if ID == zero&lt;br /&gt;&lt;br /&gt;                        $this-&amp;gt;doc = t3lib_div::makeInstance(&#039;mediumDoc&#039;);&lt;br /&gt;                        $this-&amp;gt;doc-&amp;gt;backPath = $BACK_PATH;&lt;br /&gt;&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;startPage($LANG-&amp;gt;getLL(&#039;title&#039;));&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;header($LANG-&amp;gt;getLL(&#039;title&#039;));&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;spacer(5);&lt;br /&gt;                        $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;spacer(10);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Prints out the module HTML&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @return    void&lt;br /&gt;                 */&lt;br /&gt;                function printContent()    {&lt;br /&gt;&lt;br /&gt;                    $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;endPage();&lt;br /&gt;                    echo $this-&amp;gt;content;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Generates the module content&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @return    void&lt;br /&gt;                 */&lt;br /&gt;                function moduleContent()    {&lt;br /&gt;                    //Ermittlung der Gruppe des eingeloggten Benutzers&lt;br /&gt;                    $group_id = (int)strtok($GLOBALS[&#039;BE_USER&#039;]-&amp;gt;user[usergroup], &amp;quot;,&amp;quot;);&lt;br /&gt;                    $res = $GLOBALS[&#039;TYPO3_DB&#039;]-&amp;gt;exec_SELECTquery(&lt;br /&gt;                        &#039;title&#039;,&lt;br /&gt;                        &#039;be_groups&#039;,&lt;br /&gt;                        &#039;uid=&#039;.$group_id,&lt;br /&gt;                        &#039;&#039;,&lt;br /&gt;                        &#039;&#039;,&lt;br /&gt;                        &#039;&#039;&lt;br /&gt;                        );&lt;br /&gt;                    $row=$GLOBALS[&#039;TYPO3_DB&#039;]-&amp;gt;sql_fetch_assoc($res);&lt;br /&gt;                    $group = $row[&#039;title&#039;];&lt;br /&gt;                    &lt;br /&gt;                    //Einstellbare Parameter (Keywords)&lt;br /&gt;                    $params = array(&amp;quot;CSS_H1&amp;quot;, &amp;quot;CSS_H2&amp;quot;, &amp;quot;CSS_NAVTOP&amp;quot;, &amp;quot;CSS_NAVMAIN&amp;quot;, &amp;quot;CSS_LEFTNAV&amp;quot;, &amp;quot;CSS_CONTENT&amp;quot;, &amp;quot;CSS_LINK&amp;quot;);&lt;br /&gt;                    switch((string)$this-&amp;gt;MOD_SETTINGS[&#039;function&#039;])    {&lt;br /&gt;                        case 1:&lt;br /&gt;                            if(t3lib_div::_POST(&#039;do&#039;)==&amp;quot;send&amp;quot;) {&lt;br /&gt;                                $this-&amp;gt;updateCSS($group, $params);&lt;br /&gt;                                $content = &amp;quot;Änderungen eingetragen!&amp;quot;;&lt;br /&gt;                                $content .= &amp;quot;&amp;lt;hr&amp;gt;&amp;quot;;&lt;br /&gt;                                $content .= $this-&amp;gt;renderPage($group, $params);&lt;br /&gt;                            } else {&lt;br /&gt;                                $content = $this-&amp;gt;renderPage($group, $params);&lt;br /&gt;                            }&lt;br /&gt;                            $this-&amp;gt;content.=$content;&lt;br /&gt;                        break;&lt;br /&gt;                        case 2:&lt;br /&gt;                            $content=&#039;&amp;lt;div align=center&amp;gt;&amp;lt;strong&amp;gt;Menu item #2...&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;                            $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;section(&#039;Message #2:&#039;,$content,0,1);&lt;br /&gt;                        break;&lt;br /&gt;                        case 3:&lt;br /&gt;                            $content=&#039;&amp;lt;div align=center&amp;gt;&amp;lt;strong&amp;gt;Menu item #3...&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;                            $this-&amp;gt;content.=$this-&amp;gt;doc-&amp;gt;section(&#039;Message #3:&#039;,$content,0,1);&lt;br /&gt;                        break;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Generiert die Seite und gibt sie an die übergeordnete Funktion zurück.&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @param    String  Name der Gruppe des Benutzers&lt;br /&gt;                 &lt;strong&gt; @param    Array    Die Parameter die in der CSS-Datei verändert werden sollen.&lt;br /&gt;                 &lt;/strong&gt; @return    String    Output der Webseite&lt;br /&gt;                 */&lt;br /&gt;                function renderPage($group, $params) {&lt;br /&gt;&lt;br /&gt;                    //Festlegung der Beschreibung der einzelnen Parameter&lt;br /&gt;                    $CSS_H1 = &amp;quot;Hintergrundfarbe Überschrift 1. Ordnung: &amp;quot;;&lt;br /&gt;                    $CSS_H2 = &amp;quot;Farbe der Überschrift 2. Ordnung: &amp;quot;;&lt;br /&gt;                    $CSS_NAVTOP = &amp;quot;Hintergrundfarbe Top-Menü mit Quicklinks: &amp;quot;;&lt;br /&gt;                    $CSS_NAVMAIN = &amp;quot;Hintergrundfarbe Hauptmenü: &amp;quot;;&lt;br /&gt;                    $CSS_LEFTNAV = &amp;quot;Hintergrundfarbe linkes Navigationsmenü: &amp;quot;;&lt;br /&gt;                    $CSS_CONTENT = &amp;quot;Hintergrundfarbe Hauptinhaltsbereich: &amp;quot;;&lt;br /&gt;                    $CSS_LINK = &amp;quot;Farbe eines Links im Inhaltsbereich: &amp;quot;;&lt;br /&gt;                    &lt;br /&gt;                    //Einleitender Text&lt;br /&gt;                    $output = &amp;quot;In diesem Bereich können Sie Farben für Ihren Webauftritt anpassen. Das Layout der Universität wird vorgegeben, Ihre Wahl der Farben wird in einem eigenen CSS-File für Ihre Webseiten niedergelegt. Damit können Sie Ihre Seiten farblich nach Ihren Wünschen gestalten.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;In jeder Zeile sehen Sie den aktuellen Hex-Farbwert für die angegebene Eingeschaft. Durch einen Klick auf Edit wird der Farbwähler daneben auf diesen Wert eingestellt. Sie können die Farbe frei verändern, die Auswirkungen können Sie direkt unten in der Vorschau beobachten. Mit einem Klick auf den Button \&amp;quot;Übernehmen\&amp;quot; wird der neue Farbwert übernommen (dargestellt durch rote Farbe). Mit \&amp;quot;Reset\&amp;quot; setzen Sie den Farbwähler auf den Ausgangswert zurück. Endgültig in die Datei geschrieben werden die Änderungen erst bei einem Klick auf \&amp;quot;Änderungen in Datei schreiben.\&amp;quot; &amp;lt;b&amp;gt;Vorsicht: Dieser Klick hat direkte Auswirkungen auf Ihre Webseite.&amp;lt;/b&amp;gt;&lt;br /&gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;;                    &lt;br /&gt;                    $output .= &amp;quot;Sie sind Angehöriger der Gruppe: &amp;quot;.$group.&amp;quot;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;    &lt;br /&gt;                &lt;br /&gt;                    //Datei öffnen&lt;br /&gt;                    $file = file(&amp;quot;https://cms.uni-konstanz.de/fileadmin/templates/&amp;quot;.$group.&amp;quot;.css&amp;quot;);&lt;br /&gt;                    //Array durchlaufen und Zeilennummer (+2) und Wert für wichtige Eigenschaften speichern&lt;br /&gt;                    $css_config = array();&lt;br /&gt;                    for($i=0; $i&amp;lt;count($file);$i++) {&lt;br /&gt;                        foreach($params as $unit) {&lt;br /&gt;                            if(strstr($file[$i], &amp;quot;/***&amp;quot;.$unit.&amp;quot;***/&amp;quot;) != false) {&lt;br /&gt;                                $css_config[$unit.&amp;quot;_line&amp;quot;] =  $i+2;&lt;br /&gt;                                $css_config[$unit.&amp;quot;_value&amp;quot;] = substr(strrchr($file[$i+2],&amp;quot;#&amp;quot;),0,7);&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;br&amp;gt;&amp;quot;;&lt;br /&gt;                    &lt;br /&gt;                    //Globale JavaScript Variablen definieren um später die richtigen Wert in der Vorschau zu verändern.&lt;br /&gt;                    $output .= &#039;&amp;lt;script type = &amp;quot;text/javascript&amp;quot;&amp;gt;var ziel; var attribut;&amp;lt;/script&amp;gt;&#039;;&lt;br /&gt;&lt;br /&gt;                    //Formularzeilen und die Buttons zum Editieren&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;form action=\&amp;quot;&amp;quot;.$this-&amp;gt;file.&amp;quot;\&amp;quot; method=\&amp;quot;post\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;input type = \&amp;quot;hidden\&amp;quot; name=\&amp;quot;do\&amp;quot; value=\&amp;quot;send\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;                    $output .=&amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;                    foreach($params as $unit) {&lt;br /&gt;                        $output .= &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;.$$unit.&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;;&lt;br /&gt;                        $output .= &amp;quot;&amp;lt;input type = \&amp;quot;hidden\&amp;quot; name=\&amp;quot;&amp;quot;.$unit.&amp;quot;_line\&amp;quot; value=&amp;quot;.$css_config[$unit.&amp;quot;_line&amp;quot;].&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;                        if($unit == &amp;quot;CSS_H2&amp;quot; || $unit == &amp;quot;CSS_LINK&amp;quot;) {&lt;br /&gt;                            $output .= &amp;quot;&amp;lt;input type = \&amp;quot;text\&amp;quot;&lt;br /&gt;                             onkeyup=\&amp;quot;document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;&#039;).style.color=this.value;\&amp;quot;&lt;br /&gt;                            class=\&amp;quot;value-box\&amp;quot; &lt;br /&gt;                            name=\&amp;quot;&amp;quot;.$unit.&amp;quot;_value\&amp;quot; &lt;br /&gt;                             id=\&amp;quot;&amp;quot;.$unit.&amp;quot;_value\&amp;quot; &lt;br /&gt;                             value=&amp;quot;.$css_config[$unit.&amp;quot;_value&amp;quot;].&amp;quot;&amp;gt;&lt;br /&gt;                            &amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;Edit\&amp;quot; onclick=\&amp;quot;rgb=hex2val(document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;_value&#039;).value); ziel=&#039;&amp;quot;.$unit.&amp;quot;&#039;; attribut=&#039;color&#039;; picker.setValue(rgb, false);\&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;                        } else {&lt;br /&gt;                            $output .= &amp;quot;&amp;lt;input type = \&amp;quot;text\&amp;quot;&lt;br /&gt;                             onkeyup=\&amp;quot;document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;&#039;).style.backgroundColor=this.value;\&amp;quot;&lt;br /&gt;                            class=\&amp;quot;value-box\&amp;quot; &lt;br /&gt;                             name=\&amp;quot;&amp;quot;.$unit.&amp;quot;_value\&amp;quot; &lt;br /&gt;                             id=\&amp;quot;&amp;quot;.$unit.&amp;quot;_value\&amp;quot; &lt;br /&gt;                             value=&amp;quot;.$css_config[$unit.&amp;quot;_value&amp;quot;].&amp;quot;&amp;gt;&lt;br /&gt;                            &amp;lt;input type=\&amp;quot;button\&amp;quot; value=\&amp;quot;Edit\&amp;quot; onclick=\&amp;quot;rgb=hex2val(document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;_value&#039;).value); ziel=&#039;&amp;quot;.$unit.&amp;quot;&#039;; attribut=&#039;backgroundColor&#039;; picker.setValue(rgb, false)\&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;quot;;&lt;br /&gt;                        &lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;/table&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;input type = \&amp;quot;submit\&amp;quot; value=\&amp;quot;Änderungen in Datei schreiben\&amp;quot;&amp;gt; &amp;quot;;&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;input type = \&amp;quot;reset\&amp;quot; value=\&amp;quot;Änderungen zurücksetzen\&amp;quot; onclick=\&amp;quot;location.reload()\&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;                    $output .= &amp;quot;&amp;lt;/form&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;;&lt;br /&gt;&lt;br /&gt;                    //Darstellung des Farbwählers                &lt;br /&gt;                    $output .= $this-&amp;gt;colorChooser();&lt;br /&gt;                    //Darstellung der Live-Vorschau&lt;br /&gt;                    $output .= $this-&amp;gt;renderVorschau($params, $css_config);&lt;br /&gt;                    //Rückgabe des Outputs.&lt;br /&gt;                    return $output;&lt;br /&gt;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Generiert und konfiguriert den Farbwähler, beinhaltet JavaScript Hilfsfunktionen.&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @return    String    Output Farbwähler&lt;br /&gt;                 */&lt;br /&gt;                function colorChooser() {&lt;br /&gt;                    $output;&lt;br /&gt;                    &lt;br /&gt;                    //Grundlegende Div-Boxen für den Inhalt, Einbindung der YUI Scripts und CSS-Files&lt;br /&gt;                    $output .= &#039;&lt;br /&gt;                        &amp;lt;div id=&amp;quot;colorChooser&amp;quot; class=&amp;quot;yui-skinsam&amp;quot;&amp;gt;&lt;br /&gt;                        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://yui.yahooapis.com/2.6.0/build/utilities/utilities.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;                        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://yui.yahooapis.com/2.6.0/build/slider/slider-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;                        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/fileadmin/templates/colorpicker.css&amp;quot;&amp;gt; &lt;br /&gt;                        &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://yui.yahooapis.com/2.6.0/build/colorpicker/colorpicker-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;                        &amp;lt;div id=&amp;quot;CC_container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;                    //JavaScripts für die Ausführung. Zuerst Initialisierung des Farbwählers, danach Funktion die aus einem gegebenen&lt;br /&gt;                    //Hex-Wert ein entsprechendes RGB-Array errechnet. Danach eine Funktion, die die Live-Vorschau aktualisiert und zum&lt;br /&gt;                    //Schluß ein Event-Listener der bei einer Farbveränderung im Farbwähler direkt eine Veränderung in der Vorschau bewirkt.&lt;br /&gt;                    $output .=&#039;&lt;br /&gt;                        &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;                        var picker = new YAHOO.widget.ColorPicker(&amp;quot;CC_container&amp;quot;, {&lt;br /&gt;                            showhsvcontrols: true,&lt;br /&gt;                            showhexcontrols: true,&lt;br /&gt;                            images: {&lt;br /&gt;                                PICKER_THUMB: &amp;quot;picker_thumb.png&amp;quot;,&lt;br /&gt;                                HUE_THUMB: &amp;quot;hue_thumb.png&amp;quot;&lt;br /&gt;                            }&lt;br /&gt;                        });&lt;br /&gt;&lt;br /&gt;                        function hex2val(hex) {&lt;br /&gt;                            MyArray = new Array(parseInt(hex.substring(1,3),16), parseInt(hex.substring(3,5),16), parseInt(hex.substring(5,7),16));&lt;br /&gt;                            return MyArray;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        function updateAll(ziel, attribut, value, change) {&lt;br /&gt;                            document.getElementById(ziel+\&#039;_value\&#039;).value=v;&lt;br /&gt;                            if(attribut == &amp;quot;color&amp;quot;) {&lt;br /&gt;                                document.getElementById(ziel).style.color=v;&lt;br /&gt;                            } else {&lt;br /&gt;                                document.getElementById(ziel).style.backgroundColor=v;&lt;br /&gt;                            }&lt;br /&gt;                            if(change == 1) {&lt;br /&gt;                                document.getElementById(ziel+\&#039;_value\&#039;).style.color=\&#039;red\&#039;;&lt;br /&gt;                            } else {}&lt;br /&gt;&lt;br /&gt;                        }&lt;br /&gt;&lt;br /&gt;                        var onRgbChange = function(o) {&lt;br /&gt;                            hexreihe = \&#039;0123456789abcdef\&#039;;&lt;br /&gt;                            hex = &amp;quot;#&amp;quot;;&lt;br /&gt;                            for(i=0;i&amp;lt;3;i++) {&lt;br /&gt;                                rgb = o.newValue[i];&lt;br /&gt;                                ganz = Math.floor(rgb/16);&lt;br /&gt;                                hex_single = hexreihe.charAt(ganz) + hexreihe.charAt(rgb-ganz*16);&lt;br /&gt;                                hex = hex + hex_single;&lt;br /&gt;                            }&lt;br /&gt;                            if(attribut == &amp;quot;color&amp;quot;) {&lt;br /&gt;                                document.getElementById(ziel).style.color=hex;&lt;br /&gt;                            } else {&lt;br /&gt;                                document.getElementById(ziel).style.backgroundColor=hex;&lt;br /&gt;                            }    &lt;br /&gt;                            &lt;br /&gt;                        }&lt;br /&gt;                        picker.on(&amp;quot;rgbChange&amp;quot;, onRgbChange);&lt;br /&gt;                        &amp;lt;/script&amp;gt;&#039;;&lt;br /&gt;                        &lt;br /&gt;                        //Zwei Buttons zum Übernehmen der Farbe bzw. zum Reset&lt;br /&gt;                        $output .= &#039;&amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;closeCC&amp;quot; value=&amp;quot;Übernehmen&amp;quot; onclick=&amp;quot;v = \&#039;#\&#039;+picker.get(\&#039;hex\&#039;); updateAll(ziel, attribut, v, 1);&amp;quot;&amp;gt;&lt;br /&gt;                        &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;resetCC&amp;quot; value=&amp;quot;Reset&amp;quot; onclick=&amp;quot;v = document.getElementById(ziel+\&#039;_value\&#039;).value; updateAll(ziel, attribut, v, 0); rgb=hex2val(v); picker.setValue(rgb, false);&amp;quot;&amp;gt;&lt;br /&gt;&#039;;&lt;br /&gt;                        $output .= &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;                    return $output;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Generiert eine Live-Vorschau der Webseite mit dem Grundlayout der Uni&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @param    Array    Die Parameter die in der CSS-Datei verändert werden sollen.&lt;br /&gt;                 &lt;strong&gt; @param    Array    Array mit den verschiedenen Farbwerten&lt;br /&gt;                 &lt;/strong&gt; @return    String    Output der Live-Vorschau&lt;br /&gt;                 */&lt;br /&gt;                function renderVorschau($params, $css_config) {&lt;br /&gt;                    $output = &amp;quot;&amp;quot;;&lt;br /&gt;                    &lt;br /&gt;                    //Zeichnung einer Webseite im Uni-Layout mit den CSS-Tags. Grundfarben im eingebundenen CSS-File&lt;br /&gt;                    $output .= &#039;&amp;lt;div id=&amp;quot;CSS_BODY&amp;quot;&amp;gt;&lt;br /&gt;                        &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/fileadmin/templates/vorschau.css&amp;quot;&amp;gt; &lt;br /&gt;                    &amp;lt;div id=&amp;quot;logo&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://cms.uni-konstanz.de/fileadmin/templates/uni/logo.jpg&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;identityimage&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://cms.uni-konstanz.de/uploads/pics/home.png&amp;quot; width=&amp;quot;220&amp;quot; height=&amp;quot;134&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;heading&amp;quot;&amp;gt;&amp;lt;p&amp;gt;Demoseite&amp;lt;br&amp;gt;CSS Vorschau&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;CSS_NAVTOP&amp;quot;&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;Home&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;Sitemap&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;Impressum&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;CSS_NAVMAIN&amp;quot;&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a style=&amp;quot;background:white;&amp;quot; class=&amp;quot;active&amp;quot;&amp;gt;Menüpunkt 1&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;Menüpunkt 2&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;CSS_LEFTNAV&amp;quot;&amp;gt;&amp;lt;ul class=&amp;quot;leftnav&amp;quot;&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Unterseite&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;2. Unterseite&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                    &amp;lt;div id=&amp;quot;CSS_CONTENT&amp;quot;&amp;gt;&amp;lt;h1 id=&amp;quot;CSS_H1&amp;quot;&amp;gt;Überschrift 1. Ordnung&amp;lt;/h1&amp;gt;&lt;br /&gt;                    &amp;lt;p&amp;gt;Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext. Diest ist ein Blindtext. Dies ist ein Blindtext. Dies ist ein Blindtext.&amp;lt;/p&amp;gt;&lt;br /&gt;                    &amp;lt;h2 id=&amp;quot;CSS_H2&amp;quot;&amp;gt;Überschrift 2. Ordnung&amp;lt;/h2&amp;gt;&lt;br /&gt;                    &amp;lt;p&amp;gt;Blindtext mit &amp;lt;a id=&amp;quot;CSS_LINK&amp;quot; href=&amp;quot;#&amp;quot;&amp;gt;einem Link&amp;lt;/a&amp;gt;!!!!!&amp;lt;/p&amp;gt;&lt;br /&gt;                    &amp;lt;/div&amp;gt;&lt;br /&gt;                        &amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;                    &lt;br /&gt;                    //Generierung von JavaScript Code, der der Vorschau die initial eingelesenen Farbwerte aus dem übergebenen Array zuweist.&lt;br /&gt;                    $output .= &#039;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&#039;;&lt;br /&gt;                    foreach($params as $unit) {&lt;br /&gt;                        if($unit == &amp;quot;CSS_H2&amp;quot; || $unit == &amp;quot;CSS_LINK&amp;quot;) {&lt;br /&gt;                            $output .= &amp;quot;document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;&#039;).style.color=&#039;&amp;quot;.$css_config[$unit.&amp;quot;_value&amp;quot;].&amp;quot;&#039;;&amp;quot;;&lt;br /&gt;                        } else {&lt;br /&gt;                            $output .= &amp;quot;document.getElementById(&#039;&amp;quot;.$unit.&amp;quot;&#039;).style.backgroundColor=&#039;&amp;quot;.$css_config[$unit.&amp;quot;_value&amp;quot;].&amp;quot;&#039;;&amp;quot;;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    $output .= &#039;&amp;lt;/script&amp;gt;&#039;;&lt;br /&gt;&lt;br /&gt;                    //Rückgabe der Vorschau&lt;br /&gt;                    return $output;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Öffnet die CSS-Datei, liest sie in ein Array und überschreibt die bisherigen Werte mit den neuen Angaben.&lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @param    String  Name der Gruppe des Benutzers&lt;br /&gt;                 &lt;strong&gt; @param    Array    Die Parameter die in der CSS-Datei verändert werden sollen.&lt;br /&gt;                 &lt;/strong&gt; @return    String    Output der Webseite&lt;br /&gt;                 */&lt;br /&gt;                function updateCSS($group, $params) {&lt;br /&gt;                    //Bisherige Datei öffnen&lt;br /&gt;                    $file = file(&amp;quot;../../../../fileadmin/templates/&amp;quot;.$group.&amp;quot;.css&amp;quot;);&lt;br /&gt;                    &lt;br /&gt;                    //Array der Parameter durchlaufen&lt;br /&gt;                    foreach($params as $unit){&lt;br /&gt;                        if($unit == &amp;quot;CSS_H2&amp;quot; || $unit == &amp;quot;CSS_LINK&amp;quot;) {&lt;br /&gt;                            //Zeile+3 muss ebenfalls geändert werden, damit die Linkfarbe auch bei a:visited gilt&lt;br /&gt;                            if($unit == &amp;quot;CSS_LINK&amp;quot;) {&lt;br /&gt;                                $file[t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;)] = &amp;quot;color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                                $file[(int) t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;) + 3] = &amp;quot;color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                            } else {&lt;br /&gt;                                $file[t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;)] = &amp;quot;color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                            }&lt;br /&gt;                        } else {&lt;br /&gt;                            $file[t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;)] = &amp;quot;background-color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                            //Bei der Linksnavigation muss die Änderung der Farben auch auf die Untermenüs übertragen werden. Deshalb Zeile+3 +6 und +9 ebenfalls mit dem Farbwert beschreiben.&lt;br /&gt;                            if($unit == &amp;quot;CSS_LEFTNAV&amp;quot;) {&lt;br /&gt;                                $file[(int) t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;) + 3] = &amp;quot;background-color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                                $file[(int) t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;) + 6] = &amp;quot;background-color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                                $file[(int) t3lib_div::_POST($unit.&amp;quot;_line&amp;quot;) + 9] = &amp;quot;background-color:&amp;quot;.t3lib_div::_POST($unit.&amp;quot;_value&amp;quot;).&amp;quot;;\n&amp;quot;;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    $newcss;        &lt;br /&gt;                    //Umwandlung Array in ein String&lt;br /&gt;                    foreach($file as $unit) {&lt;br /&gt;                        $newcss .= $unit;&lt;br /&gt;                    }&lt;br /&gt;                    //String in Datei schreiben &lt;br /&gt;                    t3lib_div::writeFile(&amp;quot;../../../../fileadmin/templates/&amp;quot;.$group.&amp;quot;.css&amp;quot;, $newcss);&lt;br /&gt;                    //Ins Logfile schreiben&lt;br /&gt;                    $this-&amp;gt;log(&amp;quot;[&amp;quot;.date(&amp;quot;Y-m-d - H:i:s&amp;quot;).&amp;quot; - IP: &amp;quot;.$_SERVER[&#039;REMOTE_ADDR&#039;].&amp;quot;]@@@Geändertes CSS geschrieben: ___&lt;/u&gt;&amp;quot;.$group.&amp;quot;&lt;u&gt;__&lt;/u&gt;&amp;quot;);&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                /**&lt;br /&gt;                 &lt;strong&gt; Methode um in ein Logfile zu schreiben. &lt;br /&gt;                 *&lt;br /&gt;                 &lt;/strong&gt; @params    string    In das Logfile zu schreibender String&lt;br /&gt;                 */&lt;br /&gt;                function log($message) {&lt;br /&gt;                    $logfile = fopen(&amp;quot;/var/log/typo3/rz_css_editor.log&amp;quot;, &amp;quot;a&amp;quot;);    &lt;br /&gt;                    fwrite($logfile, $message.&amp;quot;\n&amp;quot;);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if (defined(&#039;TYPO3_MODE&#039;) &amp;amp;&amp;amp; $TYPO3_CONF_VARS[TYPO3_MODE][&#039;XCLASS&#039;][&#039;ext/rz_csseditor/mod1/index.php&#039;])    {&lt;br /&gt;    include_once($TYPO3_CONF_VARS[TYPO3_MODE][&#039;XCLASS&#039;][&#039;ext/rz_csseditor/mod1/index.php&#039;]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Make instance:&lt;br /&gt;$SOBE = t3lib_div::makeInstance(&#039;tx_rzcsseditor_module1&#039;);&lt;br /&gt;$SOBE-&amp;gt;init();&lt;br /&gt;&lt;br /&gt;// Include files?&lt;br /&gt;foreach($SOBE-&amp;gt;include_once as $INC_FILE)    include_once($INC_FILE);&lt;br /&gt;&lt;br /&gt;$SOBE-&amp;gt;main();&lt;br /&gt;$SOBE-&amp;gt;printContent();&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;vorlage.css mit Markern&lt;br /&gt;&lt;pre&gt;&lt;strong&gt; Allgemein &lt;/strong&gt;/&lt;br /&gt;&lt;br /&gt;/***CSS_BODY***/&lt;br /&gt;body {&lt;br /&gt;	background-color: #FFFFFF;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/***CSS_H1***/&lt;br /&gt;h1 {&lt;br /&gt;	background-color:#DEE9EF;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/***CSS_H2***/&lt;br /&gt;h2 {&lt;br /&gt;	color:#005577;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/***CSS_LINK***/&lt;br /&gt;a:link {&lt;br /&gt;	color:#005577;&lt;br /&gt;}&lt;br /&gt;a:visited {&lt;br /&gt;	color:#005577; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/&lt;strong&gt; Statische Navigationsleiste oben &lt;/strong&gt;/&lt;br /&gt;&lt;br /&gt;/***CSS_NAVTOP***/&lt;br /&gt;#navtop {&lt;br /&gt;	background-color: #85a9ba;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/&lt;strong&gt; Hauptnavigationsleiste oben &lt;/strong&gt;/&lt;br /&gt;&lt;br /&gt;/***CSS_NAVMAIN***/&lt;br /&gt;#navmain {&lt;br /&gt;	background-color:#DDDDDD;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/&lt;strong&gt; Navigationleiste links &lt;/strong&gt;/&lt;br /&gt;&lt;br /&gt;/***CSS_LEFTNAV***/&lt;br /&gt;#leftnav {&lt;br /&gt;	background-color: #dee9ef;&lt;br /&gt;}&lt;br /&gt;ul.leftnav {&lt;br /&gt;	background-color: #dee9ef;&lt;br /&gt;}&lt;br /&gt;ul.leftnav2 {&lt;br /&gt;	background-color: #dee9ef;&lt;br /&gt;}&lt;br /&gt;#leftnav li.notselected a{&lt;br /&gt;	background-color:#dee9ef;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/&lt;strong&gt; Inhalt der Seite &lt;/strong&gt;/&lt;br /&gt;&lt;br /&gt;/***CSS_CONTENT***/&lt;br /&gt;#content {&lt;br /&gt;	background-color: #FFFFFF;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Tue, 04 Nov 2008 09:37:58 +0100</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/46-guid.html</guid>
    
</item>
<item>
    <title>Imagelightbox und andere JavaScripts</title>
    <link>http://www.matthiashaeger.de/archives/34-Imagelightbox-und-andere-JavaScripts.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/34-Imagelightbox-und-andere-JavaScripts.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=34</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=34</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Imagelightbox ist ein schöner &lt;a href=&quot;http://de.wikipedia.org/wiki/JavaScript&quot;&gt;JavaScript&lt;/a&gt; Effekt um ein Bild nicht einfach nur zu vergrößern, sondern formvollendet in einer smoothen Animation über die aktuelle Webseite zu legen und aufzuziehen. Ein Beispiel dafür sieht man in unserem CMS auf &lt;a href=&quot;http://cms.uni-konstanz.de/physik/scheer/research/&quot;&gt;folgender Seite&lt;/a&gt;. Für Typo3 gibt es dazu eine schöne Extension. Am Freitag sprach mit ein Kunde an, dass die Lightbox auf einmal nicht mehr funktioniert und nur noch einen leeren weißen Rahmen anzeigte. Dem war auch so.&lt;br /&gt;&lt;br /&gt;Fehleranalyse, Herumsuchen, Googlen - was war die Lösung? In der Zwischenzeit hatte ich &lt;a href=&quot;http://www.mootools.net/&quot;&gt;T3Mootools&lt;/a&gt; ebenfalls als Extension installiert um noch weitere Effekte anbieten zu können. Die von den Extensions verwendeten verschiedenen JS-Frameworks kamen sich untereinander ins Gehege.&lt;br /&gt;&lt;br /&gt;Hilfe fand ich dafür im &lt;a href=&quot;http://mediavrog.net/blog/2008/05/23/typo3/extensions/kj_imagelightbox-2-fur-mootools-slimbox/&quot;&gt;mediaVROG Blog&lt;/a&gt;, der Autor stand vor einem ähnlichen Problem..&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;quot;Ich habe mich vor einiger Zeit mal mit dem Typo3 Plugin kj_imagelightbox 2 befasst und es in einem Projekt eingesetzt. Da ich aber anstatt der Kombination aus Prototype/Scriptaculous/Lightbox lieber eine mootools/slimbox einsetzen wollte, habe ich das Plugin entsprechend umgeschrieben, so dass es möglich wird, mootools zu verwenden.&amp;quot;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;..und hat dankenswerter Weise die Modifikationen bereits vorgenommen und stellt seine geänderte Extension auch zum Download zur Verfügung. Vielen Dank, damit funktioniert wieder alles.  
    </content:encoded>

    <pubDate>Mon, 13 Oct 2008 10:20:59 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/34-guid.html</guid>
    
</item>
<item>
    <title>Diverse URLs - und Typo3 reagiert so kritisch</title>
    <link>http://www.matthiashaeger.de/archives/25-Diverse-URLs-und-Typo3-reagiert-so-kritisch.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/25-Diverse-URLs-und-Typo3-reagiert-so-kritisch.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=25</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=25</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    Ich hasse die nervigen URL-Effekte von Typo3. Wenn man wie bei uns mit mehreren Domains auf einen Typo3-Server verweist, dann reagiert Typo3 sehr kritisch auf die verwendete. Logge ich mich z.B. über die allgemeine URL in das Backend ein, dann kann ich keine Preview von verborgenen Seiten ansehen, die im Frontend über eine andere Domain angesprochen werden. Das ist schrecklicher Zeitverlust, wenn man erst ewig sucht und flucht, warum Änderungen nicht angenommen werden, es auf das Caching schiebt und dann war es eine simple URL-Sache.&lt;br /&gt;&lt;br /&gt;Für mich hier an der Uni heißt das, dass ich mich bei jedem Kunden über seine Subdomain ins Backend einloggen muss, wenn ich z.B. die Preview nehmen muss. Über die zentrale Domain geht das nicht. Nervig - oder weiß jemand ne Lösung?&lt;br /&gt;&lt;br /&gt;
  
    </content:encoded>

    <pubDate>Thu, 25 Sep 2008 10:36:36 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/25-guid.html</guid>
    
</item>
<item>
    <title>Typo3 ajaxbasierte Suchengine - neue Extension</title>
    <link>http://www.matthiashaeger.de/archives/18-Typo3-ajaxbasierte-Suchengine-neue-Extension.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/18-Typo3-ajaxbasierte-Suchengine-neue-Extension.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=18</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=18</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
Gestern habe ich für &lt;a href=&quot;http://www.rz.uni-konstanz.de/&quot;&gt;meinen Arbeitgeber&lt;/a&gt; eine größere Extension fertiggestellt. Die Ausgangslage war bisher so bei uns, dass es für Typo3 selber die &lt;a href=&quot;http://blog.undkonsorten.com/typo3-indexed-search-suche-deutsch-manual-doku&quot;&gt;IndexedSearch&lt;/a&gt; und für das Newsmodul tt_news die dort eingebaute Suchfunktion gab. Zusätzlich kommt in unserem Szenario noch hinzu, dass wir die &lt;a href=&quot;http://www.rz.uni-konstanz.de/activekb/&quot;&gt;Knowledge Base&lt;/a&gt; von &lt;a href=&quot;http://www.interspire.com/&quot;&gt;Interspire&lt;/a&gt; einsetzen. Diese bringt natürlich auch eine Suchfunktion mit, so dass wir den Benutzer mit drei verschiedene Suchmasken quälten. Ziel war nun, diese unter einen Hut zu bringen.&lt;br /&gt;&lt;br /&gt;Es besteht zwar auch die Möglichkeit mit der IndexedSearch auch die Newsmeldungen zu durchsuchen, aber ich wollte die Ergebnisse gerne nach den unterschiedlichen Kategorien sortiert haben. Die Extension habe ich mit dem Kickstarter erstellt. Zuerst habe ich den grafischen Rahmen der Seite gebaut. Die Seite enthält ein Suchfeld, einen kurzen Hinweis und danach den Ergebnisbereich, der zunächst versteckt wird. Oben sind drei grafische Kategorienreiter, die als Buttons fungieren mit denen der Benutzer hin- und herschalten kann, darunter wird das jewelige Suchergebnis angezeigt.&lt;br /&gt;&lt;br /&gt;&lt;!-- s9ymdb:11 --&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://www.rz.uni-konstanz.de/rechenzentrum/suche&quot;&gt;&lt;img height=&quot;323&quot; width=&quot;600&quot; class=&quot;serendipity_image_center&quot; style=&quot;border: 0px none ; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://www.matthiashaeger.de/uploads/rz_ajaxsearch.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Die Suche selber ist mit &lt;a href=&quot;http://xajaxproject.org/&quot;&gt;Xajax&lt;/a&gt; - einem Ajax Framework - realisiert. Es werden nacheinander eine versteckte Seite der IndexedSearch, die tt_news-Suchseite und die Suchseite der Knowledge Base aufgerufen. Die Resultate sind komplette HTML-Seiten über die ein kurzer selbstgeschriebener Parser läuft, der die relevanten Bereiche extrahiert und in die vorbereitet &amp;lt;div&amp;gt;-Box schreibt. Neben den Ergebnissen wird auch noch die Anzahl der Treffer gefiltert und in den Kategoriereitern angezeigt.&lt;br /&gt;&lt;br /&gt;Über die Kategoriereiter kann der Benutzer jetzt zwischen den Ergebnislisten hin- und herschalten. Als Pferdefuß stellte sich dabei die Anzeige der Trefferanzahl heraus, die jetzt bei jedem Wechsel der Kategorie eingelesen, zwischengespeichert und wieder ausgegeben werden muss.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Live in Action ist diese Suchengine auf &lt;a href=&quot;http://www.rz.uni-konstanz.de/rechenzentrum/suche/&quot;&gt;unseren Seiten&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Bisher ist noch sehr viel der Extension hart codiert im Quellcode, die Extension ist noch nicht so modular und erweiterbar aufgebaut, wie sie evtl. sein könnte. Deshalb habe ich sie auch nicht ins &lt;a href=&quot;http://typo3.org/extensions/&quot;&gt;TER&lt;/a&gt; hochgeladen. Durch das Einfügen weiterer Parser lässt sich die Suchengine natürlich auf weitere Suchmaschinen erweitern.&lt;br /&gt;&lt;br /&gt;In der erweiterten Fassung dieses Eintrages habe ich den kompletten Quellcode angehängt..... &lt;br /&gt;
&amp;lt;?php&lt;br /&gt;/***************************************************************&lt;br /&gt;*  Copyright notice&lt;br /&gt;*&lt;br /&gt;*  (c) 2008 Matthias Häger &amp;lt;matthias.haeger@uni-konstanz.de&amp;gt;&lt;br /&gt;*  All rights reserved&lt;br /&gt;*&lt;br /&gt;*  This script is part of the TYPO3 project. The TYPO3 project is&lt;br /&gt;*  free software; you can redistribute it and/or modify&lt;br /&gt;*  it under the terms of the GNU General Public License as published by&lt;br /&gt;*  the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;*  (at your option) any later version.&lt;br /&gt;*&lt;br /&gt;*  The GNU General Public License can be found at&lt;br /&gt;*  http://www.gnu.org/copyleft/gpl.html.&lt;br /&gt;*&lt;br /&gt;*  This script is distributed in the hope that it will be useful,&lt;br /&gt;*  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;*  GNU General Public License for more details.&lt;br /&gt;*&lt;br /&gt;*  This copyright notice MUST APPEAR in all copies of the script!&lt;br /&gt;***************************************************************/&lt;br /&gt;&lt;br /&gt;require_once(PATH_tslib . &#039;class.tslib_pibase.php&#039;);&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; &lt;strong&gt; Plugin &#039;RZ Ajax Search&#039; for the &#039;rzajaxsearch&#039; extension.&lt;br /&gt; *&lt;br /&gt; &lt;/strong&gt; @author    Matthias Häger &amp;lt;matthias.haeger@uni-konstanz.de&amp;gt;&lt;br /&gt; &lt;strong&gt; @package    TYPO3&lt;br /&gt; &lt;/strong&gt; @subpackage    tx_rzajaxsearch&lt;br /&gt; */&lt;br /&gt;class tx_rzajaxsearch_pi1 extends tslib_pibase {&lt;br /&gt;    var $prefixId      = &#039;tx_rzajaxsearch_pi1&#039;;        // Same as class name&lt;br /&gt;    var $scriptRelPath = &#039;pi1/class.tx_rzajaxsearch_pi1.php&#039;;    // Path to this script relative to the extension dir.&lt;br /&gt;    var $extKey        = &#039;rzajaxsearch&#039;;    // The extension key.&lt;br /&gt;    var $conf;&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     &lt;strong&gt; The main method of the PlugIn. Zuerst werden grundlegende Variablen definiert, die für den weiteren Programmverlauf wichtig sind.&lt;br /&gt;     &lt;/strong&gt; Anschließend wird Xajax instanziiert und die Rückgabe-Methoden werden registriert. Danach wird das Formular generiert, in das der&lt;br /&gt;     &lt;strong&gt; Suchbegriff eingegeben werden kann. Zum Schluß wird die Ergebnis-Box gerendert, aber vorerst nicht angezeigt.&lt;br /&gt;     &lt;/strong&gt;&lt;br /&gt;     &lt;strong&gt; @param    string        $content: The PlugIn content&lt;br /&gt;     &lt;/strong&gt; @param    array        $conf: The PlugIn configuration&lt;br /&gt;     &lt;strong&gt; @return    The content that is displayed on the website&lt;br /&gt;     &lt;/strong&gt;/&lt;br /&gt;    function main($content,$conf)    {&lt;br /&gt;        $this-&amp;gt;conf=$conf;&lt;br /&gt;        $this-&amp;gt;pi_loadLL();&lt;br /&gt;        $this-&amp;gt;pi_initPIflexForm();&lt;br /&gt;        $this-&amp;gt;pi_USER_INT_obj = 1;&lt;br /&gt;        $GLOBALS[&amp;quot;TSFE&amp;quot;]-&amp;gt;no_cache=1;&lt;br /&gt;    &lt;br /&gt;        /**&lt;br /&gt;         &lt;strong&gt; Definition zentral verfügbarer Variablen für aktive und inaktive Rubrikreiter. Vorab Definition des JS-Ausdruck um den Wert&lt;br /&gt;         &lt;/strong&gt; der Menge der gefundenen Treffer aus der HTML-Seite zu lesen.&lt;br /&gt;         &lt;strong&gt;/&lt;br /&gt;        $this-&amp;gt;readHeader1 = &amp;quot;document.getElementById(&#039;header1&#039;).firstChild.nodeValue&amp;quot;;&lt;br /&gt;        $this-&amp;gt;readHeader2 = &amp;quot;document.getElementById(&#039;header2&#039;).firstChild.nodeValue&amp;quot;;&lt;br /&gt;        $this-&amp;gt;readHeader3 = &amp;quot;document.getElementById(&#039;header3&#039;).firstChild.nodeValue&amp;quot;;&lt;br /&gt;        $this-&amp;gt;active1 = &#039;&amp;lt;a class=&amp;quot;rActive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(1, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Webseite &amp;lt;span id=&amp;quot;header1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        $this-&amp;gt;active2 = &#039;&amp;lt;a class=&amp;quot;rActive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(2, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Knowledge Base &amp;lt;span id=&amp;quot;header2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        $this-&amp;gt;active3 = &#039;&amp;lt;a class=&amp;quot;rActive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(3, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Newsmeldungen &amp;lt;span id=&amp;quot;header3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        $this-&amp;gt;inactive1 = &#039;&amp;lt;a class=&amp;quot;rInactive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(1, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Webseite &amp;lt;span id=&amp;quot;header1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        $this-&amp;gt;inactive2 = &#039;&amp;lt;a class=&amp;quot;rInactive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(2, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Knowledge Base &amp;lt;span id=&amp;quot;header2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        $this-&amp;gt;inactive3 = &#039;&amp;lt;a class=&amp;quot;rInactive&amp;quot; href=&amp;quot;#&amp;quot; onclick=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;showBox(3, &#039;.$this-&amp;gt;readHeader1.&#039;, &#039;.$this-&amp;gt;readHeader2.&#039;, &#039;.$this-&amp;gt;readHeader3.&#039;); return false&amp;quot;&amp;gt;Newsmeldungen &amp;lt;span id=&amp;quot;header3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;        &lt;br /&gt;        //Xajax-Objekt instanziieren und Methoden registrieren&lt;br /&gt;        require_once(t3lib_extMgm::extPath(&#039;xajax&#039;) . &#039;class.tx_xajax.php&#039;);&lt;br /&gt;        $this-&amp;gt;xajax = t3lib_div::makeInstance(&#039;tx_xajax&#039;);&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;decodeUTF8InputOn();&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;setCharEncoding(&#039;utf-8&#039;);&lt;br /&gt;        #$this-&amp;gt;xajax-&amp;gt;debugOn();&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;setWrapperPrefix($this-&amp;gt;prefixId);&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;registerFunction(array(&#039;getEngine&#039;, &amp;amp;$this, &#039;getEngine&#039;));&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;registerFunction(array(&#039;showBox&#039;, &amp;amp;$this, &#039;showBox&#039;));&lt;br /&gt;        $this-&amp;gt;xajax-&amp;gt;processRequests();&lt;br /&gt;        $GLOBALS[&#039;TSFE&#039;]-&amp;gt;additionalHeaderData[$this-&amp;gt;prefixId] = $this-&amp;gt;xajax-&amp;gt;getJavascript(t3lib_extMgm::siteRelPath(&#039;xajax&#039;));&lt;br /&gt;&lt;br /&gt;        //Formular für die Eingabe des Suchbegriffes&lt;br /&gt;        $content =&amp;quot;&amp;quot;;&lt;br /&gt;        //Übernahme der Suchbegriffe, wenn jemand die Suchbox auf der Startseite benutzt. Wenn dort ein Begriff eingegeben wurde, dann wird&lt;br /&gt;        //direkt die Ergebnisseite aufgerufen    &lt;br /&gt;        $post_phrase = t3lib_div::_POST();&lt;br /&gt;        $post_phrase = $post_phrase[tx_indexedsearch];&lt;br /&gt;        $post_phrase = $post_phrase[sword];&lt;br /&gt;        $content=&#039;&lt;br /&gt;            &amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;&amp;quot; onSubmit=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;getEngine(document.getElementById(\&#039;phrase\&#039;).value); return false;&amp;quot;&amp;gt;&lt;br /&gt;                &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;phrase&amp;quot; name=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;[input_field]&amp;quot; size=&amp;quot;50&amp;quot; value=&amp;quot;&#039;.htmlspecialchars($this-&amp;gt;piVars[&#039;input_field&#039;]).&#039;&amp;quot; /&amp;gt;&lt;br /&gt;                &amp;lt;input type=&amp;quot;submit&amp;quot; name=&amp;quot;&#039;.$this-&amp;gt;prefixId.&#039;[submit_button]&amp;quot; value=&amp;quot;&#039;.htmlspecialchars($this-&amp;gt;pi_getLL(&#039;submit_button_label&#039;)).&#039;&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;/form&amp;gt;&#039;;&lt;br /&gt;        if(isset($post_phrase)) {&lt;br /&gt;            $content .= &#039;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt;&#039;.$this-&amp;gt;prefixId.&#039;getEngine(\&#039;&#039;.$post_phrase.&#039;\&#039;);&amp;lt;/script&amp;gt;&#039;;&lt;br /&gt;            $content .= &amp;quot;&amp;lt;div id=\&amp;quot;hilfe\&amp;quot;&amp;gt;Suche läuft.....&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;        } else {&lt;br /&gt;            $content.=&#039;&amp;lt;br /&amp;gt;&amp;lt;div id=&amp;quot;hilfe&amp;quot;&amp;gt;Durchsuchen Sie unsere Webseite, unsere Knowledge Base und die aktuellen Newsmeldungen. Nach Eingabe des Suchbegriffes erhalten Sie die Ergebnisse nach Kategorie geordnet. Klicken Sie auf die jeweilige Kategorie um zu den einzelnen Ergebnislisten zu gelangen.&amp;lt;/div&amp;gt;&lt;br /&gt;            &#039;;&lt;br /&gt;        }&lt;br /&gt;        //Ergebnis-Box rendern, wird vorerst nicht angezeigt.&lt;br /&gt;        $content .= $this-&amp;gt;renderBox();&lt;br /&gt;    &lt;br /&gt;        return $this-&amp;gt;pi_wrapInBaseClass($content);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;/strong&gt; Methode stellt die Ergebnis-Box dar. Die nötigen &amp;lt;div&amp;gt;-Bereiche werden angelegt, der Ergebnis-Bereich ist aber grundsätzlich ausgeblendet.&lt;br /&gt;     &lt;strong&gt;&lt;br /&gt;     &lt;/strong&gt; @return    &amp;lt;div&amp;gt;-Box für die Resultate, die auf der Webseite angezeigt wird&lt;br /&gt;     &lt;strong&gt;/&lt;br /&gt;    function renderBox() {&lt;br /&gt;&lt;br /&gt;        $output = &amp;quot;&amp;quot;;&lt;br /&gt;        $output .= &#039; &amp;lt;div id=\&#039;resultWrapper\&#039;&amp;gt;&lt;br /&gt;                &amp;lt;span class=&amp;quot;description&amp;quot;&amp;gt;Wählen Sie die gewünschte Kategorie der Ergebnisse.&amp;lt;/span&amp;gt;&lt;br /&gt;                &amp;lt;div id=\&#039;resultMenu\&#039;&amp;gt;&lt;br /&gt;                    &amp;lt;ul&amp;gt;&lt;br /&gt;                        &amp;lt;li id=&amp;quot;resultLink1&amp;quot;&amp;gt;&#039;.$this-&amp;gt;inactive1.&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;                        &amp;lt;li id=&amp;quot;resultLink2&amp;quot;&amp;gt;&#039;.$this-&amp;gt;inactive2.&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;                        &amp;lt;li id=&amp;quot;resultLink3&amp;quot;&amp;gt;&#039;.$this-&amp;gt;inactive3.&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;                    &amp;lt;/ul&amp;gt;&lt;br /&gt;                    &amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;div id=\&#039;result1\&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;div id=\&#039;result2\&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;                &amp;lt;div id=\&#039;result3\&#039;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;            &amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;        return $output;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;/strong&gt; Diese Methode dient zur Umschaltung zwischen den unterschiedlichen Ergebnislisten. Je nach angegebenr Engine werden die zugehörigen &amp;lt;div&amp;gt;-Boxen&lt;br /&gt;     &lt;strong&gt; ein- bzw. ausgeblendet. Anschließend werden die Trefferzahlen neu eingefügt.&lt;br /&gt;     &lt;/strong&gt;&lt;br /&gt;     &lt;strong&gt; @param    integer    Nummer der Suchengine, die angezeigt werden soll&lt;br /&gt;     &lt;/strong&gt; @param    string    Anzahl der Treffer von Engine 1, bereits umklammert als String dargestellt&lt;br /&gt;     &lt;strong&gt; @param    string    Anzahl der Treffer von Engine 2, bereits umklammert als String dargestellt&lt;br /&gt;     &lt;/strong&gt; @param    string    Anzahl der Treffer von Engine 3, bereits umklammert als String dargestellt&lt;br /&gt;     &lt;strong&gt; @return    XajaxResponseObject&lt;br /&gt;     &lt;/strong&gt;/&lt;br /&gt;    function showBox($engine, $header1, $header2, $header3) {&lt;br /&gt;        $this-&amp;gt;piVars = $data[$this-&amp;gt;prefixId];&lt;br /&gt;        $objResponse = new tx_xajax_response();&lt;br /&gt;        /**&lt;br /&gt;         &lt;strong&gt; Engine 1: Webseite&lt;br /&gt;         &lt;/strong&gt; Engine 2: Knowledge Base&lt;br /&gt;         &lt;strong&gt; Engine 3: Newsmeldungen&lt;br /&gt;        */&lt;br /&gt;        switch($engine) {&lt;br /&gt;            case 1:&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink1&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;active1);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink2&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive2);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink3&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive3);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result1&amp;quot;, &#039;style.display&#039;, &#039;block&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result2&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result3&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            break;&lt;br /&gt;            case 2:&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink2&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;active2);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink1&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive1);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink3&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive3);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result2&amp;quot;, &#039;style.display&#039;, &#039;block&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result1&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result3&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            break;&lt;br /&gt;            case 3:&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink3&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;active3);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink2&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive2);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;resultLink1&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;inactive1);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result3&amp;quot;, &#039;style.display&#039;, &#039;block&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result2&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            $objResponse-&amp;gt;addAssign(&amp;quot;result1&amp;quot;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        //Trefferanzahlen neu schreiben&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header1&#039;, &#039;innerHTML&#039;, $header1);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header2&#039;, &#039;innerHTML&#039;, $header2);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header3&#039;, &#039;innerHTML&#039;, $header3);&lt;br /&gt;        return $objResponse-&amp;gt;getXML();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;/strong&gt; Diese Funktion ist die Hauptantwortfunktion. In Ihr werden nacheinander die drei Suchmaschinen aufgerufen und geparset und dann&lt;br /&gt;     &lt;strong&gt; damit die jeweiligen Result-Blöcke gefüllt. &lt;br /&gt;     &lt;/strong&gt;&lt;br /&gt;     &lt;strong&gt; @param     String    Suchbegriff&lt;br /&gt;     &lt;/strong&gt; @return    XajaxResponseObject&lt;br /&gt;     &lt;strong&gt;&lt;br /&gt;     &lt;/strong&gt;/ &lt;br /&gt;    function getEngine($phrase) {&lt;br /&gt;        //Suchbegriff wird korrekt formatiert&lt;br /&gt;        $phrase = urlencode($phrase);    &lt;br /&gt;&lt;br /&gt;        //Die drei Suchmaschinen werden nacheinander aufgerufen, der Rückgabewert ist jeweils ein Array, dass an der Stelle 0 die Ergebnisse&lt;br /&gt;        //und an Stelle 1 die Anzahl der Treffer enthält.&lt;br /&gt;        $output1 = $this-&amp;gt;parseSearch($phrase);&lt;br /&gt;        $output2 = $this-&amp;gt;parseKB($phrase);&lt;br /&gt;        $output3 = $this-&amp;gt;parseNews($phrase); &lt;br /&gt;&lt;br /&gt;        //Neues Antwortobjekt wird instanziiert&lt;br /&gt;        $objResponse = new tx_xajax_response();&lt;br /&gt;    &lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;hilfe&#039;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;    &lt;br /&gt;        //Ergebnisse 1 (Webseite) -&amp;gt; aktiv gesetzt&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result1&#039;, &#039;innerHTML&#039;, $output1[0]);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result1&#039;, &#039;style.display&#039;, &#039;block&#039;);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&amp;quot;resultLink1&amp;quot;, &#039;innerHTML&#039;, $this-&amp;gt;active1);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header1&#039;, &#039;innerHTML&#039;, $output1[1]);&lt;br /&gt;        &lt;br /&gt;        //Ergebnisse 2 (Knowledge Base)&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result2&#039;, &#039;innerHTML&#039;, $output2[0]);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result2&#039;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header2&#039;, &#039;innerHTML&#039;, $output2[1]);&lt;br /&gt;&lt;br /&gt;        //Ergebnisse 3 (Newsmeldungen)&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result3&#039;, &#039;innerHTML&#039;, $output3[0]);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;result3&#039;, &#039;style.display&#039;, &#039;none&#039;);&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;header3&#039;, &#039;innerHTML&#039;, $output3[1]);&lt;br /&gt;&lt;br /&gt;        //Der Gesamtblock mit den Ergebnissen wird sichtbar geschaltet und die Antwort wird zurückgegeben.&lt;br /&gt;        $objResponse-&amp;gt;addAssign(&#039;resultWrapper&#039;, &#039;style.display&#039;, &#039;block&#039;);&lt;br /&gt;        return $objResponse-&amp;gt;getXML();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;strong&gt; Diese Funktion parst die Seite mit den Suchergebnissen der Typo3 Indexed Search und gibt Sie in einer Variable zurück. Dazu wird noch&lt;br /&gt;     &lt;/strong&gt; die Anzahl der Treffer extrahiert und mit Klammern umschlossen als String zurückgegeben. Die Ergebnisseite wird in ein Array geladen&lt;br /&gt;     &lt;strong&gt; und dann zeilenweise ausgewertet. Über die Kennzeichnung der &amp;lt;div&amp;gt;-Boxen lässt sich bestimmen, wo der relevante Teil der Ergebnisseite&lt;br /&gt;     &lt;/strong&gt; beginnt und aufhört. Diese Zeilen werden dann in die Rückgabe-Variable geschrieben.&lt;br /&gt;     &lt;strong&gt;&lt;br /&gt;     &lt;/strong&gt; @param    String    Suchbegriff&lt;br /&gt;     &lt;strong&gt; @return    Array    Suchergebnisse und Anzahl der Suchtreffer&lt;br /&gt;    */&lt;br /&gt;    function parseSearch($phrase) {&lt;br /&gt;        $return;&lt;br /&gt;        $max;&lt;br /&gt;        $parse = false;&lt;br /&gt;        $res = file(&amp;quot;http://www.rz.uni-konstanz.de/rechenzentrum/indexsuche/?tx_indexedsearch[sword]=$phrase&amp;quot;);&lt;br /&gt;        for($i=0; $i&amp;lt;count($res); $i++)    {&lt;br /&gt;            if($parse == false &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;tx-indexedsearch-whatis&amp;quot;) != false)) {&lt;br /&gt;                $parse = true;&lt;br /&gt;            }&lt;br /&gt;            if($parse == true &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;tx-indexedsearch-browsebox\&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;) != false)) {&lt;br /&gt;                $return .= utf8_encode($res[$i]);&lt;br /&gt;                $parse = false;&lt;br /&gt;            }&lt;br /&gt;            if($parse==true) {&lt;br /&gt;                $return .=($res[$i]);&lt;br /&gt;            }&lt;br /&gt;            if(strstr(utf8_encode($res[$i]), &amp;quot;insgesamt &amp;lt;strong&amp;gt;&amp;quot;) != false) {&lt;br /&gt;                $max = strtok(substr(strstr(utf8_encode($res[$i]), &amp;quot;insgesamt &amp;lt;strong&amp;gt;&amp;quot;),18),&amp;quot;&amp;lt;&amp;quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return array($return, &amp;quot;(&amp;quot;.$max.&amp;quot;)&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;/strong&gt; Diese Funktion parst die Seite mit den Suchergebnissen der Knowledge Base und gibt Sie in einer Variable zurück. Dazu wird noch&lt;br /&gt;     &lt;strong&gt; die Anzahl der Treffer extrahiert und mit Klammern umschlossen als String zurückgegeben. Die Ergebnisseite wird in ein Array geladen&lt;br /&gt;     &lt;/strong&gt; und dann zeilenweise ausgewertet. Über Kommentare im Quellcode Seite lässt sich bestimmen, wo der relevante Teil der Ergebnisseite&lt;br /&gt;     &lt;strong&gt; beginnt und aufhört. Diese Zeilen werden dann in die Rückgabe-Variable geschrieben.&lt;br /&gt;     &lt;/strong&gt;&lt;br /&gt;     &lt;strong&gt; @param    String    Suchbegriff&lt;br /&gt;     &lt;/strong&gt; @return    Array    Suchergebnisse und Anzahl der Suchtreffer&lt;br /&gt;    */&lt;br /&gt;    function parseKB($phrase) {&lt;br /&gt;        $return;&lt;br /&gt;        $max;&lt;br /&gt;        $parse = false;&lt;br /&gt;        $res = file(&amp;quot;http://www.rz.uni-konstanz.de/activekb/search/$phrase&amp;quot;);&lt;br /&gt;        for($i=0; $i&amp;lt;count($res); $i++)    {&lt;br /&gt;            if($parse == false &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;&amp;lt;!-- Start Search Results --&amp;gt;&amp;quot;) != false)) {&lt;br /&gt;                $parse = true;&lt;br /&gt;            }&lt;br /&gt;            if($parse == true &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;&amp;lt;!-- End Search Results --&amp;gt;&amp;quot;) != false)) {&lt;br /&gt;                $return .= utf8_encode($res[$i]);&lt;br /&gt;                $parse = false;&lt;br /&gt;            }&lt;br /&gt;            if($parse==true) {&lt;br /&gt;                $return .=($res[$i]);&lt;br /&gt;            }&lt;br /&gt;            if(strstr(utf8_encode($res[$i]), &amp;quot;Es wurde&amp;quot;) != false) {&lt;br /&gt;                $max = trim(strtok(substr(strstr(utf8_encode($res[$i]), &amp;quot;Es wurde&amp;quot;),9),&amp;quot;A&amp;quot;));&lt;br /&gt;                if($max == &amp;quot;keine&amp;quot;) $max = 0;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return array($return, &amp;quot;(&amp;quot;.$max.&amp;quot;)&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     &lt;strong&gt; Diese Funktion parst die Seite mit den Suchergebnissen der tt_news-Suche und gibt Sie in einer Variable zurück. Dazu wird noch&lt;br /&gt;     &lt;/strong&gt; die Anzahl der Treffer extrahiert und mit Klammern umschlossen als String zurückgegeben. Die Ergebnisseite wird in ein Array geladen&lt;br /&gt;     &lt;strong&gt; und dann zeilenweise ausgewertet. Über die Kennzeichnung der &amp;lt;div&amp;gt;-Boxen lässt sich bestimmen, wo der relevante Teil der Ergebnisseite&lt;br /&gt;     &lt;/strong&gt; beginnt und aufhört. Diese Zeilen werden dann in die Rückgabe-Variable geschrieben.&lt;br /&gt;     &lt;strong&gt;&lt;br /&gt;     &lt;/strong&gt; @param    String    Suchbegriff&lt;br /&gt;     * @return    Array    Suchergebnisse und Anzahl der Suchtreffer&lt;br /&gt;    */&lt;br /&gt;    function parseNews($phrase) {&lt;br /&gt;        $return;&lt;br /&gt;        $max = 0;&lt;br /&gt;        $parse = false;&lt;br /&gt;        $res = file(&amp;quot;http://www.rz.uni-konstanz.de/rechenzentrum/aktuelles/suche/?tx_ttnews[swords]=$phrase&amp;quot;);&lt;br /&gt;        for($i=0; $i&amp;lt;count($res); $i++)    {&lt;br /&gt;            if($parse == false &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;news-list-container&amp;quot;) != false)) {&lt;br /&gt;                $parse = true;&lt;br /&gt;            }&lt;br /&gt;            if($parse == true &amp;amp;&amp;amp; (strstr(utf8_encode($res[$i]),&amp;quot;news-list-browse&amp;quot;) != false)) {&lt;br /&gt;                $return .= &amp;quot;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;                $parse = false;&lt;br /&gt;            }&lt;br /&gt;            if($parse==true) {&lt;br /&gt;                $return .=($res[$i]);&lt;br /&gt;            }&lt;br /&gt;            if(strstr(utf8_encode($res[$i]), &amp;quot;news-list-item&amp;quot;) != false) {&lt;br /&gt;                $max++;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return array($return, &amp;quot;(&amp;quot;.$max.&amp;quot;)&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (defined(&#039;TYPO3_MODE&#039;) &amp;amp;&amp;amp; $TYPO3_CONF_VARS[TYPO3_MODE][&#039;XCLASS&#039;][&#039;ext/rzajaxsearch/pi1/class.tx_rzajaxsearch_pi1.php&#039;])    {&lt;br /&gt;    include_once($TYPO3_CONF_VARS[TYPO3_MODE][&#039;XCLASS&#039;][&#039;ext/rzajaxsearch/pi1/class.tx_rzajaxsearch_pi1.php&#039;]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt; 
    </content:encoded>

    <pubDate>Wed, 17 Sep 2008 09:14:35 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/18-guid.html</guid>
    
</item>
<item>
    <title>Die neue Wild Wings Homepage ist fertig!</title>
    <link>http://www.matthiashaeger.de/archives/11-Die-neue-Wild-Wings-Homepage-ist-fertig!.html</link>
            <category>Typo3</category>
    
    <comments>http://www.matthiashaeger.de/archives/11-Die-neue-Wild-Wings-Homepage-ist-fertig!.html#comments</comments>
    <wfw:comment>http://www.matthiashaeger.de/wfwcomment.php?cid=11</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://www.matthiashaeger.de/rss.php?version=2.0&amp;type=comments&amp;cid=11</wfw:commentRss>
    

    <author>nospam@example.com (Matthias Häger)</author>
    <content:encoded>
    &lt;br /&gt;
&lt;p&gt;...sofern man bei einer Homepage von &amp;quot;fertig&amp;quot; sprechen kann. Eigentlich handelt es sich um einen stetigen Prozeß.&lt;br /&gt;&lt;img width=&quot;110&quot; height=&quot;86&quot; class=&quot;serendipity_image_right&quot; style=&quot;border: 0px none ; float: right; padding-left: 5px; padding-right: 5px;&quot; src=&quot;uploads/startseite_homepage.serendipityThumb.jpg&quot; /&gt;&lt;br /&gt;Wie bereits erwähnt, betreue ich gemeinsam mit einem Kollegen die Homepage der &lt;a href=&quot;http://www.wildwings.info/&quot;&gt;Schwenninger Wild Wings&lt;/a&gt;, eines Profi-Eishockeyclubs aus der &lt;a href=&quot;http://www.esbg.de&quot;&gt;2. Bundesliga&lt;/a&gt; (ich werde heute im Laufe des Tages noch mehr die Wild Wings bloggen, schließlich ist heute Saisonauftakt. Nach drei oder vier Jahren stand in diesem Sommer der lang geplante Relaunch der Homepage an und was lag näher die &lt;a href=&quot;http://www.rz.uni-konstanz.de/&quot;&gt;beruflichen Erfahrungen&lt;/a&gt; mit Typo3 auf das Ehrenamt zu übertragen und somit sein Wissen in einem weiteren, anders gelagerten Projekt zu vertiefen.&lt;br /&gt;&lt;br /&gt;Die Webseite nutzt Typo3 4.2.1 und TemplaVoila zur grundsätzlichen Gestaltung. Als Standard-Extensions kommen u.a. Powermail, CoolURI, rggooglemap, tt_news, kj_imagelightbox und xajax zum Einsatz. Daneben wurden aber auch noch einige eigene Extensions selber programmiert um Spielplan, Tabelle, Mannschaftsstatistik, Sponsoren und gegnerische Mannschaften nach eigenen Wünschen darzustellen. Dabei wurde möglichst viel Code der vorherigen Webseite, einer PHP-Eigenentwicklung, weiterverwendet.&lt;br /&gt;&lt;br /&gt;Eine besondere Aufgabe bei der Implementation war das wieder mal zu rasch heraneilende Veröffentlichungsdatum. So waren wir gezwungen das alte Backend vorerst beizubehalten und mit Typo3 zu verknüpfen. Das alte Backend war ebenfalls eine Eigenentwicklung und ermöglichte verschiedenen Personen Newsmeldungen, Spielergebnisse und Spielbereichte einzustellen. Derzeit nutzen wir also eigene MySQL-Tabellen außerhalb von Typo3 für die Speicherung der Daten und lesen diese in unseren eigenen Typo3-Extensions aus. Dies funktioniert problemlos.&lt;br /&gt;&lt;br /&gt;Nach und nach werden wir dann in den nächsten Wochen und Monate zusätzliche Inhalte einpflegen und auch die Backend- und Administrationsinterfaces Stück für Stück komplett auf Typo3 zu migrieren. Insgesamt zeigt sich aber jetzt schon, dass der Verwaltungsaufwand durch Typo3 im Vergleich zur eigenen vorherigen Lösung wesentlich geringer ist, ohne, dass man Abstriche bei der Funktionalität machen muss. Typo3 ließ die Umsetzung aller bisherigen Funktionen und aller Wünsche zu.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.wildwings.info/web/&quot;&gt;Zur Homepage!&lt;/a&gt;&lt;/p&gt;&lt;div align=&quot;center&quot;&gt;&lt;!-- s9ymdb:8 --&gt;&lt;/div&gt;  
    </content:encoded>

    <pubDate>Fri, 12 Sep 2008 12:36:38 +0200</pubDate>
    <guid isPermaLink="false">http://www.matthiashaeger.de/archives/11-guid.html</guid>
    
</item>

</channel>
</rss>