Typoscript:如何向 RTE 中的所有链接添加参数?

Typoscript: how do I add a parameter to all links in the RTE?

我想给用户在 RTE 中输入的 alllink 添加一个参数。

我最初的想法是这样做的:

lib.parseFunc_RTE.tags.link {
    typolink.parameter.append = TEXT
    typolink.parameter.append.value = ?flavor=lemon
}

例如:

http://domain.com/mypage.php

变成

http://domain.com/mypage.php?flavor=lemon

这听起来不错——只要 link 没有 已经 有一个查询字符串! 在那种情况下,我显然在 URL

中得到了两个问号

例如:

http://domain.com/prefs.php?id=1234&unit=moon&qty=300

变成

http://domain.com/prefs.php?id=1234&unit=moon&qty=300?flavor=lemon

有什么方法可以根据 URL 是否已经有查询字符串来使用正确的语法添加我的参数?谢谢!

测试是否出现“?”字符已经在 URL 中并附加“?”或“和”,然后附加您的键值对。有一个 CASE object available in the TypoScript Reference,其中有一个示例,您可以根据自己的目的进行修改。

这就是解决方案:

lib.parseFunc_RTE.tags.link {
    typolink.additionalParams = &flavor=lemon
}

请注意,它必须以 & 开头,错别字会生成有效的 link。 link 中的参数如果配置相应,也将使用 realURL 进行解析。

编辑:如文档 https://docs.typo3.org/typo3cms/TyposcriptReference/Functions/Typolink/Index.html

中所述,上述解决方案仅适用于内部 links

我看到的适用于所有 link 的唯一解决方案是使用 userFunc

lib.parseFunc_RTE.tags.link {
    typolink.userFunc = user_addAdditionalParams
}

然后您需要创建一个 php 脚本并包含在您的 TS 中:

includeLibs.rteScript = path/to/yourScript.php

请记住,includeLibs 已过时,因此如果您使用的是 TYPO3 8.x(可能还有 7.3+),您将需要创建一个仅包含几个文件的自定义扩展

<?php

function user_addAdditionalParams($finalTagParts) {
    // modify the url in $finalTagParts['url']
    // $finalTagParts['TYPE'] is an indication of link-kind: mailto, url, file, page, you can use it to check if you need to append the new params
    switch ($finalTagParts['TYPE']) {
        case 'url':
        case 'file':
            $parts = explode('#', $finalTagParts['url']);
            $finalTagParts['url'] = $parts[0] 
                . (strpos($parts[0], '?') === false ? '?' : '&') 
                . 'newParam=test&newParam=test2'
                . ($parts[1] ? '#' . $parts[1] : '');
        break;
    }
    return '<a href="' . $finalTagParts['url'] . '"' .
           $finalTagParts['targetParams'] .
           $finalTagParts['aTagParams'] . '>'
}

PS:我没有测试过实际的 php 代码,所以它可能有一些错误。如果遇到问题,请尝试调试 $finalTagParts 变量

对于任何感兴趣的人,这里有一个使用 Typoscript 的 replacement 功能对我有用的解决方案。希望这有帮助。

lib.parseFunc_RTE.tags.link {

    # Start by "replacing" the whole URL by itself + our string
    # For example: http://domain.com/?id=100    becomes http://domain.com/?id=100?flavor=lemon
    # For example: http://domain.com/index.html becomes http://domain.com/index.html?flavor=lemon

    typolink.parameter.stdWrap.replacement.10 {

        #this matches the whole URL
        search = #^(.*)$#i

        # this replaces it with itself () + our string
        replace =?flavor=lemon

        # in this case we want to use regular expressions
        useRegExp = 1
    }

    # After the first replacement is done, we simply replace
    # the first '?' by '?' and all others by '&'
    # the use of Option Split allow this
    typolink.parameter.stdWrap.replacement.20 {
        search = ?
        replace = ? || & || &
        useOptionSplitReplace = 1
    }

}