Silverstripe。在内容区域中嵌入2个YouTube视频会在两者中显示相同的视频

时间:2015-12-14 20:54:19

标签: youtube silverstripe oembed

我在Silverstripe(3.1)中为客户开发了一个网站。今天,他尝试将第二个YouTube视频嵌入到CMS的内容区域中(从网络插入媒体>粘贴youtube网址>添加网址>插入)。

在CMS的WYSIWYG中,视频的缩略图显示正确,但在前端的模板中,第一个视频在第二个视频的iFrame中重复显示。

我已尝试更改这些内容,删除这两个视频并自行添加它们以消除一些奇怪的用户错误但我每次都可以复制它。第一个视频总是克隆在第二个视频的iFrame中。

我还尝试直接使用来自YouTube的嵌入代码嵌入视频,但这也是同样的。

检查iFrames,第二个视频的src与第一个视频的src相同,所以我认为这与嵌入替换模板上文本的方式有关。

有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:0)

我不知道你是否想要走这条路,但是我有多个YouTube视频页面使用扩展DataObject的YouTubeWidget。这将作为$ has_many添加到页面类中。看到这个要点 -

https://gist.github.com/cmcramer/60b7ff41017b4a633894

根据@wmk请求添加了我的要点的(修订)代码片段

class YouTubeEmbed extends DataObject {

    private static $db = array(
        'YouTubeTitle'     => 'Varchar(255)',
        'YouTubeId' => 'Varchar(100)',
    );

    private static $has_one = array(
        'PageWithVideo' => 'Page',
    );


    private static $summary_fields = array(
        'YouTubeTitle'                     => 'YouTube Video',
    );

    private static $default_sort = array(
        'YouTubeTitle',
    );


    private static $display_fields = array(
        'Title'             => 'YouTube Video',
        'YouTubeId'         => 'Video ID',
    );



    public function WatchOnYouTubeUrl() {
        $strUrl = "https://www.youtube.com/watch?v={$this->YouTubeId}";
        return $strUrl;
    }

    public function VideoIframe() {

        $strHtml = '<iframe width="' .
                               $this->Width . '" 
                            height="' . 
                               $this->Height . '" 
                             src="https://www.youtube.com/embed/'.
                               $this->YouTubeId . '
                               ?rel=0&autoplay=1&showinfo=0" 
                               frameborder="0"></iframe>'

        return $strHtml;
    }


}



class VideoPage extends Page {
    ...

    private static $has_many = array(
        'Webcams'   => 'YouTubeEmbed',
    );    
    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldsToTab('Root.Webcams', GridField::create(
           'Webcams',
           'Webcams',
            $this->Webcams(),
            GridFieldConfig_RecordEditor::create() 
        ));

        return $fields;
    }
}



/* In the template */
<div id="webcams">
    <% loop $Webcams %>
        <span class="webcam-block">
              $VideoIframe
              <p>$YouTubeTitle</p>
        </span><!-- .webcam-block -->
    <% end_loop %>
</div>