typo3 - 如何在 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=
?
解决方案
感谢 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',
],
],
];
显然它需要这个自动加载,不管是为了什么。
推荐阅读
- java - 将画布转换为位图
- java - MouseInfo.getPointerInfo() 不能与 Spring 一起使用
- websocket - 查尔斯的WebSoket
- python - 尝试除了递归或while循环?
- azure - 删除 b2c 自定义策略上的密码过期
- r - 将字符转换为数字向量
- php - SilverStripe DropdownField 默认值设置为空白
- android - 通知栏导致 DrawerLayout 和 Activity 出现问题
- ignite - 服务器关闭时如何阻止客户端重新连接到服务器?
- php - 过滤 WordPress next_post_link_() 和 previous_post_link() 函数