TYPO3 7.6 get youtube-url from youtube-media-file for custom content element with fancybox

TYPO3 7.6 get youtube-url from youtube-media-file for custom content element with fancybox

如果有人对我的问题有更好的标题,请继续更改...;-)

我在谷歌上搜索了很长时间,但要么我没有问正确的问题,要么到目前为止没有人遇到过这个问题。

我正在使用 TYPO3 7.6、fancyBox v3.0.47 (http://fancyapps.com/fancybox/) 和我自己为 image-gallery 创建的内容元素。到目前为止,一切都很好。一切正常,直到客户要求将视频文件添加到该画廊。画廊使用 fancyBox 作为灯箱,我使用如下:

<div class="imgGalleryIMG">
  <a href="/fileadmin{file.originalFile.identifier}" data-fancybox="gallery" data-caption="{file.description}">
    <f:image image="{file}" crop="{file.crop}" />
  </a>
</div>

fancybox需要link,里面的图片是预览图(可以裁剪)

这适用于图像,我可以将 <f:image image="{file}" 更改为 <f:media file="{file}" />,以便显示加载到带有 "Add media from URL" 的内容元素中的 youtube 视频,并在单击时开始播放在它上面但是这样来自 fancyBox 的灯箱不会弹出并且它保持和 preview-image.

一样小

我尝试使用不同的方法,但我被 youtube 视频卡住了。通过使用 "Add media from URL",视频将作为 youtube-file 保存到文件列表(意味着它具有 file-extension“.youtube”),并且它的标题成为文件的名称。当我使用 <f:debug> 时,我找不到真正的 link(例如 https://www.youtube.com/watch?v=WEkSYw3o5is),也找不到 youtube 视频的视频 ID(例如 WEkSYw3o5is)。如果我使用我用于图像的上述方法,我有一个 preview-image 的视频,但是当我点击它时,灯箱打开并且除了显示 youtube-video-id 之外没有其他任何东西。

第二种方法:

<div class="imgGalleryIMG">
  <f:if condition="{file.originalFile.properties.extension} == 'youtube'">
    <f:then>
      <a href="{file.originalFile.identifier}" data-type="iframe" data-fancybox="gallery" data-caption="{file.description}">
        <f:image image="{file}" />
      </a>
    </f:then>
    <f:else>
      <a href="/fileadmin{file.originalFile.identifier}" data-fancybox="gallery" data-caption="{file.description}">
        <f:image image="{file}" crop="{file.crop}" />
      </a>
    </f:else>
  </f:if>
</div>

如果我是正确的,我需要的是 link 的 link for fancybox 的 youtube 视频,如文档中所述。

我真正想要的是 youtube-video 的 display-image,点击后会在灯箱中显示(没有自动播放)。我怎样才能做到这一点?

我更喜欢仅更改模板的解决方案。

编辑

在渲染和 fancybox 发挥其魔力之后使用第一种方法,结果如下所示:

<div class="fancybox-container fancybox-show-controls fancybox-show-infobar fancybox-show-buttons fancybox-container--ready fancybox-controls--canzoomIn" role="dialog" tabindex="-1" id="fancybox-container-1" style="">
  ...
  <div class="fancybox-slider-wrap">
    <div class="fancybox-slider" style="transform: translate(0px, 0px);">
      <div class="fancybox-slide fancybox-slide--current fancybox-slide--image fancybox-slide--complete" style="transform: translate(0px, 0px);">
        <div class="fancybox-placeholder" style="transform: translate(512px, 131px) scale(1, 1); width: 1024px; height: 767.94px; opacity: 1; transition: none;">
          <img class="fancybox-image" src="/fileadmin/user_upload/pathToImg.jpg">
        </div>
      </div>
    </div>
  ...
  </div>
... 
</div>

这是灯箱代码。在我的第一种方法中,image-src 是从图像周围的 link 中获取的(而不是从 image-file 中获取)。这就是为什么我想用流体将 youtube-url 或 youtube-id 放入我的部分。


解决方案

感谢 minifranske,我找到了一个简单的方法:

<f:if condition="{file.originalFile.properties.extension} == 'youtube'">
  <f:then>
    <a href="https://www.youtube.com/embed/{file.contents}" data-type="iframe" 
data-fancybox="gallery" data-caption="{file.description}">
      <f:image image="{file}" />
    </a>
  </f:then>

非常感谢! :)

首先,我想解释一下,如果将 YouTube 视频添加到 TYPO3 媒体列表中,究竟会发生什么。 TYPO3 将存储视频 ID,并且仅在它创建的 .youtube 文件中存储视频 ID。它将在向此 ID 添加 iFrame 和 URL 的渲染器中使用此视频 ID。所有这些都发生在 f:media ViewHelper 中。相应的渲染器位于 TYPO3\CMS\Core\Resource\Rendering\YouTubeRenderer。 现在,如果 imo 不付出一点努力,你想要实现的目标是不可能的。 您需要为缩略图添加一个额外的图像字段,因此您可以这样做,例如:

<f:if condition="{youtubeFile}">
    <div class="yt-facybox">
        <a class="facybox" href="#yt-iframe">
            <f:media file="{youtubeThumbnailFile}" />
        </a>
        <div style="display: none" id="yt-iframe">
            <f:media file="{youtubeFile}" width="600" height="530" />
        </div>
    </div>
</f:if>

这样您的 fancybox 将只打开隐藏的 iFrame 容器。 iFrame的宽高可以通过ViewHelper的width和height属性来调整。

获取URL:{file.publicUrl} 要获取 YouTube ID:{file.contents}