Typo3 检查油液中的类型3连杆类型

Typo3 检查油液中的类型3连杆类型,typo3,fluid,typo3-9.x,Typo3,Fluid,Typo3 9.x,我想在fluid中呈现一个键入链接,但我需要检查它是下载文件(t3://file?uid=1)、页面链接(t3://page?uid=1)还是外部链接(_blank)。 是否有方法或viewhelper检查流体中的链接类型 我所发现的只是通过打字或类似VHS的黑客方式 <f:if condition="{target -> v:math.round()} > 0"> 这是打字9.x版的 $linkService = $this->objectManager-&

我想在fluid中呈现一个键入链接,但我需要检查它是下载文件(t3://file?uid=1)、页面链接(t3://page?uid=1)还是外部链接(_blank)。 是否有方法或viewhelper检查流体中的链接类型

我所发现的只是通过打字或类似VHS的黑客方式

<f:if condition="{target -> v:math.round()} > 0">

这是打字9.x版的

$linkService = $this->objectManager->get(LinkService::class);
$result = $linkService->resolve($linkValue);
这可以在自定义ViewHelper中帮助您

$linkValue
的可能值:

  • t3://page?uid=1
    =>[字符串(pageuid),'page']
  • info@example.com
    =>[字符串(电子邮件),“电子邮件”]
  • https://typo3.org
    =>[字符串(url),'url']
  • t3://file?uid=226
    =>[TYPO3\CMS\Core\Resource\file,'file']
$result
返回一个数组。每个案例都有一个参数“type”。根据类型,将返回另一个值或对象。我在上面列出了这个


该类可从TYPO3版本8获得。

您也可以使用vhs扩展检查链接类型,例如设置不同的目标:

{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>
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
...
_自我
_空白
_空白
_空白
链接

这是我现在使用的ViewHelper:

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

    }
}

为什么不使用
?这可以处理所有3种类型。是的,但我需要一个条件,因为我将以不同于页面或外部页面的方式呈现下载。f:link.typolink不是选项。您可以通过附加标志来丰富数据模型。总是把ViewHelper放在首位,这不仅与MVC的分离相矛盾。由于没有应用MVC的优点,它通常也会导致更多的工作要做。请您在
$result
中为可能的
$linkValue
及其相应的输出添加一些示例,好吗?THXI如果$linkValue是一个文件,并且具有其他参数,如_blank,则此代码将调用异常。示例
t3://file?uid=226\u blank
。我的解决方法是分解修剪字符串并获取数组中的第一项