Как заменить sr c на data-sr c в теге iframe YouTube в TYPO3? - PullRequest
0 голосов
/ 06 августа 2020

Чтобы использовать «Klaro! Consent Manager», мне нужно немного изменить тег 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=?

1 Ответ

0 голосов
/ 07 августа 2020

Благодаря комментарию от nstungcom я нашел хорошие образцы в расширении media2click и смог изменить тег iFrame с его фрагментами. Поскольку я не являюсь разработчиком расширений, это решение следует использовать с осторожностью , пока разработчик не подтвердит его. Приветствуются предложения по улучшению.

Я внес следующие изменения / дополнения в свой пакет sitepackage (расширение «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',
        ],
    ],
];

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

...