Je souhaite rendre un lien de type en fluide, mais je dois vérifier s'il s'agit d'un fichier à télécharger (t3: // file? uid = 1), d'un lien de page (t3: // page? uid = 1) ou un lien externe ( https://www.abc.de _blank). Y a-t-il un moyen ou un viewhelper pour vérifier le type de lien dans le fluide?
Ce que j'ai trouvé était uniquement via typoscript ou une manière piratée avec VHS comme
<f:if condition="{target -> v:math.round()} > 0">
C'est pour TYPO3 9. x
3 Réponses :
$linkService = $this->objectManager->get(LinkService::class); $result = $linkService->resolve($linkValue); That could help you in a custom ViewHelperPossible Values for $linkValue: t3://page?uid=1 => [string (pageuid), 'page'] info@example.com => [string (email), 'email'] https://typo3.org => [string (url), 'url'] t3://file?uid=226 => [TYPO3\CMS\Core\Resource\File, 'file'] $result returns an array. Every case has the argument "type". Depending on the type, another value or object is returned. I have listed this above.The class is available from TYPO3 Version 8.
Pourriez-vous s'il vous plaît ajouter quelques exemples de $ linkValue possible et leur sortie correspondante dans $ result ? Merci
Si $ linkValue est un fichier et a des arguments supplémentaires comme _blank, ce code appellera une exception. Exemple t3: // file? Uid = 226 _blank . Ma solution de contournement pour cela consiste à exploser la chaîne et à prendre le premier élément du tableau
Vous pouvez également vérifier le type de lien avec l'extension vhs, par exemple pour définir une autre cible:
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
...
<f:variable name="target">_self</f:variable>
<v:condition.string.contains haystack="{url}" needle="t3://file?uid">
<f:variable name="target">_blank</f:variable>
</v:condition.string.contains>
<v:condition.string.contains haystack="{url}" needle="http">
<f:variable name="target">_blank</f:variable>
</v:condition.string.contains>
<v:condition.string.contains haystack="{url}" needle="www">
<f:variable name="target">_blank</f:variable>
</v:condition.string.contains>
<f:link.typolink parameter="{url}" target="{target}">the link</f:link.typolink>
Voici le ViewHelper que j'utilise actuellement:
/**
* A view helper for rendering the linktype
*
* = Examples =
*
* <code>
* {nc:linkType(parameter: link)}
* </code>
* <output>
* page, file, url, email, folder, unknown
* </output>
*/
class LinkTypeViewHelper extends AbstractViewHelper
{
use CompileWithRenderStatic;
/**
* Initialize arguments
*/
public function initializeArguments()
{
$this->registerArgument('parameter', 'string', 'stdWrap.typolink style parameter string', true);
}
/**
* @param array $arguments
* @param \Closure $renderChildrenClosure
* @param RenderingContextInterface $renderingContext
* @return string Linktype (page, file, url, email, folder, unknown)
*/
public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
{
$parameter = $arguments['parameter'];
// workaround if parameter has _blank or other additional params
$arr = explode(' ',trim($parameter));
$firstparameter = $arr[0];
$linkService = GeneralUtility::makeInstance(LinkService::class);
$linkDetails = $linkService->resolve($firstparameter);
return $linkDetails['type'];
}
}
Pourquoi ne pas utiliser
? Cela peut gérer les 3 types.Oui, mais j'ai besoin d'une condition, car je rendrai un téléchargement différemment d'une page ou d'une page externe. f: link.typolink n'est pas une option.
Vous pouvez déjà enrichir le modèle de données par un indicateur supplémentaire. En pensant toujours à un ViewHelper en premier lieu, non seulement tend à contredire la séparation de MVC. Cela entraîne souvent plus de travail à faire, simplement parce que vous n'appliquez pas les avantages de MVC.