是否有Fluid viewperper来截断URL?如果没有,我该怎么做?

时间:2013-12-10 16:11:59

标签: typo3 fluid view-helpers typo3-6.1.x

在TYPO3的Fluid或Fedext / vhs中,是否有可以转换的viewhelper

http://www.stackoverflow.com/questions/ask

www.stackoverflow.com

PS:这就是目标:

<f:format.raw><f:link.external uri="{item.link}">{item.just-display-the-domain}</f:link.external></f:format.raw>

编辑(根据我得到的答案调整问题):如果我必须构建自定义视图助手,我该如何处理?

3 个答案:

答案 0 :(得分:2)

我真的怀疑是否有任何明智的理由将这种VH添加到核心中,事实上,编写自定义VH就像小菜一碟(当你最终意识到它时)这样简单的格式化程序可以通过他们的自定义工具中的开发人员只需几分钟即可完成。

IE中。在TYPO3 4.x中假设您有一个带有键urs的自定义扩展程序,您需要创建一个适当的类,包含render($params)方法并扩展Tx_Fluid_Core_ViewHelper_AbstractViewHelper类:

/typo3conf/ext/urs/Classes/ViewHelpers/GetDomainViewHelper.php

<?php
class Tx_Urs_ViewHelpers_GetDomainViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {

    /**
     * @param $link string Each `allowed` param need to have its line in PHPDoc
     * @return string
     */
    public function render($link) {
        $link = str_replace('http://', '', $link);
        $link = str_replace('https://', '', $link);
        $segments = explode('/', $link);
        return trim($segments[0]);
    }
}
?>

接下来在你的模板中声明它的命名空间......就是这样,你可以使用它:

{namespace urs=Tx_Urs_ViewHelpers}

<urs:getDomain link="http://stackoverflow.com/questions/20499453" />

特别注意Tx_Urs_ViewHelpers...

等字母案例

http://docs.typo3.org/typo3cms/ExtbaseFluidBook/8-Fluid/8-developing-a-custom-viewhelper.html

中的更多详情

在TYPO3版本中6.x的

事情有点类似,主要的变化当然是新的命名空间

/typo3conf/ext/urs/Classes/ViewHelpers/GetDomainViewHelper.php

<?php
namespace TYPO3\Urs\ViewHelpers;

class GetDomainViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {

    /**
     * @param $link string Each `allowed` param need to have its line in PHPDoc
     * @return string
     */
    public function render($link) {
        $link = str_replace('http://', '', $link);
        $link = str_replace('https://', '', $link);
        $segments = explode('/', $link);
        return trim($segments[0]);
    }
}

在模板中:

{namespace urs=TYPO3\Urs\ViewHelpers}

<urs:getDomain link="http://stackoverflow.com/questions/20499453" />

当然,在这两种情况下,您都将使用:

而不是使用硬编码链接
<urs:getDomain link="{item.link}" />

答案 1 :(得分:1)

这有点麻烦且效率不高,但它应该可以工作,当然可以避免需要自定义的ViewHelper类:

With protocol:
{url -> v:iterator.explode(glue: '/') -> v:iterator.slice(length: 3) -> v:iterator.implode(glue: '/')}
Without protocol:
{url -> v:iterator.explode(glue: '/') -> v:iterator.slice(start: 2, length: 1) -> v:iterator.first()}

{url}可以来自任何地方,只要它包含完整的http://或其他协议前缀。上面的行当然会将URL分解为由/分隔的部分,然后切掉前三个段并使用/重新连接。或者它只是选择偏移2(这将是没有协议的完整域)并返回该单个元素。结果应该是链接域的URL,有或没有协议,没有尾部斜杠(在切割URL后你可能想要或不想自己添加)。

干杯, 克劳斯

答案 2 :(得分:0)

所有ViewHelper都位于typo3/sysext/fluid/Classess/ViewHelper。每个文件的标题中也有示例。可以在website上查看Fedext的所有ViewHelper。