首页 > 解决方案 > 如何在 TYPO3 的 YouTube iframe 标签中用 data-src 替换 src?

问题描述

为了使用“Klaro!Consent Manager”,我需要稍微修改 iframe-tag,当您嵌入带有 textmedia 元素的 YouTube 视频时,TYPO3 会自动生成该标签。

它在/typo3/sysext/core/Classes/Resource/Rendering/YouTubeRenderer.php中生成

public function render(FileInterface $file, $width, $height, array $options = [], $usedPathsRelativeToCurrentScript = false)
{
    $options = $this->collectOptions($options, $file);
    $src = $this->createYouTubeUrl($options, $file);
    $attributes = $this->collectIframeAttributes($width, $height, $options);

    return sprintf(
        '<iframe src="%s"%s></iframe>',
        htmlspecialchars($src, ENT_QUOTES | ENT_HTML5),
        empty($attributes) ? '' : ' ' . $this->implodeAttributes($attributes)
    );
}

我已经有一个 user_site 扩展来配置系统和编辑模板,但没有任何 php 类。看起来我不能在这里覆盖一个流体模板。我是集成商,而不是扩展开发人员,我想知道如何在不更改或复制太多核心功能的情况下相应地覆盖或扩展此功能。

我该如何<iframe src=替换<iframe data-name="youtube" data-src=

标签: typo3typo3-9.xtypo3-8.xtypo3-extensions

解决方案


感谢 nstungcom 的评论,我在扩展media2click中找到了很好的示例,并且能够使用其中的片段修改 iFrame 标签。由于我不是扩展开发人员,因此在得到开发人员确认之前,应谨慎使用此解决方案。非常感谢您提出改进建议。

我对我的站点包(“user_site”扩展名)进行了以下更改/添加:

/ext/user_site/Classes/Resource/Rendering/YouTubeRenderer.php

<?php
namespace MyVendorName\UserSite\Resource\Rendering;

use TYPO3\CMS\Core\Core\Environment;
use TYPO3\CMS\Core\Resource\FileInterface;
use TYPO3\CMS\Core\Resource\FileReference;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;

class YouTubeRenderer extends \TYPO3\CMS\Core\Resource\Rendering\YouTubeRenderer
{
    public function getPriority()
    {
        return 25;
    }

    public function render(FileInterface $file, $width, $height, array $options = [], $usedPathsRelativeToCurrentScript = false)
    {
        $options = $this->collectOptions($options, $file);
        $iframe = str_replace(' src="', ' src="" data-name="youtube" data-src="', parent::render($file, $width, $height, $options, $usedPathsRelativeToCurrentScript));
        return $iframe;
    }
}

我不确定所有这些 use 语句和 getPriority 函数是否真的有必要。

/ext/user_site/ext_localconf.php

<?php
defined('TYPO3_MODE') or die();

call_user_func(function () {
    $rendererRegistry = \TYPO3\CMS\Core\Resource\Rendering\RendererRegistry::getInstance();
    $rendererRegistry->registerRendererClass(\MyVendorName\UserSite\Resource\Rendering\YouTubeRenderer::class);
});

不知道这是不是所谓的XCLASS。语法看起来与我在Api中找到的示例不同。

/ext/user_site/ext_emconf.php

<?php
$EM_CONF[$_EXTKEY] = [
    'title' => 'Project specific configuration and templates',
    // [...]
    'autoload' => [
        'psr-4' => [
            'MyVendorName\\UserSite\\' => 'Classes',
        ],
    ],
];

显然它需要这个自动加载,不管是为了什么。


推荐阅读