Suchmaschinenoptimierte URL’s in eigener TYPO3 Extension: Wir erstellen eine Testextension und erklären wie man sich die perfekte URL dazu generiert.
Extension
Unsere Extension heißt Jobs und unser Model dazu Job. In diesem Beispiel gibt es ein Frontend Plugin das Jobsansicht heißt. Es gibt eine List und eine Show Action. Wir haben im Model ein Feld Titel, Beschreibung und Url. Unsere Unterseite heißt List. In dieser Seite befindet sich noch eine weitere Unterseite die „Detail“ heißt. In der Listansicht werden alle Jobs als Liste ausgeben und jeder hat einen Link:
1 2 3 |
<f:link.action action="show" pageUid="deineDetailID" arguments="{job : job}"> dein Link </f:link.action> |
URL für Detailansicht:
1 |
list/detail/?tx_jobs_jobansicht[job]=1&tx_jobs_jobansicht[action]=show&tx_jobs_jobansicht[controller]=Job&cHash=b687546e6c5f02a3d8ae73bdd1e9530d |
Typoscript
Mit diesem Code wird das Argument Controller aus der URL ausgeblendet.
1 2 3 4 5 |
plugin.tx_jobs { features { skipDefaultArguments = 1 } } |
Die Url müsste jetzt wiefolgt lauten:
1 |
/list/detail/?tx_jobs_jobansicht[job]=1&tx_jobs_jobansicht[action]=show&cHash=1ba9482bceb8ec60ab24590855c9cfb3 |
realurl_conf.php
Wichtig: Realurl muss auf manuelle Konfiguration eingestellt sein (Erweiterungsmanager > Realurl > Konfiguration > Path to configuration file). Setzt hier euren Dateipfad ein. In diesem Beispiel typo3conf/realurl_conf.php. Eine gute Beispielkonfiguration, die schon viel abdeckt findet ihr hier.
Achtung: Je nach dem wie ihr euren link mit f:link generieren lasst, musst ihr verschiedene Variablen abfangen (zB wenn ihr für die Detailansicht ein anderes FE Plugin verwendet oder dergleichen). Ihr könnt sehr schon an der URL sehen was noch fehlt 🙂
Im Code sind Kommentare mit Hinweisen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
... 'postVarSets' => array( '_DEFAULT' => array( 'extbaseParameters' => array( array( 'GETvar' => 'tx_jobs_jobansicht[action]', 'noMatch' => 'bypass', // Action verschwindet aus der URL ), ), 'yourURLfragment' => array( // Domain Model UID & CHASH verschwindet aus der URL array( 'GETvar' => 'tx_jobs_jobansicht[job]', 'lookUpTable' => array( 'table' => 'tx_jobs_domain_model_job', 'id_field' => 'uid', 'alias_field' => 'url', 'addWhereClause' => ' AND NOT deleted', 'useUniqueCache' => 1, 'useUniqueCache_conf' => array( 'strtolower' => 1, 'spaceCharacter' => '-', ), 'languageGetVar' => 'L', 'languageExceptionUids' => '', 'languageField' => 'sys_language_uid', 'transOrigPointerField' => 'l10n_parent', 'autoUpdate' => 1, 'expireDays' => 180, ), ), ), ), ), ... |
Achtung: in neueren RealUrl Versionen als in diesem Beispiel müsst ihr alles URL-Daten (Relaurl Cache) löschen, um die Änderungen zu sehen.
Nach einfügen des Codes müsste die URL jetzt wiefolgt lauten:
1 |
list/detail/yourURLfragment/{url}/ |
Das geht aber noch besser 🙂
Pfad manipulieren
Wir möchten das der Aufbau logischer wird. Ganz unten in der realurl_conf.php haben wir unsere User funktionen eingefügt.
1 2 3 4 5 6 7 |
function user_decodeSpURL_preProc(&$params, &$ref) { $params['URL'] = str_replace('job/', 'detail/yourURLfragment/', $params['URL']); } function user_encodeSpURL_postProc(&$params, &$ref) { $params['URL'] = str_replace('detail/yourURLfragment/', 'job/', $params['URL']); } |
Aufrufen der Funktion:
1 2 3 4 5 |
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl'] = array( 'encodeSpURL_postProc' => array('user_encodeSpURL_postProc'), 'decodeSpURL_preProc' => array('user_decodeSpURL_preProc'), .... ) |
Endergebnis:
1 |
list/job/{url}/ |
Das kann jeder für sich entscheiden wir für Ihn die URL optimal ist.
Fallback für URL Feld
Wir wollen jetzt noch ein Fallback einfügen, falls das Feld URL nicht ausgefüllt ist (ja, man könnte es einfach mit Pflichtfeld lösen). Falls man es nicht als Pflichtfeld konfigurieren will wäre dies ein Lösungsansatz:
1 2 3 4 5 6 7 8 9 10 11 12 |
... 'yourURLfragment' => array( array( 'GETvar' => 'tx_jobs_jobansicht[job]', 'lookUpTable' => array( ... 'alias_field' => 'coalesce(NULLIF(url, ""), titel)', ... ), ), ), ... |
Durch den Befehl „coalesce“ wird nur das Feld „url“ zum generieren der URL verwendet, wenn es ausgefüllt ist. Sonst nimmt RealUrl das Feld „titel“.
Getestet mit
TYPO3 7.6.14
Realurl 2.0.14
Robert Wildling
Juni 28, 2019 — 11:54 am
Warum lautet beim TypoScript Snippet das element, das den Controller ausblenden soll, „features“? Ist das ein extbase standard?
Stefan Schoner
Juli 1, 2019 — 7:04 am
Ist eine Standardfunktion und funktioniert bei jeder eigenen Extension. Bei TYPO3 9 LTS braucht man das aber nicht mehr. Da gibts andere Wege für saubere speaking urls.
Joe
März 11, 2019 — 9:51 am
Sehr gute Anleitung!
Noch eine Frage: Kann man die Funktionen user_decodeSpURL_preProc und user_encodeSpURL_postProc umbenennen?
Für den Fall, dass für die realurl single-view für die news-Extension auch dieselbe Funktion benutzt
Stefan Schoner
März 11, 2019 — 3:32 pm
Hi Joe,
Danke für dein Kommentar:
Du kannst die funktion benennen wie du willst, sofern du sie dann mi tdem korrenten Namen aufrufst.
Anna
Februar 18, 2018 — 11:26 am
Vielen Dank für die tolle Anleitung! Hat alles auf Anhieb funktioniert!