Beim letzten Treffen der Münchner TYPO3 Usergroup hat der TYPO3 v4 Core Entwickler Stefan Galinski seine Extension dF_Tools vorgestellt, die bereits seit ein paar Wochen im TYPO3 Extension Repository verfügbar ist.
Die Extension bietet die Möglichkeit, automatisiert Links und Weiterleitungen sowie Backlinks auf die eigene Seite zu prüfen. Außerdem gibt es die Möglichkeit, einen Inhaltsvergleich (vorher/nachher) einer Seite zu machen oder zwei verschiedene Seiten miteinander zu vergleichen. Die dF_Tools verfolgen einen anderen Ansatz als z.B. der Link Validator, der mit TYPO3 4.5 eingeführt wurde.
Da die Extension auch aus technischer Sicht durch die Verwendung von Extbase, Ext JS und Ext.Direct interessante Ansätze für andere Entwickler bietet, möchte ich sie hier kurz vorstellen.
Voraussetzung für die Installation sind TYPO3 4.5, Extbase und Fluid. Für die Link Tests sollte cURL installiert sein. Für den Fall, dass cURL nicht zur Verfügung steht, gibt es auch eine native PHP Lösung, die allerdings voraussetzt, dass PHP externe URLs aufrufen darf. Vor der Installation sollte am Besten schon ein leerer Ordner angelegt werden, in den die dF_Tools ihre Daten speichern können. Nach dem Download aus dem TER muss im Extension Manager nur der vorher angelegte SysOrdner eingetragen werden. Damit ist die Konfiguration erst mal abgeschlossen.
Im Bereich „Adminwerkzeuge“ im TYPO3 Backend steht danach ein neuer Menüpunkt „dF_Tools“ zur Verfügung.
Der Link Test
Der Link Test prüft ähnlich wie der Linkvalidator alle Links, die er in Tabellen mit einer TCA-Konfiguration findet. Dabei werden aber nur Links mit vorangestelltem http(s) bzw. ftp geprüft. Interne Links, die mit TypoLink erzeugt werden, werden ignoriert. Im ersten Schritt wird über den Button „Daten synchronisieren“ eine Liste der URLs aus der Datenbank ermittelt. Mit „Tests starten“ läuft dann der eigentliche Test los. Dieser Vorgang kann je nach Größe der Seite einige Zeit in Anspruch nehmen. Über einen mitgelieferten Scheduler Task können beide Schritte auch automatisiert ausgeführt werden. Es wird dann eine E-Mail mit den Test Ergebnissen verschickt.
Das Test Ergebnis wird gruppiert nach Fehlern, Warnungen und Erfolgen dargestellt. Über die Icons am rechten Rand können Details zum Testergebnis angezeigt werden, ein Eintrag ignoriert oder als Falsch-Positiv markiert oder ein erneuter Einzeltest gestartet werden.
Ignorierte Links werden auch bei weiteren Test-Durchläufen nicht mehr geprüft. Dies ist beispielsweise bei absichtlich falsch geschriebenen Links sinnvoll.
Als Falsch-Positiv markierte Links werden in Benachrichtungsmails nicht mehr angemeckert und auch nicht als Fehler oder Warnung markiert. Jedoch findet bei Test-Durchläufen noch immer eine Validierung statt, so dass man die Liste ab und an manuell prüfen sollte. Der Anwendungszweck sind Links, welche beim Aufruf je nach Einstellung des Besuchers z.B. auf ein Land/Sprache weiterleiten.
Über den Pfeil vor dem Eintrag kann man Details zum gefundenen Datensatz ausklappen und den Datensatz auch direkt editieren.
Im Extension Manager können ganze Tabellen oder auch nur einzelne Felder von den Tests ausgeschlossen werden. Das ist vor allem dann hilfreich, wenn man z.B. Spam Links aus Kommentaren ignorieren möchte.
Weiterleitungen testen
Für Seiten mit vielen Redirects (z.B. per .htaccess oder RealURL) bietet sich der Weiterleitungstest an. Dabei wird geprüft, ob eine Test URL genau das erwartete Ergebnis liefert (inklusive Slash und HTTP Status Code). Der HTTP-Status-Code-Check benutzt den zuletzt erhaltenen HTTP-Code. Üblicherweise ist dieser entweder ein „200 OK“ oder ein „404 Not Found“.
Um bei vielen Tests die Übersicht zu behalten, können die einzelnen Tests in Kategorien gruppiert werden.
Backlinks testen
Wer prüfen möchte, ob eine beliebige Seite A auf eine beliebige andere Seite B verlinkt, für den ist der Backlink Test gut geeignet. Momentan wird noch geprüft, ob die URL exakt wie eingegeben vorhanden ist. In Zukunft sollen auch reguläre Ausdrücke möglich sein.
Inhaltsvergleiche
Dieses Werkzeug ermöglicht es, Inhalte zweier URLs zu vergleichen. Es existieren zwei verschiedene Test-Modi. Zum einen können die Inhalte zweier verschiedener URLs miteinander verglichen werden und zum anderen der Inhalt einer früheren Version der Seite mit dem aktuellem Zustand verglichen werden. Hierzu müssen die URLs identisch sein. Der Inhaltsvergleich prüft nur die Inhalte zwischen den Kommentaren <!–TYPO3SEARCH_begin–> und <!–TYPO3SEARCH_end–>. Falls diese nicht gesetzt sind, wird der komplette Inhalt geprüft.
Die Unterschiede zwischen den Inhalten werden im Ergebnis farblich hervorgehoben. Für den Inhaltsvergleich von Änderungen auf einer Seite (gleiche URL) kann über einen Button der Testinhalt aktualisiert werden. Bei zukünftigen Tests wird dann der aktuelle Stand mit dem gespeicherten Testinhalt verglichen.
Skalierbarkeit
Laut Stefan Galinski eignet sich die Extension nur für kleine und mittelgroße Webseiten, da die Performance bei großen Mengen an Links einbricht. Eine direkte Faustregel für die Anzahl der Seiten, etc. gibt es nicht, da die Größer der Datenbank und die Anzahl der gefundenen Links entscheidend ist. Bei Performance Problemen kann es hilfreich sein, über den Extension Manager Felder oder ganze Tabellen von der Suche auszuschließen.
Technische Aspekte
Unabhängig davon, was die Extension tut, ist sie auch für andere Extension Entwickler interessant. Los geht es schon im Extension Manager: die Konfiguration läuft komfortabel über ein FlexForm. Möglich ist dies über eine userfunc in der Datei ext_conf_template.txt. Details dazu werden in diesem Artikel auf buzz.typo3.org beschrieben.
Aber auch sonst hat die Extension technisch allerhand zu bieten: das Backend Modul wurde mit Extbase erstellt. Das optische Grundgerüst (Grid) wurde mit Ext JS bzw. Ext.Direct umgesetzt.
Eine Herausforderung war die Verbindung von Ext.Direct mit ExtBase und die Absicherung der Formulare mit dem HMAC, wodurch natürlich die ExtJS-Stores entsprechend erweitert werden mussten, so dass diese das __hmac-Feld von ExtBase berücksichtigen. Zudem musste ein Layer eingebaut werden, damit die reinkommenden Daten von Ext.Direct für ExtBase entsprechend gemappt werden, da ansonsten eine Validierung der Objekte nicht möglich wäre. Das Mappen der Daten gilt natürlich auch umgekehrt, wodurch ein spezieller „View“ notwendig wird, der statt HTML ein Array zurückgibt. Sobald man von diesen kleineren Umständlichkeiten absieht, ist der Rest reines ExtBase und kann auch dementsprechend verwendet werden. Der gesamte Prozess kostet jedoch schon ein bisschen Performance, weshalb man vor einer solchen Implementierung sich überlegen sollte, ob es für das eigene Projekt Sinn ergibt. Am Besten einfach mal die dF_Tools mit größeren Datenmengen testen, da einem hierdurch das Problem mit großen Datenmengen sowohl mit ExtBase als auch mit ExtJS ersichtlich wird. Vieles davon kann man natürlich entsprechend anpassen, um die Performance und Usability zu verbessern, aber es ist auf jeden Fall eine zusätzliche Hürde.
(Zitat: Stefan Galinski)
Ein Blick in den Quelltext lohnt sich also auf jeden Fall!
Für Bugs und Feature Requests gibt es ein Projekt bei Forge.