1
votes

Vérifier le type de liaison TYPO3 dans le fluide

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 commentaires

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.


3 Réponses :


3
votes
$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.

2 commentaires

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



1
votes

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>


0 commentaires

1
votes

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'];

    }
}


0 commentaires