Это PHP или Joomla!вопрос?(или, возможно, я что-то упускаю из буферизации вывода) - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь интегрировать VideoJS в плагин для отображения видео в блоге и просмотра / макета статьи. Прежде всего, я нахожу тэг плагина с использованием регулярного выражения и источника для видео, которым может быть идентификатор видео YouTube или путь к видеофайлу:

Источник видео YouTube: {youtube} y0u7u83v1de0 {/ youtube} Видеофайл источник: {video} path / to / video.mp4 {/ video}

Поиск этих значений не является проблемой, проблема возникает при попытке повторить источник видео. Я использую объект stdClass для хранения значений в функции onContentBeforeDisplay:

$width = 636; 
$height = 333; 
$youtubeCode = '/{youtube}(.*?){\/youtube}/'; 
$videoCode = '/{video}(.*?){\/video}/'; 
preg_match($youtubeCode, $article->introtext, $match); 
preg_match($videoCode, $article->introtext, $match); 
$video = new stdClass(); 
$video->source = $match[1]; 
$video->width = $width; 
$video->height = $height; 
$layout = JPATH_SITE . DS . 'plugins' . DS . $this->plugin->type . 
DS . $this->plugin->name . DS . 'tmpl' . DS . 'default.php'; 

if ($layout) { 
    ob_start(); 
    require $layout; 
    $contents = ob_get_contents(); 
    ob_end_clean(); 
    $article->introtext = $contents . $article->introtext; 
}

Теперь файл макета просто выводит HTML-тег видео с соответствующие значения:

<video id="<?= $video->id ?>" class="video-js vjs-default-skin" controls width="<?= $video->width ?>" height="<?= $video->height ?>" poster="<?= $video->images['preview'] ?>" data-setup="{techOrder: ['youtube', 'html5']}">
    <source src="<?= $video->source ?>" type="<?= $video->format ?>" /> 
</video>

Все значения отображаются правильно, кроме свойства $ video-> source, которое до запуска буферизации вывода по-прежнему имеет правильное значение, но похоже, что запуск вывода обнуляет это конкретное значение.

Что может быть причиной такого поведения? Что-то в буфере вывода, которое я мог бы пропустить?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 февраля 2012

Я не знаю VideoJS, и я не знаю, что вы пытаетесь точно , но из того, что я вижу, установите $ video-> source значение $ match [1], но вы тестируете обычное Выражение сначала для поиска по тегу {youtube}, а затем для поиска по тегу {video}, но вы используете ту же переменную $ match и не проверяете, является ли то, что вы (в конечном итоге) нашли (видео на YouTube или «нормальное») видео?).

Из того, что я вижу, вы получаете доступ к $ video-> format в файле макета, но не устанавливаете его.

Может быть, вы должны написать что-то как это

[...]
if ( preg_match($youtubeCode, $article->introtext, $match) ) {
    // found a {youtube} tag
    $video->format = "youtube";
    $video->source = $match[1];
} else if ( preg_match($videoCode, $article->introtext, $match) ) {
    // found a {video} tag
    $video->format = "video";
    $video->source = $match[1];
}

// Prepend the <video> element if {youtube} or {video} tag found
if ( $layout && !is_null($video->format) && !is_null($video->format) ) { 
    ob_start(); 
    require $layout; 
    $contents = ob_get_contents(); 
    ob_end_clean(); 
    $article->introtext = $contents . $article->introtext; 
}

Но, пожалуйста, обратите внимание, поскольку он должен заменить только первый найденный тег, если у вас есть статья с несколькими тегами {youtube} / {video}, она не должна работать.

Надеюсь, я хорошо понял, что вы пытаетесь сделать: P

...