Дата последнего изменения: 09.11.2023
Достаточно часто можно решить одну и ту же задачу разными способами. Выбор конечного варианта в таких задачах остается за разработчиком, который он принимает в зависимости от конкретной задачи. Рассмотрим пример решений задачи, которую можно решить двумя способами.
Как сделать возможность вставки видео при публикации новостей на сайте? На первый взгляд это может показаться сложно. Но фактически все легко реализуемо. Идея состоит в том, чтобы для прикреплённого к новости файла подключать компонент Медиа проигрыватель (bitrix:player). Для отображения новости будет использоваться компонент Новость детально (bitrix:news.detail).
Какой бы способ вы не использовали, необходимо создать свойство типа Файл в инфоблоке новостей.
<?$APPLICATION->IncludeComponent( "bitrix:player", "", Array( "PLAYER_TYPE" => "auto", "USE_PLAYLIST" => "N", "PATH" => "", "WIDTH" => "400", "HEIGHT" => "300", "FULLSCREEN" => "Y", "SKIN_PATH" => "/bitrix/components/bitrix/player/mediaplayer/skins", "SKIN" => "bitrix.swf", "CONTROLBAR" => "bottom", "WMODE" => "transparent", "HIDE_MENU" => "N", "SHOW_CONTROLS" => "Y", "SHOW_STOP" => "N", "SHOW_DIGITS" => "Y", "CONTROLS_BGCOLOR" => "FFFFFF", "CONTROLS_COLOR" => "000000", "CONTROLS_OVER_COLOR" => "000000", "SCREEN_COLOR" => "000000", "AUTOSTART" => "N", "REPEAT" => "N", "VOLUME" => "90", "DISPLAY_CLICK" => "play", "MUTE" => "N", "HIGH_QUALITY" => "Y", "ADVANCED_MODE_SETTINGS" => "N", "BUFFER_LENGTH" => "10", "DOWNLOAD_LINK_TARGET" => "_self" ) );?>
30 <?foreach($arResult["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?> 31 32 <?=$arProperty["NAME"]?>: 33 <?if(is_array($arProperty["DISPLAY_VALUE"])):?> 34 <?=implode(" / ", $arProperty["DISPLAY_VALUE"]);?> 35 <?else:?> 36 <?=$arProperty["DISPLAY_VALUE"];?> 37 <?endif?> 38 <br /> 39 <?endforeach;?>
<?foreach($arResult["DISPLAY_PROPERTIES"] as $pid=>$arProperty):?> <?if ($arProperty["CODE"]=='movie' && $arProperty["DISPLAY_VALUE"]) {?> <?$APPLICATION->IncludeComponent( "bitrix:player", "", Array( "PLAYER_TYPE" => "auto", "USE_PLAYLIST" => "N", "PATH" => CFile::GetPath($arProperty["VALUE"]), "WIDTH" => "400", "HEIGHT" => "300", "FULLSCREEN" => "Y", "SKIN_PATH" => "/bitrix/components/bitrix/player/mediaplayer/skins", "SKIN" => "bitrix.swf", "CONTROLBAR" => "bottom", "WMODE" => "transparent", "HIDE_MENU" => "N", "SHOW_CONTROLS" => "Y", "SHOW_STOP" => "N", "SHOW_DIGITS" => "Y", "CONTROLS_BGCOLOR" => "FFFFFF", "CONTROLS_COLOR" => "000000", "CONTROLS_OVER_COLOR" => "000000", "SCREEN_COLOR" => "000000", "AUTOSTART" => "N", "REPEAT" => "N", "VOLUME" => "90", "DISPLAY_CLICK" => "play", "MUTE" => "N", "HIGH_QUALITY" => "Y", "ADVANCED_MODE_SETTINGS" => "N", "BUFFER_LENGTH" => "10", "DOWNLOAD_LINK_TARGET" => "_self" ), $component );?> <? } else {?> <?=$arProperty["NAME"]?>: <?if(is_array($arProperty["DISPLAY_VALUE"])):?> <?=implode(" / ", $arProperty["DISPLAY_VALUE"]);?> <?else:?> <?=$arProperty["DISPLAY_VALUE"];?> <?endif?> <?}?> <br /> <?endforeach;?>
$component
для того чтобы из публичной части случайно не изменить его параметры (см. класс CMain::IncludeComponent).Если вы хотите, чтобы решение не было похоже на "костыли", необходимо вынести замену свойства в result_modifier.php. Тогда шаблон компонента будет стандартный.
<? // передадим значение свойства по ссылке: $arProperty = &$arResult['DISPLAY_PROPERTIES'][$arParams['PROPERTY_VIDEO']]; if ($arProperty['DISPLAY_VALUE']) // проверим, установлено ли свойство { global $APPLICATION; ob_start(); // включим буферизацию чтобы отловить вывод компонента $APPLICATION->IncludeComponent( "bitrix:player", "", Array( "PLAYER_TYPE" => "auto", "USE_PLAYLIST" => "N", "PATH" => CFile::GetPath($arProperty["VALUE"]), "WIDTH" => "400", "HEIGHT" => "300", "FULLSCREEN" => "Y", "SKIN_PATH" => "/bitrix/components/bitrix/player/mediaplayer/skins", "SKIN" => "bitrix.swf", "CONTROLBAR" => "bottom", "WMODE" => "transparent", "HIDE_MENU" => "N", "SHOW_CONTROLS" => "Y", "SHOW_STOP" => "N", "SHOW_DIGITS" => "Y", "CONTROLS_BGCOLOR" => "FFFFFF", "CONTROLS_COLOR" => "000000", "CONTROLS_OVER_COLOR" => "000000", "SCREEN_COLOR" => "000000", "AUTOSTART" => "N", "REPEAT" => "N", "VOLUME" => "90", "DISPLAY_CLICK" => "play", "MUTE" => "N", "HIGH_QUALITY" => "Y", "ADVANCED_MODE_SETTINGS" => "N", "BUFFER_LENGTH" => "10", "DOWNLOAD_LINK_TARGET" => "_self" ) ); $arProperty['DISPLAY_VALUE'] = ob_get_contents(); // подменим $arResult ob_clean(); // очистим наш буфер чтобы плеер не появился дважды ob_end_clean(); // закроем буфер } ?>
Символьный код свойства можно сделать параметром компонента, чтобы не привязываться жёстко к конкретному инфоблоку. Для этого нужно доработать файл .parameters.php компонента Новость детально, расположенный в скопированном шаблоне компонента.
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arProps = array(); $rs=CIBlockProperty::GetList(array(),array("IBLOCK_ID"=>$arCurrentValues['IBLOCK_ID'],"ACTIVE"=>"Y")); while($f = $rs->Fetch()) $arProps[$f['CODE']] = $f['NAME']; $arTemplateParameters = array( "DISPLAY_DATE" => Array( "NAME" => GetMessage("T_IBLOCK_DESC_NEWS_DATE"), "TYPE" => "CHECKBOX", "DEFAULT" => "Y", ), "DISPLAY_NAME" => Array( "NAME" => GetMessage("T_IBLOCK_DESC_NEWS_NAME"), "TYPE" => "CHECKBOX", "DEFAULT" => "Y", ), "DISPLAY_PICTURE" => Array( "NAME" => GetMessage("T_IBLOCK_DESC_NEWS_PICTURE"), "TYPE" => "CHECKBOX", "DEFAULT" => "Y", ), "DISPLAY_PREVIEW_TEXT" => Array( "NAME" => GetMessage("T_IBLOCK_DESC_NEWS_TEXT"), "TYPE" => "CHECKBOX", "DEFAULT" => "Y", ), "PROPERTY_VIDEO" => Array( "NAME" => "Свойство, в котором хранится видео", "TYPE" => "LIST", "VALUES" => $arProps ), ); ?>
В результате в настройках параметра появляется новое поле: Свойство, в котором хранится видео.
Не забудьте в параметрах подключения компонента указать свойство, в котором хранится видео, иначе оно выводиться не будет.