如何在 TYPO3 的 YouTube iframe 标签中用 data-src 替换 src?

How to replace src with data-src in TYPO3's YouTube iframe tag?

为了使用“Klaro! Consent Manager”,我需要稍微修改 iframe 标签,当您嵌入带有文本媒体元素的 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=

感谢 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);
});

我不知道这是否是一个 so-called XCLASS。语法看起来与我在 Api.

中找到的示例不同

/ext/user_site/ext_emconf.php

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

显然它需要这个自动加载,不管它是干什么用的。