在Fluid中检查TYPO3链接类型

3
我想在Fluid中呈现一个typolink,但我需要检查它是下载文件(t3:// file?uid = 1),页面链接(t3:// page?uid = 1)还是外部链接(https://www.abc.de _blank)。 有没有一种方法或视图助手可以在Fluid中检查链接类型?
我找到的只有通过typoscript或使用VHS的hacky方法。
<f:if condition="{target -> v:math.round()} > 0">

这是针对 TYPO3 9.x 的。


为什么不使用<f:link.typolink parameter="...">?这个标签可以处理所有3种类型。 - Rudy Gnodde
是的,但我需要一个条件,因为我将以不同于页面或外部页面的方式呈现下载。f:link.typolink不是选项。 - kimomat
你可以通过添加一个额外的标志来丰富数据模型。总是首先考虑ViewHelper,不仅会违背MVC的分离原则,而且通常会因为没有应用MVC的优势而导致更多的工作要做。 - Blcknx
3个回答

3
$linkService = $this->objectManager->get(LinkService::class);
$result = $linkService->resolve($linkValue);

这可以帮助您在自定义ViewHelper中使用:

$linkValue的可能值:

  • t3://page?uid=1 => [字符串(页面uid),'page']
  • info@example.com => [字符串(电子邮件),'email']
  • https://typo3.org => [字符串(URL),'url']
  • t3://file?uid=226 => [TYPO3\CMS\Core\Resource\File,'file']

$result返回一个数组。每种情况都有参数“type”。根据类型,将返回另一个值或对象。我已经列出了上面的内容。

该类从TYPO3版本8开始提供。


请问您能否为可能的$linkValue添加一些示例,并提供相应的$result输出?谢谢。 - Oliver Hader
1
如果$linkValue是一个文件并且有额外的参数,比如_blank,那么这段代码将会调用一个异常。例如t3://file?uid=226 _blank。我的解决方法是将字符串分割并去除空格,然后取数组中的第一个项目。 - kimomat

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

您还可以使用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>

1

这是我现在使用的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'];

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接