我在Silversstripe(3.1)中为一个客户开发了一个站点。今天,他试图将第二个youtube视频嵌入CMS的内容区域(从网络插入媒体>粘贴youtube URL>添加URL>插入)。
在CMS中的所见即所得中,视频的缩略图会正确显示,但在前端的模板中,第一个视频会在第二个视频的iFrame中重复。
我试着改变这些,删除两个视频,然后自己重新添加,以消除一些反常的用户错误,但我每次都可以复制。第一个视频始终克隆在第二个视频的iFrame中。
我也尝试过用YouTube上的嵌入代码直接嵌入视频,但也遇到了同样的问题。
检查iFrame,第二个视频的src与第一个视频的相同,所以我认为这与嵌入替换模板中文本的方式有关。
有办法解决这个问题吗?
我不知道你是否想走这条路,但我有多个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>