【问题标题】:Check TYPO3 link type in fluid检查流体中的 TYPO3 链接类型
【发布时间】:2019-01-04 15:56:36
【问题描述】:

我想以流畅的方式呈现错字链接,但我需要检查它是下载文件 (t3://file?uid=1)、页面链接 (t3://page?uid=1) 还是外部链接 (https://www.abc.de _blank)。 有没有办法或 viewhelper 来检查流体中的链接类型?

我发现的只是打字稿或 VHS 之类的 hacky 方式

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

适用于 TYPO3 9.x

【问题讨论】:

  • 为什么不使用&lt;f:link.typolink parameter="..."&gt;?这可以处理所有 3 种类型。
  • 是的,但我需要一个条件,因为我会以不同于页面或外部页面的方式呈现下载。 f:link.typolink 是没有选择的。
  • 您已经可以通过附加标志来丰富数据模型。总是首先考虑 ViewHelper,不仅倾向于与 MVC 的分离相矛盾。仅仅因为没有应用 MVC 的优点,它通常也会导致更多的工作要做。

标签: typo3 fluid typo3-9.x


【解决方案1】:
$linkService = $this->objectManager->get(LinkService::class);
$result = $linkService->resolve($linkValue);

这可以帮助您自定义 ViewHelper

$linkValue 的可能值:

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

$result 返回一个数组。每个案例都有参数“类型”。根据类型,返回另一个值或对象。我已经在上面列出了。

该课程从 TYPO3 版本 8 开始提供。

【讨论】:

  • 您能否为可能的$linkValue 及其在$result 中的相应输出添加一些示例?谢谢
  • 如果 $linkValue 是一个文件并且具有像 _blank 这样的附加参数,则此代码将调用异常。示例t3://file?uid=226 _blank。我的解决方法是爆炸修剪字符串并获取数组中的第一项
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2015-08-10
      • 2020-06-09
      相关资源
      最近更新 更多