TYPO3 / realUrl: HTML Entities aus der URL entfernen

Kennt ihr das auch? Das Design ist perfekt und die Programmierung fast abgeschlossen. Alles passt perfekt zusammen, doch dann passiert es: Es fehlt noch ein „kleiner Menüpunkt“ auf der Seite. Der neue Menüpunkt heißt „Glücksspielstaatsvertragsausführungsgesetz“ und passt in dieser Länge natürlich niemals in einer Zeile ins Menü. In diesem Fall bediene ich mich gerne der HTML Entitie ­ womit man möglich Umbruchpunkte im Text erlauben kann.

Sofern man in seinen Menüs nicht htmlSpecialChars = 1 verwendet funktioniert das ganze ziemlich gut. Hat man nun jedoch noch realURL im Einsatz befindet sich dieses HTML Tag noch in der URL zu der Seite. Eine Funktion wie htmlSpecialChars gibt es hierbei in der Konfiguration leider nicht.

Die einfachste Lösung wäre es, sich der Seiteneigenschaft URL-Alias zu bedienen und dort die gewünschte URL ohne Sonderzeichen einzutragen. Aber warum einfach wenn es auch kompliziert geht?

In der realURL Dokumentation bin ich dann aber über die Konfiguration „encodeTitle_userProc“ im Abschnitt pagePath gestoßen, mit der man relativ leicht eine userFunction einschleusen kann um HTML Tags wie z.B. ­ oder   aus der URL zu entfernen.

Zunächst meldet man diese in seiner realurl_conf.php an:

$TYPO3_CONF_VARS['EXTCONF']['realurl']['_DEFAULT'] = array(
        'pagePath' => array(

                ..........

                'encodeTitle_userProc' => 'fileadmin/pfad/zu/class.realurl_util.php:&tx_realurl_util->fixTitle',
        ),
        
        ..........

);

In der Datei class.realurl_util.php ist nun einfach eine Klasse mit zwei Funktionen hinterlegt:

  • fixTitle() prüft anhand eines regulären Ausdrucks ob ungewolle HTML Tags vorhanden sind und entfernt diese entsprechend zunächst per preg_replace und übergibt den Titel anschließend an…
  • encodeTitle() diese Funktion ist der gleichnamigen Funktion aus der Datei class.tx_realurl_advanced.php von realURL nahezu identisch. Die userFunction erhält zwar eine Referenz auf das Ursprungsobjekt und ich könnte diese Funktion auch direkt in realURL erneut aufrufen, allerdings warnt der Autor davor, dass die Sichtbarkeit dieser Funktion jederzeit auf private geändert werden könnte. Darum habe ich die Funktion übernommen. (ohne enableAllUnicodeLetters!)
<?php
    class tx_realurl_util {
        function fixTitle($params) {
            if(preg_match("/&#?[a-z0-9]{2,8};/i", $params['title'])) {
                $fixedTitle = preg_replace("/&#?[a-z0-9]{2,8};/i","",$params['title']);
                return $this->encodeTitle($fixedTitle, $params['encodingConfiguration']);
            } else {
                return $params['processedTitle'];
            }
        }
        function encodeTitle($title, $conf) {
            // Fetch character set
            $charset = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] ? $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset'] : $GLOBALS['TSFE']->defaultCharSet;
    
            // Convert to lowercase
            $processedTitle = $GLOBALS['TSFE']->csConvObj->conv_case($charset, $title, 'toLower');
    
            // Strip tags
            $processedTitle = strip_tags($processedTitle);
    
            // Convert some special tokens to the space character
            $space = isset($conf['spaceCharacter']) ? $conf['spaceCharacter'] : '_';
            $processedTitle = preg_replace('/[ \-+_]+/', $space, $processedTitle); // convert spaces
    
            // Convert extended letters to ascii equivalents
            $processedTitle = $GLOBALS['TSFE']->csConvObj->specCharsToASCII($charset, $processedTitle);
    
            $processedTitle = preg_replace('/\\' . $space . '{2,}/', $space, $processedTitle); // Convert multiple 'spaces' to a single one
            $processedTitle = trim($processedTitle, $space);
            
            return $processedTitle;
        }
    }
?>

Da die Dokumentation zu encodeTitle_userProc nur sehr dürftig ausfällt: Hier nochmal eine Übersicht über die übergebenen Parameter an diese userFunction

  1. Parameter 1 ($params) ist ein Array mit dem folgenden Inhalt:
    • pObj = Referenz auf das Ursprungsobjekt aus class.tx_realurl_advanced.php
    • title = Der unveränderte Seitentitel
    • processedTitle = Der durch realURL bereits verarbeitete Titel
    • encodingConfiguration = Array mit den Einstellungen strtolower und spaceCharacter aus der realURL Konfiguration
  2. Parameter 2 ($pObj) ist ebenfalls eine Referenz auf das Ursprungsobjekt aus class.tx_realurl_advanced.php

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.