Fluid templating vs. TemplaVoilá

TemplaVoilá bietet seit einigen Jahren die einfache Möglichkeit Templates anzubinden und dynamische Inhaltselemente zu erstellen. Mit TYPO3 in der Version 4.6 wurde die Möglichkeit eingeführt fluid templates zu verwenden. Fluid ist genau wie extbase aus dem FLOW3 Framework erwachsen und wird schon seit einiger Zeit für die TYPO3 Extension Entwicklung verwendet. Da lag der Schritt nahe fluid auch das alte Markerbasierte Templatesystem „abschaffen“ zu lassen.

Nach der Ankündigung TemplaVoilà für TYPO3 ab Version 6.2 nicht mehr weiterzuentwickeln habe ich mich gefragt: Kann man TemplaVoilá wirklich ersetzen?

Continue reading

Flexible Content Element for group exclude in TYPO3

I just had the problem that I want to show different content elements on a TYPO3 page depending on the status of the user. Actually there were three cases:

  1. Show a content element to log in if the visitor is not logged in
  2. Show special content if the user is logged in and is part of the group – let’s call it A
  3. Show a message that the user does not have permission to see the special content as he is not in group A

Let’s see how that worked out…

Continue reading

Add a special group to all frontend users in TYPO3

I recently had the task to clean up a TYPO3 instance with round about 25000 frontend users. The goal was to reduce the 40 TYPO3 frontend groups to a minimum as the security policy changed. So the most of these groups have been deleted. As the user has to be part of at least one group to be able to login to the frontend, I had to assure that each user is member of a basic group. You can imagine I did not want to do that by hand in the TYPO3 backend for 25000 TYPO3 frontend users. So I thought about a possibility to do that with an SQL query.

Get started with the TYPO3 group juggling job

Let’s assume the basic TYPO3 group is number 2. We want to add this group to everybody who is not a member. We have to pay attention to two constraints:

  1. The group should not be added to accounts which are already members
  2. If there exist accounts without any group membership we have to add these first

This results in two queries. Number one adding the group to all accunts with an empty „usergroup“ column. Number two adds „2,“ upfront all the other groups for all accounts not in group number 2.

  1. UPDATE fe_users SET usergroup=“2″ WHERE usergroup = „“;
  2. UPDATE fe_users SET usergroup=CONCAT(‚2,‘ , usergroup) WHERE FIND_IN_SET(‚2‘, usergroup) = 0;

As always: Try it on a testsystem upfront and make a backup of your database before you use this in real life. Beside that: Have fun…

If you had problems following this TYPO3 tutorial, please let me know in the comments. If it helped you or you think it can help others feel free to spread the word by sharing and liking the article. It also would help me improving the upcoming posts.

tt_news categories not shown to a backend user in TYPO3

Problem

A couple of days ago I had a problem with one of our TYPO3 news editors. She was able to see all tt_news categories she should see. She also could select one category but as soon as she saved the entry in the TYPO3 backend, the chosen category box went empty. The more curious was that the category was obviously saved, as the entry was shown correctly in the TYPO3 frontend. But as soon as she made another change afterwards the category was deleted as the box was not filled with the correct entry.
It gave me kind of a hedache because I could not imagine why she can see all the stuff and can choose it and also can save it but cannot – well – load and show it to the chosen categories box.

Analysis

Thanks to an old nabble entry I found after about 1 hour I figured out the problem. It seems that the box with the available categories is filled with another mechanism than the chosen categories box. If you have parts of the website not shown to the editor and categories in a special folder, this behaviour can happen because of the lack of access rights on this special folder.

Solution

Normally you do not want to let the editors see your – I call it – Storage Folder. If you store tt_news categories in there you might be afraid now that you will have to. But you don’t. The only thing that you have to do is give a group in which your editors reside (or if you want, everybody) read access to the folder. The steps to do that are quite easy:

  • If you don’t have already, create a backend group for the editors who need the rights
  • Add the editors to that group (obvious :) )
  • Klick on „Access“ and then on your storage folder
  • In the group column grant read access, disable all other access points by clicking on the circles (green check or red cross)
  • Choose your new group in the group column
  • Save

You are done. The editor should now be able to select, save and also see the chosen category even after saving the entry.

TYPO3 Powermail und jQuery ohne t3jquery

Heute hatte ich ein TYPO3 Problem mit Powermail und dem jQuery Framework, das mich fast in den Wahnsinn getrieben hat. Recherchen bei Google brachten mich immer zum gleichen Ergebnis: t3jquery installieren. Genau das wollte ich aber nicht, da ich bei dem aktuellen Projekt so wenige Extensions wie möglich verwenden möchte. Nach durchexerzieren etlicher Tutorials, durchreiten von mehreren Dokumentationswüsten und durchwandern des üblichen Quellcode-Dschungels bin ich letztlich an der Workaround Oase angekommen. Aber wie immer erstmal zum Problem:

jQuery nicht per t3jquery Extension einbinden

Auf dem TYPO3 Extension Markt findet sich für alles und jeden etwas mehr oder weniger gut passendes um sein gerade aktuelles Problem zu erschlagen. In Projekten mit vielen solcher Problemen endet man dann am Schluß mit einem Wust an Extensions, die sich im schlimmsten Fall gegenseitig negativ beeinflussen. Der Wartungsaufwand für den Administrator steigt natürlich auch mit jeder weiteren Extension. Aus diesem Grund versuche ich mit möglichst wenigen Extensions auszukommen.
Im konkreten Fall geht es nun um Grundfunktionalität, die an vielen Stellen der Webseite verwendet wird und ohne die heute kaum noch eine moderne Webseite herum kommt: jQuery (o.ä.). Das Javascript-Framework ist im Grunde recht einfach eingebaut, eine Skript-Anweisung im HTML genügt bereits um das Paket dynamisch von einem CDN laden zu lassen. Oder aber man installiert die Extension t3jquery die neben der Einbindung noch andere Funktionalität mit sich bringt, die man oft braucht, naja, wenn man viele Extensions verwendet, die auf jQuery angewiesen sind.
Viele dieser Extensions bringen netterweise gleich eine eigene jQuery-Datei mit und bauen die ein. So wie Powermail das auch tut. Bemerkt Powermail, dass t3jquery installiert ist, dann wird aber auf das von dieser Extension angebotene Paket zurück gegriffen.
Was ist aber nun, wenn ich das Framework über den oben erwähnten Einzeiler im HTML einbaue? Richtig, Powermail feuert seine Variante mit in die Ausgabe. Plötzlich hat man gleich mehrere jQuery Varianten, die der User sich beim Seitenaufruf runter lädt und wie zu erwarten irgendwas kaputt machen, weil sie sich gegenseitig ins Gehege kommen.
Eine Lösung muss her und die ist ganz klar formuliert: Von jedem Framework (jQuery, jQuery Tools, anythingslider etc…) darf am Ende nur ein Eintrag im ausgelieferten Quelltext stehen.

Idee 1: Powermail Ausgabe unterdrücken

Mein erster Gedanke war: „Die Frameworks per Hand einbinden und Powermail sagen es soll sich nicht einmischen“.
Gesagt getan. Es gibt recht simple Anweisungen um Powermail unmissverständlich klar zu machen, dass man seine jQuery und jQuery Tools Frameworks bitte nicht verwenden möchte:

page.includeJSlibs {
  powermail_jQuery >
  powermail_jQueryTools >
  powermail_jQueryToolsTabs >
}

Danach macht Powermail allerdings auch unmissverständlich klar, dass es die von Hand eingebundenen Frameworks auch nicht verwenden möchte. Ohne tiefer in den Code geschaut zu haben, vermute ich ein Feature statt eines Bugs. Denn wenn kein JS zur Verfügung steht, wird die Validierung der Felder wie früher auf der nächsten Seite angezeigt. Eine Option mit der man Powermail sagen kann, dass es sich drauf verlassen soll, dass da schon das richtige eingebunden ist, habe ich nicht gefunden.
Lösungsversuch gescheitert.

Idee 2: Powermail liefert jQuery

Zweite Idee: Wir lassen Powermail die Frameworks einbinden, wenn es denn unbedingt will.
Hier stoße ich auf das Problem, dass Powermail sich zwar leicht die entsprechenden Dateien unterschieben läßt, diese dann allerdings nur einbindet, wenn sich auf der Seite auch ein Powermail Formular befindet. Nun wird der geneigte Leser sicher verstehen, dass ich auf der Startseite mit Slidern und Bannern kein Powermail-Formular platzieren möchte.
In den Untiefen der Dokumentation finde ich allerdings noch ein Flag, mit dem man Powermail sagen kann, dass es immer liefern soll, auch wenn es selbst nicht zum Einsatz kommt. Also schnell mal alles zusammengebaut und getestet. Und siehe da, es funktioniert.

Die Lösung

Sollte mal jemand vor einem ähnlichen Problem stehen, so sollte er sich folgenden Code mal anschauen:

[userFunc = user_powermailOnCurrentPage(1)] && [userFunc = user_powermailCheckT3jquery(false)] && [globalVar = LIT:1 > {$plugin.powermail.js.toHeader}]

// remove jQuery and jQueryTools libraries from header
page.includeJSlibs {
  powermail_jQuery >
  powermail_jQueryTools >
  powermail_jQueryToolsTabs >
}

// Include jQuery and jQuery Tools in footer
page.includeJSFooterlibs {
  powermail_jQuery.external = 1
  powermail_jQuery =  http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js  powermail_jQueryTools.external = 1
  powermail_jQueryTools = / fileadmin/js/jquery.tools/jquery.tools.form.min.js  powermail_jQueryToolsTabs.external = 1
  powermail_jQueryToolsTabs = / fileadmin/js/jquery.tools/jquery.tools.tiny.min.js}
[end]

# At this point we only add another bunch of JS frameworks
# fancybox, easing and sliding needed on some pages
page.footerData.10 = TEXT page.footerData.10.value (   
<!-- scripts-->
<script src="/fileadmin/js/jquery.fancybox-1.3.4.pack.js?x67451" type="text/javascript"></script>
<script src="/fileadmin/js/jquery.anythingslider.min.js?x67451" type="text/javascript"></script>
<script src="/fileadmin/js/script.js?x67451" type="text/javascript"></script>
<!-- .scripts-->
)

Der obere Teil ist in leicht abgewandelter Form auch im mitgelieferten Powermail TS-Setup zu finden. Was hier interessant ist, ist die userFunc user_powermailOnCurrentPage(1). Diese prüft nämlich, ob powermail auf der aktuellen Seite aktiv ist. Als Parameter kann man mitgeben ob powermail-Javascript auf allen Seiten angezeigt werden soll. Im zweiten Teil fügen wir dann noch wie üblich alle anderen Frameworkteile hinzu.

Der gezeigte TS-Code funktioniert jetzt so wie er soll. Sicherlich kann man diesen noch ein wenig optimieren, was aber hier im Blog vermutlich eher zu Lasten des Verständnis gehen würde.

Feedback

Sollte ich mal wieder zu kompliziert gedacht haben und jemand anderes hat hier einen Einzeiler oder dergleichen parat. Immer gerne in die Kommentare posten.

Update auf TYPO3 4.6 + Debian Lenny

Nur mal eben für zwischendurch für alle, die Debian auf ihrem Server laufen haben und auf die aktuellste Version von TYPO3 aktualisieren wollen. Diese verlangt PHP in der Version 5.3 oder höher. Debian Lenny (stable) kommt aktuell aber nur mit 5.2.x. Um dieses Problem zu beseitigen kann man sich eines zweiten Repositories bedienen, das für die stable Releases auch aktuellere Versionen gebräuchlicher Pakete bereit stellt.

Zunächst in der /etc/apt/sources.list folgendes eintragen:

deb http://php53.dotdeb.org lenny all
deb-src http://php53.dotdeb.org lenny all

(für alle die „stable“ anstelle von „lenny“ in ihrer sources.list haben, entsprechend hier anpassen).
Anschließend bringen die bekannten befehle das ersehnte PHP 5.3 auf den Server:

apt-get update
apt-get upgrade

T3BLOG in bestehende Seite integrieren

Ich arbeite gerade an einer Zusammenfassung der Schritte, die ich durchgeführt habe, um den T3BLOG in meine bestehende Webseite zu integrieren. Für alle die inzwischen danach gefragt haben besteht also Hoffnung, bald eine kleine Anleitung zu haben, mit deren Hilfe die Integration ein wenig einfacher sein wird. Bitte gebt mir noch ein bisschen Zeit, da ich mich gerade noch an einer anderen Baustelle festgebissen habe. Da ich aber selber weiss, dass warten immer ein unangenehmes Gefühl ist, werde ich mich bemühen schnell an die Arbeit zu gehen. Sobald ich fertig bin, werde ich euch über den Blog informieren.

Erste Erfahrung mit T3BLOG

Wie ja schon vor Kurzem geschrieben, habe ich auf eine neue BLOG-Lösung umgestellt. Das etwas schwerfällige und veraltete TIMTAB mußte dem neuen System T3BLOG der schweizer Firma Snowflake weichen. Was grundsätzlich positiv stimmt, ist die Tatsache, dass Snowflake den Blog selbst einsetzt. Im Folgenden möchte ich meine ersten Erfahrungen mit T3BLOG schildern und euch damit helfen zu entscheiden ob T3BLOG auch etwas für euch sein könnte.

Obwohl das System so ausgelegt ist, dass man den Blog als eigenständige TYPO3 Instanz laufen läßt, ist es über einige Umwege möglich ihn auch dazu zu bewegen sich in die bereits bestehende Seite einzugliedern. Ersteres geht recht schnell von der Hand, während zweiteres in etwa so lange dauert TIMTAB einzurichten. Denn die ein oder andere Stolperfalle bringt die Einrichtung mit sich, die man hauptsächlich über TypoScript erledigt.

T3BLOG kurz und knapp – Was bei der Einrichtung auffällt

Nachdem ich die Extension jetzt soweit an meine Bedürfnisse angepasst habe, ziehe ich dennoch ein positives Fazit. Im Grunde ist T3BLOG recht übersichtlich aufgebaut und macht im Großen und Ganzen was es soll. Und das recht komfortabel. Allerdings merkt man der Extension an, dass sie noch recht neu ist. Im Folgenden ein paar Punkte, die seitens der Entwickler nochmal überdacht werden sollten:

PageBrowser:

Im PageBrowser scheint es noch an der Berechnung der ‚Vorigen‘ und ‚Nächsten‘ Seite zu haken. Hier wird eher wild in der Gegend rumgesprungen statt zur korrekten Seite zu linken.

Wenn man einen Kategoriefilter einschaltet und ein PageBrowser angezeigt wird, so wird der Filter gelöscht, sobald man Gebrauch vom PageBrowser macht.

RSS:

Der RSS-Feed für Posts enthält nur die Überschrift. Mich persönlich stört es, wenn ich einen Feed abbonniert habe, ich aber erst auf die Webseite wechseln muß, um den Beitrag zu lesen. Um T3BLOG trotzdem dazu zu bewegen, muß man dann schon im Code rumwerkeln.

Man hat keine Möglichkeit den Content im RSS-Feed als HTML ausgeben zu lassen. Wieder muß der Leser auf die Seite wechseln, um Bilder, Links etc. zu sehen. Gerade wenn man im Text darauf referenziert, ist das sehr verwirrend.

Trackback:

Eine andere Webseite per Trackback anzupingen funktioniert. Den ausgegebenen Trackback Link von T3BLOG woanders einzutragen scheint aber keinen Effekt zu haben (Getestet mit WP).

Der Link, der beim Trackback auf einen anderen Blog mitgegeben wird, wird auf der T3BLOG Seite nicht mehr korrekt dekodiert. Das führt dazu, dass man immer die Listenansicht, nicht aber die Einzelansicht bekommt. Problem scheinen hier ein paar auskommentierte Zeilen in der class.blogList.php zu sein, die angeblich „not needed anymore“ sind.

Content Elemente:

Es ist ja schon sehr komfortabel, dass man in seinem Blogbeitrag mehrere Content Elemente zusammenbauen kann, wie auf einer richtigen Seite. Was allerdings richtig nervt, ist die Tatsache, dass diese innerhalb eines Posts falschrum ausgegeben werden. Nun kann ich die ja zum Glück umsortieren. Klappt auch, wird aber beim Anlegen des nächsten Posts wieder kaputt gemacht. Warum hab ich noch nicht herausgefunden. Vielleicht haben die Entwickler von Snowflake ne Idee?

Fazit:

Version 1 überzeugt durch einen robusten Aufbau. Die Kinderkrankheiten sind (bis auf die Sache mit den Content Elementen) zunächst sicherlich verschmerzbar. Aber Aufgrund des Umfangs, den die Extension jetzt schon hat, bin ich guter Dinge, dass die Probleme bald von Snowflake behoben werden.

Kritische Sicherheitslücke in TYPO3

Im TYPO3 Kern wurde eine Sicherheitslücke entdeckt, die durch ein Update gepatcht werden kann, das seit vorgestern zur Verfügung steht. Das Update wird dringenst empfohlen, da ein Angreifer sich durch die Lücke Zugriff zum Dateisystem verschaffen kann.

Bekanntestes Opfer dieser Sicherheitslücke ist aktuell wohl Wolfgang Schäuble. Seine Webseite war über 11 Stunden mit einem Link auf den Arbeitskreises Vorratsdatenspeicherung versehen.

Nähere Informationen zu dem Fehler, seinen Auswirkungen und die betroffenen Versionen findet man im aktuellenTYPO3 Security Bulletin.

Sortierung im T3BLOG RSS-Feed

Und weil der Blog so viel Spaß macht, gleich noch was. Wer T3BLOG installiert hat und vorher was anderes benutzt hat, z.B. TIMTAB, wird vermutlich seine alten Posts akribisch von Hand umgezogen haben. Je nach Reihenfolge wird man sich danach irgendwie wundern, warum im RSS-Feed plötzlich ältere Posts vor den neueren auftauchen. Das liegt daran, dass die Standardeinstellung eine Sortierung nach Erstellungsdatum vorsieht und nicht etwa nach dem Datum, das man in dem entsprechenden Feld eingegeben hat. Hier hilft ein bischen TypoScript im Template. Statt nach ‚crdate‘ läßt man nach ‚date‘ sortieren:

plugin.tx_t3blog_pi1.rss.postItemOrderBy = date DESC

RSS jetzt auch gleich mit Text

Da ich mich selbst immer aufrege, wenn RSS-Feeds immer nur mit der Titelzeile daher kommen und man dann für den eigentlichen Inhalt immer auf die Betreiberseite muß, habe ich das bei mir eben mal angepaßt. Jetzt sollte es also auch keine Probleme mehr geben, den Feed z.B. im Google Reader auf dem „Mobile Device“ zu lesen.

Für alle, die selbst die neue T3Blog-Extension benutzen und ihren RSS-Feed mit dem Text erweitern wollen, müssen ein bischen PHP basteln. Zu Ändern ist die Datei unter pi1/widget/rss/class.rss.php im Extension-Verzeichnis. Zeile 134 sollte nach der Änderung so aussehen:

$xmlObj->setRecFields('tx_t3blog_post','title,author,uid,cat,date,text');

Lediglich der Parameter ‚text‘ ist dazu gekommen.

TYPO3 aktualisiert

Habe soeben zwischen Tunnel 11 und 12 mein TYPO3 aktualisiert. War ein bisschen holprig, aber jetzt funktioniert wieder alles. Hier ein kurzer Überblick, was man so machen sollte, wenn man von 4.1.1 auf 4.2.1 updated.

  1. Sollte man die DAM-Tools verwenden, sollten die zumindes aktualisiert werden, da zumindest in meinem Fall das komplette System inkl. Webseite, Backend und Install-Tool nicht mehr erreichbar waren. Für den Fall, daß man das doch vergessen hat, hilft es die Extensions aus dem ext-Verzeichnis zu entfernen, alle *CACHED* Dateien in typo3conf zu löschen und die Einträge bzgl. DAM aus der localconf rauszunehmen. Danach kann man sich wieder anmelden und die Extension einfach nochmal frisch nachinstallieren
  2. Man sollte neben dem Update Wizard im Install-Tool auch nochmal einen Datenbank-Compare machen. Zumindest bei mir hatte das Verbummeln des letzteren zum Effekt, daß meine Foto-Sektion sich komisch verhielt und ich einen mysql-Fehler im Page-Tree bekommen habe.

Ansonsten konnte ich noch keine auffälligkeiten feststellen. Falls euch noch was auffällt das nicht funktioniert immer her damit. Ich hoffe, daß das nächste Major-Update auf TYPO3-5.0 ebenso einfach über die Bühne geht, ber lassen wir uns überraschen.