Implementation of a custom linktype for the link validator
The LinkValidator uses so called "linktypes" to check for different types of links, for example internal or external links.
All "linktypes" have to implement the
\TYPO3\
.
Classes implementing the Linktype
are automatically
registered, if autoconfigure
is enabled in packages/
.
Alternatively, one can manually tag a custom link type with the
linkvalidator.
tag:
# Other definitions
MyVendor\MyExtension\Linktype\MyCustomLinktype:
tags:
- name: linkvalidator.linktype
Due to the autoconfiguration, the identifier has to be provided by the
class directly, using the method get
.
When extending \TYPO3\
it is sufficient to set the $identifier
class property.
For custom naming of a linktype, the additional interface
\TYPO3\
.
can be implemented, which is also part of the default
Abstract
implementation.
The method Labelled
is used to
return the custom localized name of a linktype.
Example
Add new linktype
You can find the following example in the extension t3docs/examples.
Extend \TYPO3\
to create
a custom linktype:
<?php
/*
* This file is part of the TYPO3 CMS project. [...]
*/
namespace T3docs\Examples\LinkValidator\LinkType;
use TYPO3\CMS\Linkvalidator\Linktype\AbstractLinktype;
/**
* This class provides Check Example Links plugin implementation
*/
class ExampleLinkType extends AbstractLinktype
{
protected string $identifier = 'example';
public function checkLink($url, $softRefEntry, $reference): bool
{
$isValidUrl = false;
// TODO: Implement checkLink() method.
return $isValidUrl;
}
public function getErrorMessage($errorParams): string
{
$lang = $this->getLanguageService();
return match ($errorParams['errno'] ?? 0) {
404 => $lang->sL('LLL:EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf:list.report.pagenotfound404'),
// fall back to generic error message
default => sprintf(
$lang->sL('LLL:EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf:list.report.externalerror'),
$errorParams['errno'],
),
};
}
}
Activate the new linktype in the page tsconfig:
mod.linkvalidator {
# specify link types to be crawled
linktypes = db,file,external,example
}
The extension that provides the linktype must have a
Configuration/
file that contains either:
Or if autoconfiguration is not desired for some reason:
Override the ExternalLinktype class
A new custom class should replace
\TYPO3\
. The class inherits
existing functionality from External
, but will be registered with
the identifier "custom_external":
<?php
namespace MyVendor\NyExtension\Linktype\ExternalLinktype;
use TYPO3\CMS\Linkvalidator\LinkAnalyzer;
use TYPO3\CMS\Linkvalidator\Linktype\ExternalLinktype as LinkvalidatorExternalLinkType;
// This class inherits from ExternalLinktype,
// so it is only necessary to override some methods.
class ExternalLinktype extends LinkvalidatorExternalLinkType
{
// This class must use a different identifier because "external" is already used.
protected string $identifier = 'custom_external';
public function checkLink(
string $origUrl,
array $softRefEntry,
LinkAnalyzer $reference
): bool {
// do additional stuff here or after parent::checkLink
// ...
return parent::checkLink($origUrl, $softRefEntry, $reference);
}
public function fetchType(array $value, string $type, string $key): string
{
preg_match_all(
'/((?:http|https))(?::\\/\\/)(?:[^\\s<>]+)/i',
(string)$value['tokenValue'],
$urls,
PREG_PATTERN_ORDER
);
if (!empty($urls[0][0])) {
$type = $this->getIdentifier();
}
return $type;
}
}
Use the new linktype:
mod.linkvalidator.linktypes = db,file,custom_external
Since the identifier changes, the configuration should be copied to
mod.
, so that it will be
passed to the linktype, for example:
mod.linkvalidator.linktypesConfig.custom_external < mod.linkvalidator.linktypesConfig.external