The LinkHandler API
The LinkHandler API currently consists of 7 LinkHandler classes and the
\TYPO3\
. The
LinkHandlerInterface can be implemented to create custom LinkHandlers.
Changed in version 12.0
Due to the integration of EXT:recordlist into EXT:backend the namespace of
LinkHandlers has changed from
\TYPO3\
to
\TYPO3\
.
For TYPO3 v12 the moved classes are available as an alias under the old
namespace to allow extensions to be compatible with TYPO3 v11 and v12.
Most LinkHandlers cannot receive additional configuration, they are marked as
@internal
and contain neither hooks nor events. They are therefore
of interest to Core developers only.
Current LinkHandlers:
- The PageLinkHandler: for linking pages and content
- The RecordLinkHandler: for linking any kind of record
- UrlLinkHandler: for linking external urls
- FileLinkHandler: for linking files in the File abstraction layer (FAL)
- FolderLinkHandler: for linking to directories
- MailLinkHandler: for linking email addresses
- TelephoneLinkHandler: for linking phone numbers
Note
In the system extension core
there are also classes ending on
"LinkHandler". However those implement the interface Link
and are part of the LinkHandling API, not the LinkHandler API.
The links are now stored in the database with the syntax
<a href="t3://
.
-
TypoScript is used to generate the actual link in the frontend.
config.recordLinks.anIdentifier { // Do not force link generation when the record is hidden forceLink = 0 typolink { parameter = 123 additionalParams.data = field:uid additionalParams.wrap = &tx_example_pi1[item]=|&tx_example_pi1[controller]=Item&tx_example_pi1[action]=show } }
Copied!Attention
Do not change the identifier after links have been created using the LinkHandler. The identifier will be stored as part of the link in the database.
LinkHandler page TSconfig options
The minimal page TSconfig configuration is:
TCEMAIN.linkHandler.anIdentifier {
handler = TYPO3\CMS\Backend\LinkHandler\RecordLinkHandler
label = LLL:EXT:extension/Resources/Private/Language/locallang.xlf:link.customTab
configuration {
table = tx_example_domain_model_item
}
}
See Link handler configuration for all available options.
Example: news records from one storage pid
The following configuration hides the page tree and shows news records only from the defined storage page:
TCEMAIN.linkHandler.news {
handler = TYPO3\CMS\Backend\LinkHandler\RecordLinkHandler
label = News
configuration {
table = tx_news_domain_model_news
storagePid = 123
hidePageTree = 1
}
displayAfter = email
}
It is possible to have another configuration using another storagePid which also contains news records.
This configuration shows a reduced page tree starting at page with uid 42:
TCEMAIN.linkHandler.bookreports {
handler = TYPO3\CMS\Backend\LinkHandler\RecordLinkHandler
label = Book Reports
configuration {
table = tx_news_domain_model_news
storagePid = 42
pageTreeMountPoints = 42
hidePageTree = 0
}
}
The page TSconfig of the LinkHandler is being used in sysext backend
in class \TYPO3\
which does not contain Hooks.
Attention
It is important, that the storage
is hard coded in TSConfig, because using
constants, for example from the site configuration, will not work here.
LinkHandler TypoScript options
A configuration could look like this:
config.recordLinks.anIdentifier {
forceLink = 0
typolink {
parameter = 123
additionalParams.data = field:uid
additionalParams.wrap = &tx_example_pi1[item]=|
}
}
The TypoScript Configuration of the LinkHandler is being used in sysext frontend
in class \TYPO3\
.
Example: news records displayed on fixed detail page
The following displays the link to the news on a detail page:
config.recordLinks.news {
typolink {
parameter = 123
additionalParams.data = field:uid
additionalParams.wrap = &tx_news_pi1[controller]=News&tx_news_pi1[action]=detail&tx_news_pi1[news]=|
}
}
Once more if the book reports that are also saved as tx_
record should be displayed on their own
detail page you can do it like this:
config.recordLinks.bookreports {
typolink {
parameter = 987
additionalParams.data = field:uid
additionalParams.wrap = &tx_news_pi1[controller]=News&tx_news_pi1[action]=detail&tx_news_pi1[news]=|
}
}