Eigene Linkhandler für Links auf Datensätze in TYPO3

Mit TYPO3 8.6 wurde die Funktionalität von EXT:linkhandler in den Core integriert. Bis dahin kannte ich diese Extension nicht. Hätte ich aber sollen. Es gibt so Dinge, bei denen man erst merkt, wie sehr man sie eigentlich vermisste, wenn man weiss, dass es sie gibt.

Links direkt auf Datensätze mit dem Linkhandler

Mit TYPO3 8.6 wurden Links im CMS komplett überarbeitet und eine vereinheitlichte Syntax (t3://) für alle Arten von Links (intern, extern, Mail, Dateilink, ...) eingeführt. In dem Zuge wurde auch gleich die Möglichkeit eingeführt, direkt auf Datensätze (wie z.B. Newsartikel oder Produkte) zu verlinken. Das war zuvor nur über Extensions wie Linkhandler möglich, die jetzt in den Core übernommen wurde.

Das ist so ein Feature, das ich komischerweise nie vermisst hatte und plötzlich so: wie konnte ich nur ohne auskommen?! Es ist vielleicht so, dass ich mich einfach daran gewöhnt oder damit abgefunden hatte, dass man auf News oder andere interne Datensätze halt über die externe URL verlinken muss. Was natürlich eher doof ist, da so eine URL sich ja auch mal ändern kann. Stattdessen kann man jetzt direkt im Backend direkt aus dem Link Browser auf beliebige Datensätze verlinken.

TYPO3 Link Browser mit Auswahl von News-rtikeln

Konfiguration von Links fur die News-Extension

Am Beispiel der News-Extension (tx_news) hier mein Setup, um direkt auf einzelne News verlinken zu können. Prinzipiell funktioniert das aber für alle Datensätze, die eine Detailseite haben.

TSConfig

über TCEMAIN wird hier ein neuer Linktyp zum Link Browser hinzugefügt und konfiguriert.

Wichtig ist die Angabe der StoragePid. Da innerhalb von TSConfig leider keine Variablen erlaubt sind muss diese hier direkt eingetragen werden.

TCEMAIN {
 linkHandler.tx_news {
 handler = TYPO3\CMS\Recordlist\LinkHandler\RecordLinkHandler
 label = News
 configuration {
 table = tx_news_domain_model_news
 storagePid = 23
 hidePageTree = 1
 }
 scanAfter = page
 }
}

Typoscript (setup)

Hier wird durch einen typolink konfiguriert, wie der Link im Frontend ausgegeben wird.

Zeile 3: Die Variable enthält die PID der Detailseite

Zeile 5: Die Angabe von action und controller waren bei mir notwendig, da sonst wegen meines realurl-Setups für News  mit fixedPostVars falsche URLs generiert wurden, die zu lang waren, da sie die controller und action Parameter enthielten.

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
 }
}

Kommentare (4)

  1. Matthias
    Matthias am 12.02.2018
    Das ist in der Tat ein nützliches feature. Eine Frage dazu: kann man den Linkhandler auch verwenden, wenn es nicht eine sondern mehrere News Detail Seiten gibt? Beispielsweise kann man ja unterschiedliche Detailseiten je nach Kategorie festlegen. Der angegebene Wert bei:
    config.recordLinks.tx_news.typolink.parameter
    müsste dann überschrieben werden. Geht das irgendwie?
    Matthias
  2. Manuel
    Manuel am 13.02.2018
    Was du auf jeden Fall tun kannst: Mehrere Linkhandler definieren, also z.B. "News (Kategorie A)" und "News (Kategorie B)". Ob das auch dynamischer ginge (also die detailPid direkt aus der Kategorie ableiten) ist ne interessante Frage. Würde mich auch interessieren. Falls du es rausfindest, dann gerne hier in die Kommentare deine Lösung rein.
  3. Matthias
    Matthias am 05.03.2018
    habe diesen Link gefunden:
    https://stackoverflow.com/questions/46674256/news-linkhandler-typo-8-and-detailpage-from-category
    Scheint also eher schwierig bis unmöglich zu sein.
    Frage zu deiner Lösung: mehrere Linkhandler definieren? Wie würde das denn gehen?
  4. Matthias
    Matthias am 06.03.2018
    geht doch:
    config.recordLinks.tx_news {
    typolink {
    parameter.stdWrap.cObject = CONTENT
    parameter.stdWrap.cObject {
    table = sys_category
    select {
    pidInList = 100
    # pid der Kategorien
    max = 1
    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 = |
    }
    additionalParams.data = field:uid
    additionalParams.wrap = &tx_news_pi1[news]=|
    useCacheHash = 1
    }
    }
    Lösung von hier: https://www.clickstorm.de/blog/linkhandler-typo3/

Neuen Kommentar schreiben