1

TYPO3 8.7 的新 LinkHandler 是否有任何挂钩来处理链接?

在旧的 LinkHandler 扩展上可以定义一个钩子来处理我们想要的链接。我需要根据一些规则覆盖typolink的参数。有没有办法在我的扩展上做到这一点?

4

1 回答 1

2

有多个要点可以挂钩。

TypoLink 后处理
您可以挂钩到 TypoLink 后处理以在呈现之前修改 TypoLink 本身。

为此,您首先在 ext_tables/ext_localconf 中注册您的自定义类:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_content.php']['typoLink_PostProc'][] = 'Vendor\\Name\\Service\\TypoLinkProcessingService->postProcessTypoLink';

然后,在您的TypoLinkProcessingService类中(当然,使用您选择的名称),您将在自己的方法中处理它。出于可视化目的,在此示例中,如果 URL 是指向 youtube 视频的链接,我将更改它,以便在最后关闭“相关视频”,并修改 youtube 播放器内部控件使用的颜色。

public function postProcessTypoLink(&$parameters, ContentObjectRenderer &$parentObject)
{
    if (isset($parameters['finalTagParts']['url'])) {
        $urlParts = parse_url($parameters['finalTagParts']['url']);
        if (stristr($urlParts['host'], 'youtube.com') !== false && stristr($urlParts['path'], 'watch') !== false) {
            $parameters['finalTag'] = str_replace(
                '"' . htmlspecialchars($parameters['finalTagParts']['url']) . '"',
                '"' . htmlspecialchars($parameters['finalTagParts']['url'] . '&rel=0&color=ffffff') . '"',
                $parameters['finalTag']
            );
        }
    }
}

TypoLink UserFunc
另一种选择是利用userFunc和调整链接。

为此,您配置链接处理程序配置 (PageTS) 以userFunc在内部提供typolink. 根据需要添加 TypoScript,以便稍后获取配置的数据。

config.recordLinks {
    tx_myest {
        typolink {
            userFunc = Vendor\Name\UserFunc\TypolinkUserFunc->parseLinkHandlerTypolink
            userFunc {
                newsUid = TEXT
                newsUid.data = field:uid

                newsClass = TEXT
                newsClass.data = parameters:class

                defaultDetailPid = 53
            }
        }
    }
}

在您的parseLinkHandlerTypolink方法中,您可以访问配置的属性并根据需要进行调整:

class TypolinkUserFunc
{
    /**
     * @var \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
     * @inject
     */
    public $cObj;

    /**
     * Add a method description here
     *
     * @param array $content
     * @param array $configuration
     * @return string
     */
    public function parseNewsLinkHandlerTypolink(array $content, array $configuration)
    {
        if (!$configuration['newsUid']) {
             return;
        }

        $params = $this->cObj->cObjGetSingle($configuration['newsClass'], $configuration['newsClass.']);
        $newsUid = (int)$this->cObj->cObjGetSingle($configuration['newsUid'], $configuration['newsUid.']);

        // ... your code goes here ...

        $url = $this->cObj->typolink('', $typolink);
        return '<a href="' . $url . '" ' . $attributes . '>';
    }
}

或者,8.6 中引入的这个钩子也可以帮助你:https ://docs.typo3.org/typo3cms/extensions/core/Changelog/8.6/Feature-79121-ImplementHookInTypolinkForModificationOfPageParams.html

于 2017-09-01T13:15:14.520 回答