Как заменить src на data-src в теге iframe YouTube в TYPO3?

Чтобы использовать Klaro! Диспетчер согласия Мне нужно немного изменить тег iframe, который автоматически генерируется TYPO3, когда вы встраиваете видео YouTube с элементом textmedia.

Он создается в /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=?


person Ben    schedule 06.08.2020    source источник
comment
Вы можете взглянуть на расширение media2click или использовать его: media2click репозиторий Github.   -  person nstungcom    schedule 06.08.2020
comment
Если вы используете это расширение, вы можете передать свое имя-данных через параметр additionalConfig или additionalAttributes в f: media ViewHelper.   -  person Jonas Eberle    schedule 06.08.2020
comment
Спасибо. Расширение media2click - отличный пример. Я только что посмотрел на него и думаю, что смогу заставить свою работу, если буду использовать это как руководство. Затем я опубликую свое решение, насколько оно работает.   -  person Ben    schedule 06.08.2020


Ответы (1)


Благодаря комментарию от 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',
        ],
    ],
];

Видимо ему нужна была эта автозагрузка, что бы там ни было.

person Ben    schedule 07.08.2020