Bessere User Experience dank TYPO3 Linkhandler

Linkhandler ab TYPO3 8: einfach News, Jobs etc. verlinken

Der Linkhandler ermöglicht es ab der TYPO3 8.7 LTS verschiedenste Datensätze direkt im Text zu verlinken. Doch was hat es mit dem Linkhandler auf sich und wie lässt er sich einrichten?

TYPO3 ist ein sehr flexibles Content Management System. Kundenindividuell lassen sich Datensätze anfertigen und verwalten, wie beispielsweise News, Jobs, Ansprechpartner oder Termine. Diese können dann u.a. als sortierte Liste und sogar als Detailansicht als einzelne Seite angezeigt werden. Doch wie können Redakteure diese Seiten im Text, genauer gesagt im Rich Text Editor, verlinken?

Der Linkhandler für Redakteure

Nehmen wir als Beispiel die News. Sie erstellen im TYPO3 einen neuen Artikel. Die neuesten drei Artikel werden auf Ihrer Startseite dargestellt. Zusätzlich gibt es ein Archiv mit allen Artikeln aufgelistet. Für jede News gibt es eine sogenannte Detailansicht. Das heißt eine separate Seite im TYPO3, wo alle relevanten Informationen zu einem News-Artikel dargestellt werden.

Nun kann es sein, dass Sie einen Text schreiben oder Bild im TYPO3 einfügen, welches auf einen Artikel verlinken soll. Betätigt ein Nutzer diesen Link, gelangt er automatisch zur Detailansicht. Nun können Sie die URL direkt im RTE eintragen. Komfortabler und nachhaltiger ist es jedoch auf den Datensatz zu verlinken. Wie das geht, zeigt das folgende Video.

Ändert sich bei der bisherigen Vorgehensweise die URL des Artikels beispielsweise dadurch, weil Ihnen noch ein Rechtschreibfehler im Titel aufgefallen ist, so ist der bisherige Link nicht mehr gültig. Nutzen Sie besser die Methode aus dem Video. Haben Sie so den Datensatz verlinkt, aktualisiert sich dieser Link automatisch und die Verknüpfung bleibt erhalten.

Im Folgenden zeigen wir den Integratoren, wie Sie diese Funktion den Redakteuren bereitstellen können. Dabei beziehen wir uns auf die Kernfunktionalität ab TYPO3 8.6. Vorher bis inklusive der TYPO3 7.6 LTS war der Linkhandler eine separate Erweiterung.

Backend: Linkhandler im TSconfig

Um einen Linkhandler den Redakteur im Backend zur Verfügung zu stellen, werden einige Zeilen pageTSconfig benötigt, genauer gesagt im TCEMAIN. In dem Codebeispiel haben wir 3 neue Verlinkungsmöglichkeiten geschaffen.

 TCEMAIN {
 linkHandler {
 tx_news {
 handler = TYPO3\CMS\Recordlist\LinkHandler\RecordLinkHandler
 label = LLL:EXT:cs_templates/Resources/Private/Language/locallang_db.xlf:TCEMAIN.linkHandler.tx_news
 configuration {
 table = tx_news_domain_model_news
 storagePid = 86
 hidePageTree = 1
 }
 scanAfter = page
 }

 tx_csevents {
 handler = TYPO3\CMS\Recordlist\LinkHandler\RecordLinkHandler
 label = LLL:EXT:cs_templates/Resources/Private/Language/locallang_db.xlf:TCEMAIN.linkHandler.tx_csevents
 configuration {
 table = tx_news_domain_model_news
 storagePid = 87
 hidePageTree = 1
 }
 scanAfter = page
 displayAfter = tx_news
 }

 tx_cshosts {
 handler = TYPO3\CMS\Recordlist\LinkHandler\RecordLinkHandler
 label = LLL:EXT:cs_templates/Resources/Private/Language/locallang_db.xlf:TCEMAIN.linkHandler.tx_cshosts
 configuration {
 table = tx_cshosts_domain_model_host
 hidePageTree = 0
 }
 scanAfter = page
 displayAfter = tx_csevents
 }
 }
}

 

Nachdem der Cache geleert wurde, sehen wir im CKEditor direkt die neuen Tabs.

Neue Tabs des TYPO3 Linkhandlers im Link Wizard vom RTE

Achtung: Wenn Sie das pageTSconfig mit registerPageTSConfigFile  und über die Auswahl in den Seiteneinstellungen hinzugefügt haben, werden die Links im Frontend nicht gerendert, sondern einfach nicht als Links ausgegeben. Das rührt daher, dass diese Dateien im Frontend noch nicht mit geladen werden. Daher müssen diese Einstellungen entweder direkt in die Seiteneigenschaften geschrieben oder die Datei an der selben Stellen inkludiert werden.

TYPO3 Linkhandler im Seiten-TSconfig Feld einbinden

Frontend: Linkhandler im TypoScript

Nun muss TYPO3 noch gesagt werden, wie es mit diesen Verlinkungen umgehen soll. Anders ausgedrückt, wie soll der Link im Frontend gerendert werden. Die entsprechende Konfiguration findet unter config.recordLinks im TypoScript statt.

config.recordLinks {
 tx_news {
 typolink {
 parameter = {$plugin.tx_news.settings.defaultDetailPid}
 additionalParams.data = field:uid
 additionalParams.wrap = &tx_news_pi1[controller]=News&tx_news_pi1[action]=detail&tx_news_pi1[news]=|
 useCacheHash = 1

 ATagParams.data = parameters:allParams
 target.data = parameters:target
 title.data = parameters:title

 extTarget = _blank
 extTarget.override.data = parameters:target
 }
 forceLink = 1
 }

 tx_csevents < .tx_news

 tx_csevents {
 typolink {
 parameter = {$plugin.tx_csevents.settings.detailPid}
 }
 forceLink = 1
 }

 tx_cshosts < .tx_news

 tx_cshosts {
 typolink {
 parameter = {$plugin.tx_cshosts_pi1.settings.detailPid}
 additionalParams.wrap = &tx_cshosts_pi1[controller]=Host&tx_cshosts_pi1[action]=show&tx_cshosts_pi1[host]=|
 }
 }
}

Wenn der Linkhandler einmal konfiguriert wurde, dann lassen sich die Einstellungen leicht für andere Erweiterungen übernehmen.

Achtung: Die Angaben wie title.data und ATagParams.data sind wichtig, ansonsten werden nicht alle Einstellungen aus dem RTE übernommen.

Detailseiten nach Kategorien

Ein Sonderfall ist, wenn es für unterschiedliche Kategorien auch unterschiedliche Detailseiten gibt. Sind die Detailseiten am Kategorie-Datensatz definiert, kann folgendes TypoScript genutzt werden, um je Kategorie, eine andere Verlinkung zu erzeugen.

config.recordLinks.tx_news.typolink.parameter.stdWrap.cObject =  CONTENT 
config.recordLinks.tx_news.typolink.parameter.stdWrap.cObject { 
 table =  sys_category 
 select {
 pidInList = {$plugin.tx_news.settings.startingpoint}
 selectFields = sys_category.single_pid AS detailPid 
 join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid 
 where = sys_category_record_mm.uid_foreign = {field:uid} 
 where.insertData = 1 
 max = 1
 } 
 renderObj =  TEXT 
 renderObj.field = detailPid 
}

Das TypoScript wurde aus dem Kommentar von Micha zu diesem Blog-Beitrag übernommen (s. unten). Wir empfehlen generell nur eine Detailseite pro Domain zu verwenden, da es ansonsten auf jeder Detailseite möglich ist, jede News darzustellen, was zu doppelten Inhalten führen kann. Das hier abgebildete Beispiel geht auch nur, wenn die News-Artikel jeweils nur einer Kategorie zugewiesen wurden.

Vorsicht bei weiteren Attributen

Derzeit werden weitere Attribute wie Targets und Klassen beim Fluid-TypoLinkViewHelper und der Verlinkung von Datensätzen ignoriert. Tickets gibt es dazu schon einige auf Forge, u.a.: https://forge.typo3.org/issues/81620. Mit den obigen Einstellungen werden diese Attribute nur für Links aus dem RTE übernommen.

Ausblick

Der Linkhandler funktioniert so auch in der neuen TYPO3 9.0. Weitere Videos rund um das Thema TYPO3 und mehr finden Sie auch auf unserem YouTube-Kanal.

Falls Sie Fragen oder Anmerkungen zum Beitrag haben, schreiben Sie uns gerne einen Kommentar oder nehmen Sie mit uns Kontakt auf.

  • 13/02/2018

    Kommentar von Matthias

    Danke für das Tutorial. Eine Frage dazu: es gibt ja die Möglichkeit, die Detail Seite der News über die zugehörigen Kategorien anzugeben, also nicht eine einzige sondern mehrere Detailseiten zu haben. Kann der Linkhandler damit umgehen?

    • 13/02/2018

      Kommentar von Marc

      Hallo Matthias, gerne. Ja du kannst den typolink-Parameter über stdWrap soweit modifizieren wie du magst. Also bestenfalls sind die Detail-Seiten bei den Kategorien hinterlegt und je nachdem werden sie ausgegeben. Oder du gehst über das CASE-Objekt oder nimmst eine UserFunc. Also theoretischerweise ist alles möglich. Prinzipiell würde ich jedoch immer eine Detail-Seite für alle News bevorzugen, um doppelte Inhalte etc. zu vermeiden. Viele Grüße, Marc

  • 25/02/2018

    Kommentar von Michael

    Ich hab das mit den Newskategorien so gelöst:

    parameter.stdWrap.cObject = CONTENT
    parameter.stdWrap.cObject {
    table = sys_category

    select {
    pidInList = 71
    selectFields = sys_category.single_pid AS detailPid
    join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid
    where = sys_category_record_mm.uid_foreign = {field:uid}
    where.insertData = 1
    andWhere.stdWrap.intVal = 1
    andWhere.stdWrap.stripHtml = 1
    }

    renderObj = TEXT
    renderObj.field = detailPid
    renderObj.wrap = |
    }

    • 26/02/2018

      Kommentar von Marc

      Hallo Michael, danke für dein Kommentar. Das ist ein guter Lösungsansatz. Viele Grüße, Marc

  • 05/03/2018

    Kommentar von Matthias

    Hallo Marc,
    wenn man die Detail Seite über die Kategorien vergibt, hat man ja kein Problem mit doppeltem Content (weil es auch dann pro News immer nur eine Detail Seite gibt). Die Lösung von Michael würde ich gerne ausprobieren – kann man die irgendwie formatiert bekommen?
    Danke und Gruß,
    Matthias

    • 06/03/2018

      Kommentar von Marc

      Hallo Matthias, ich habe das Codebeispiel von Micha in den Beitrag übernommen inkl. Anmerkungen. Viele Grüße, Marc

  • 06/03/2018

    Kommentar von Matthias

    Die Lösung von Michael funktioniert – allerdings nur, wenn pro news genau eine Kategorie vergeben wurde. Hat eine news mehrere Kategorien, klappt die Verlinkung nicht mehr.

    • 06/03/2018

      Kommentar von Marc

      Hallo Matthias, da kann ich dir nur zustimmen. Es ist bei einigen Projekten schwer zu realisieren, aber prinzipiell raten wir auch aufgrund dessen zu einer Detailseite für alle News. Viele Grüße, Marc

  • 07/03/2018

    Kommentar von Matthias

    Hallo Marc,
    man kann bei dem select noch ein max = 1 hinzufügen, dann klappt es auch, wenn die news mehrere Kategorien hat.
    Matthias

    • 07/03/2018

      Kommentar von Marc

      Hallo Matthias, der erste gewinnt also 🙂 Ich füge das mal noch hinzu. Viele Grüße, Marc

  • 28/03/2018

    Kommentar von Martin

    Danke für das Tutorial. Funktioniert super mit dem RTE. Leider funktioniert es nicht bei anderen Linkfeldern z.B. beim header_link oder bei der Verlinkung von Bildern.
    Es wird zwar in der Datenbank der der richtige Link abgelegt: t3://record?identifier=…. Aber der Link um die Überschrift wird ignoriert. Die TCEMAIN-Anweisungen habe ich direkt in das Seiten-TSconfig geschrieben, daran kann es eigentlich nicht liegen.
    Eine debug-Ausgabe im Fluid gibt mir auch den entsprechenden string aus (t3://record?identifier=..) aber er lässt sich nicht mit f:link.typolink parameter=“{link}“ rendern.
    Gibt es dazu von euch Erfahrungswerte?
    Danke und schöne Grüße
    Martin

    • 28/03/2018

      Kommentar von Marc

      Hallo Martin, ich hoffe deine Frage richtig verstanden zu haben. Dein pageTSconfig scheint zu greifen, da du ja im Backend die Verlinkung vornehmen kannst. Wichtig ist wie beschrieben und im Screenshot gezeigt, dass das pageTSconfig direkt über über das Seiten-TSconfig-Feld eingbunden wird. Ich vermute mal, das sorgt auch bei dir für den Fehler. Ansonsten schau mal, dass das TypoScript richtig eingebunden wird, also config.recordLinks. In der TYPO3 8 kannst du zudem in der typo3/sysext/frontend/Classes/Typolink/DatabaseRecordLinkBuilder.php debuggen, ob dein TypoScript und dein pageTSconfig greift. Ich hoffe, dass ich dir weiterhelfen konnte. Viele Grüße, Marc

  • 03/04/2018

    Kommentar von Martin

    Hallo Marc, danke für die Rückmeldung. Das pageTSconfig war schon richtig eingebunden, das war nicht das Problem. Beide Scripte (TypoScript und pageTSconfig) waren korrekt eingebunden und haben gegriffen. Zwei Tage im ContentObjectRenderer und im DatabaseRecordLinkBuilder haben mir gezeigt, das die parameter in der Konfiguration falsch interpretiert werden. Es wird ein array statt einem String gebildet. Nachdem ich das gefunden hatte konnte ich das auch beheben. Das ganze war in der TYPO3 Version 8.7.11. In der neuen Version 8.7.12 ist der Bug behoben: https://review.typo3.org/#/c/56152/ Es funktioniert nun und euer Tutorial hat dabei geholfen. Danke. Das ganze nur zu deiner Information. Herzliche Grüße, Martin

    • 09/04/2018

      Kommentar von Marc

      Hallo Martin, vielen Dank nochmal für deine Rückmeldung. Viele Grüße, Marc

  • 24/04/2018

    Kommentar von Josef Kochmann

    Hallo, vielen Dank für den Beitrag.
    Ich möchte Dich fragen, ob das auch für 7.6.25 LTS funktioniert?

    Danke im Voraus!

    • 24/04/2018

      Kommentar von Marc

      Hallo Josef, wir haben für TYPO3 7 diese Erweiterung genutzt https://github.com/cobwebch/linkhandler. Im Core ist der Linkhandler ab TYPO3 8.6 verfügbar https://docs.typo3.org/typo3cms/extensions/core/8.7/Changelog/8.6/Feature-79626-IntegrateRecordLinkHandler.html. Viele Grüße, Marc

  • 11/07/2018

    Kommentar von Karina Kern

    Hallo!
    Danke für die sehr hilfreiche Anleitung!!
    Mir ist nur aufgefallen, dass sich beim Code für die Detailseiten nach Kategorien ein (Tipp?)Fehler eingeschlichen hat. Es steht zwei mal „paremeter“ statt „parameter“, deswegen hat es bei mir nicht gleich funktioniert 😉
    Vielen Dank und liebe Grüße,
    Karina

    • 11/07/2018

      Kommentar von Marc

      Hallo Karina, ich weiß gar nicht wovon du sprichst. Bei mir im Browser sieht alles gut aus *hust*. Vielen Dank für den Tipp. Liebe Grüße

Kommentar hinzufügen

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