По одной из задач на работе было необходимо реализовать некоторую страницу на портале битрикс 24 на которой бы сотрудники которым сбросили ссылку могли просматривать какие либо видеозаписи(планировалось что обучающие) без возможности скачивания этих видеозаписей. Видеозаписи которые необходимо было разместить на странице, мне предоставили по ссылке на модуль Диск битрикс 24. Решил что для того чтобы предоставить пользователю возможность самостоятельно менять видеозаписи на странице подойдёт алгоритм определяющий наличие видеозаписей в определённой папке модуля Диск битрикс 24. Некоторая начальная реализация такой страницы приведена в листинге ниже. В этой реализации ещё не вставлен JavaScript блокировки скачивания файла из меню которое появляется при нажатии правой кнопки на видеозаписи(хотя предполагаемый JavaScript видимо не блокирует возможность скачивания видео из клиента битрикс24), а так же планируется позже модернизировать скрипт, чтобы из папки отображались только файлы видеозаписей(в скрипте же ниже будет произведена попытка вывести так же любой другой файл), а так же планируется убрать из заголовков выше видеозаписей расширение файла, а так же сделать возможность задавать порядок следования видеозаписей на странице путям использования в начале названия файла конструкции вида "ПорядковыйНомер__"(без кавычек), если у какого то файла такой конструкции нет, он будет выведен ниже файлов имеющих такую конструкцию в начале названия.
SetTitle("Обучающие материалы"); $bitrixDiskFolderId = 240903;//Идентификатор папки в модуля Диск битрикс24 из которой необходимо показывать видео $GLOBALS["videoTypeAr"] = array("mp4");//Расширения файлов с видео, указываются в нижнем регистре. function myint($var,$string = false) { if (is_numeric($var)) { if ($string) { $var = $var * 1; } if ($var === ((int) $var)) { return true; } } return false; } function checkVideoFilename($name=false) { if ((($name."") != "") and isset($GLOBALS["videoTypeAr"]) and is_array($GLOBALS["videoTypeAr"]) and $GLOBALS["videoTypeAr"]) { foreach ($GLOBALS["videoTypeAr"] as $videoType) { //$videoTypeLen = strlen($videoType); if (((($videoTypeLen = strlen($videoType)) + 1) <= ($nameLen = strlen($name))) and (strtolower(substr($name,(strpos($name,$videoType)-1))) == ("." . strtolower($videoType)))) {//Согласно первому условию, название файла может полчиться пустой строкой если файл назван только расширением, по идее такой файл в директории должен быть только 1(написано "по идее" поскольку речь всё же идёт не о обычных дирректориях windows или linux, а о директории модуля диск битрикса24, мало ли будет реализовано так что дирректория модуля Диск битрикс24 будет иметь возможность хранить 2 файла с одинаковым названием) return substr($name,0,($nameLen-($videoTypeLen+1))); } } } return false; } function checkSotrName($name=false,&$num=false) { if ((($name."") != "") and (($pos = strpos($name,"__")) !== false) and myint($numTmp = substr($name,0,$pos),true) and ($numTmp > 0)) { $num = $numTmp; if (($pos+2) == strlen($name)) { return ""; } else { return substr($name,$pos+2); } //if ((($pos = strpos($name,"__")) !== false) and myint($num = substr($name,0,$pos),true) and ($num > 0)) } return false; } $connection = \Bitrix\Main\Application::getInstance()->getConnection();//Создаём соединение $videoAr = array(); $videoWithoutSortingAr = array(); $sortingVideoAr = array(); try { $result = $connection->query("SELECT `ID`, `NAME` FROM `b_disk_object` WHERE `PARENT_ID` = $bitrixDiskFolderId;"); $fileDataAr = $result->fetchAll(); foreach ($fileDataAr as $fileData) { if ($name = checkVideoFilename($fileData["NAME"])) { \Bitrix\Main\Loader::includeModule('disk'); if ($file = Bitrix\Disk\File::getById($fileData["ID"])) { $info = $file->getFile(); $fileTosortedFlag = false; // if ((($pos = strpos($fileData["NAME"],"__")) !== false) and myint($num = substr($fileData["NAME"],0,$pos),true) and ($num > 0)) { $num = false; if ($sortName = checkSotrName($name,$num)) {//Если этот файл нужно отсортировать в соответствии с настройкой пользователя $info["nameNoType"] = $sortName; $sortingVideoAr[$num] = $info; } else { $info["nameNoType"] = $name; $videoWithoutSortingAr[] = $info; } } } } ksort($sortingVideoAr); $videoAr = array_merge($sortingVideoAr,$videoWithoutSortingAr); if ($videoAr) { foreach ($videoAr as $video) { echo "" . $video["nameNoType"] . "
"; echo "\n"; //echo "Здесь просто тестовый вывод информации
\n"; } } else { echo "Папка с идентификатором $bitrixDiskFolderId модуля Диск битрикс 24 не найддена или не содержит видеофайлов."; } } catch (Exception $e) { echo "Ошибка при выполнении запроса к базе данных: " . $e->getMessage() . "
"; } /* exit; var_dump($sortingVideoAr); echo "\n"; var_dump($videoWithoutSortingAr); exit; var_dump(checkVideoFilename("test123.mp4")); //exit; $connection = \Bitrix\Main\Application::getInstance()->getConnection();//Создаём соединение try { $result = $connection->query("SELECT `ID`, `NAME` FROM `b_disk_object` WHERE `PARENT_ID` = $bitrixDiskFolderId;"); $fileDataAr = $result->fetchAll(); foreach ($fileDataAr as $fileData) { echo "
" . $fileData["NAME"] . "
\n"; \Bitrix\Main\Loader::includeModule('disk'); if ($file = Bitrix\Disk\File::getById($fileData["ID"])) { $info = $file->getFile(); echo "\n"; echo "Здесь просто тестовый вывод информации
\n"; //var_dump($info); } } } catch (Exception $e) { echo "Ошибка при выполнении запроса к базе данных: " . $e->getMessage() . "
"; } */ require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");