@@ -1166,9 +1166,14 @@ public function renderSingle($buffer=false) {
11661166 $ kaltura_url = $ this ->kalturaEmbedUrl ($ video );
11671167 if ( $ kaltura_url ) {
11681168 if ( $ nostyle ) {
1169- self ::nostyleUrl ($ video ->title , $ kaltura_url );
1169+ self ::nostyleUrl ($ video ->title , $ this -> kalturaTabUrl ( $ video ) );
11701170 } else {
1171- $ this ->renderKalturaOverlay ($ video ->title , $ kaltura_url , false );
1171+ $ this ->renderKalturaOverlay (
1172+ $ video ->title ,
1173+ $ kaltura_url ,
1174+ false ,
1175+ $ this ->kalturaTabUrl ($ video )
1176+ );
11721177 }
11731178 } else if ( is_string ($ media_file ) && is_string ($ media_base ) && is_string ($ media_folder ) &&
11741179 file_exists ($ media_folder . '/ ' . $ media_file ) ) {
@@ -2744,15 +2749,15 @@ private function renderItemText($item) {
27442749 }
27452750
27462751 /**
2747- * Build a Kaltura embed URL from lessons.json kaltura_id + kaltura_embed extension .
2748- * The extension template must include a literal {id} placeholder.
2752+ * Expand a Kaltura URL template extension with lessons.json kaltura_id.
2753+ * The template must include a literal {id} placeholder.
27492754 *
2750- * @return string|null Absolute embed URL, or null if unavailable
2755+ * @return string|null Absolute URL, or null if unavailable
27512756 */
2752- private function kalturaEmbedUrl ($ item ) {
2757+ private function kalturaUrlFromExtension ($ item, $ extension_key ) {
27532758 global $ CFG ;
27542759 $ kaltura_id = isset ($ item ->kaltura_id ) ? $ item ->kaltura_id : null ;
2755- $ template = $ CFG ->getExtension (' kaltura_embed ' , null );
2760+ $ template = $ CFG ->getExtension ($ extension_key , null );
27562761 if ( !is_string ($ kaltura_id ) || $ kaltura_id === '' ) {
27572762 return null ;
27582763 }
@@ -2762,25 +2767,52 @@ private function kalturaEmbedUrl($item) {
27622767 return str_replace ('{id} ' , $ kaltura_id , $ template );
27632768 }
27642769
2770+ /**
2771+ * Build a Kaltura iframe embed URL (kaltura_embed extension).
2772+ *
2773+ * @return string|null Absolute embed URL, or null if unavailable
2774+ */
2775+ private function kalturaEmbedUrl ($ item ) {
2776+ return $ this ->kalturaUrlFromExtension ($ item , 'kaltura_embed ' );
2777+ }
2778+
2779+ /**
2780+ * Build a Kaltura "open in new tab" URL (kaltura_tab playlist template).
2781+ * Falls back to the embed URL when kaltura_tab is not set.
2782+ *
2783+ * @return string|null Absolute tab URL, or null if unavailable
2784+ */
2785+ private function kalturaTabUrl ($ item ) {
2786+ $ tab = $ this ->kalturaUrlFromExtension ($ item , 'kaltura_tab ' );
2787+ if ( $ tab !== null ) {
2788+ return $ tab ;
2789+ }
2790+ return $ this ->kalturaEmbedUrl ($ item );
2791+ }
2792+
27652793 /**
27662794 * Canvas-style Kaltura modal: title bar link (open in new window) + iframe embed.
27672795 */
2768- private function renderKalturaOverlay ($ title , $ embed_url , $ with_icon =true ) {
2796+ private function renderKalturaOverlay ($ title , $ embed_url , $ with_icon =true , $ tab_url = null ) {
27692797 static $ kaltura_no = 0 ;
27702798 $ kaltura_no = $ kaltura_no + 1 ;
2799+ if ( !is_string ($ tab_url ) || $ tab_url === '' ) {
2800+ $ tab_url = $ embed_url ;
2801+ }
27712802 $ navid = 'kaltura- ' .md5 ($ kaltura_no .$ embed_url );
27722803 $ safe_title = htmlspecialchars ($ title , ENT_QUOTES , 'UTF-8 ' );
2773- $ safe_url = htmlspecialchars ($ embed_url , ENT_QUOTES , 'UTF-8 ' );
2804+ $ safe_embed = htmlspecialchars ($ embed_url , ENT_QUOTES , 'UTF-8 ' );
2805+ $ safe_tab = htmlspecialchars ($ tab_url , ENT_QUOTES , 'UTF-8 ' );
27742806 $ open_lbl = htmlspecialchars (__ ('Open in a new window ' ), ENT_QUOTES , 'UTF-8 ' );
27752807?>
27762808<div id="<?= $ navid ?> " class="w3schools-overlay" role="dialog" aria-modal="true" aria-label="Video: <?= $ safe_title ?> ">
27772809 <div class="w3schools-overlay-content tsugi-kaltura-overlay-content">
27782810 <div class="tsugi-kaltura-titlebar">
2779- <a href="<?= $ safe_url ?> " target="_blank" rel="noopener noreferrer" class="tsugi-kaltura-title-link"><?= htmlentities ($ title ) ?> </a>
2780- <a href="<?= $ safe_url ?> " target="_blank" rel="noopener noreferrer" class="tsugi-kaltura-open-new" title="<?= $ open_lbl ?> "><?= $ open_lbl ?> </a>
2811+ <a href="<?= $ safe_tab ?> " target="_blank" rel="noopener noreferrer" class="tsugi-kaltura-title-link"><?= htmlentities ($ title ) ?> </a>
2812+ <a href="<?= $ safe_tab ?> " target="_blank" rel="noopener noreferrer" class="tsugi-kaltura-open-new" title="<?= $ open_lbl ?> "><?= $ open_lbl ?> </a>
27812813 <button type="button" class="tsugi-overlay-close tsugi-kaltura-close" aria-label="Close" onclick="tsugiCloseKalturaOverlay('<?= $ navid ?> ');">×</button>
27822814 </div>
2783- <iframe data-src="<?= $ safe_url ?> " src="" id="<?= $ navid ?> -iframe" title="<?= $ safe_title ?> " class="tsugi-kaltura-iframe" allowfullscreen allow="autoplay *; fullscreen *; encrypted-media *; picture-in-picture *"></iframe>
2815+ <iframe data-src="<?= $ safe_embed ?> " src="" id="<?= $ navid ?> -iframe" title="<?= $ safe_title ?> " class="tsugi-kaltura-iframe" allowfullscreen allow="autoplay *; fullscreen *; encrypted-media *; picture-in-picture *"></iframe>
27842816 <div class="clear" style="clear:both;"></div>
27852817 </div>
27862818</div>
@@ -2803,9 +2835,14 @@ private function renderItemVideo($item, $nostyle=false) {
28032835
28042836 if ( $ kaltura_url ) {
28052837 if ( $ nostyle ) {
2806- self ::nostyleUrl ($ item ->title , $ kaltura_url );
2838+ self ::nostyleUrl ($ item ->title , $ this -> kalturaTabUrl ( $ item ) );
28072839 } else {
2808- $ this ->renderKalturaOverlay ($ item ->title , $ kaltura_url , true );
2840+ $ this ->renderKalturaOverlay (
2841+ $ item ->title ,
2842+ $ kaltura_url ,
2843+ true ,
2844+ $ this ->kalturaTabUrl ($ item )
2845+ );
28092846 }
28102847 } else if ( is_string ($ media_file ) && is_string ($ media_base ) && is_string ($ media_folder ) &&
28112848 file_exists ($ media_folder . '/ ' . $ media_file ) ) {
0 commit comments