Diskmobile 26.500.0: ссылки на файлы Диска и папки по единой ссылке открываются в приложении
В diskmobile 26.500.0 мобильное приложение научилось само открывать обычные ссылки на файлы Диска и единые ссылки на папки, а внутри такой папки с файлами можно работать как в своём хранилище. На сервере для этого появились три действия контроллеров. Прошлую версию мы разбирали в diskmobile 26.400.0.
Новое
Ссылка на файл открывается превью
Приложение перехватывает ссылки на карточку файла во всех трёх видах хранилищ: /company/personal/user/<id>/disk/file/…, /workgroups/group/<id>/disk/file/… и общий диск /docs/file/…. В коробке общий диск может лежать по своему пути, например /docs/shared/file/…, этот вариант тоже поддержан. Путь уходит в новое действие diskmobile.Common.resolveFileId. Оно находит хранилище, ищет файл по пути через UrlManager::resolveFileIdFromPath() и возвращает id, имя, тип и право на скачивание, если файл не удалён и пользователь может его читать. В остальных случаях приходит ошибка DISKMOBILE_FILE_PATH_DENIED.
Если ваш модуль шлёт в чат или уведомление ссылку на файл, получите её штатным методом Диска, и с телефона она откроется превью вместо страницы портала:
<?php
declare(strict_types=1);
use Bitrix\Disk\Driver;
use Bitrix\Disk\File;
use Bitrix\Main\Loader;
Loader::requireModule('disk');
$file = File::loadById($fileId);
if ($file !== null) {
$urlManager = Driver::getInstance()->getUrlManager();
// при стандартных путях: /company/personal/user/1/disk/file/Отчёты/Июль.xlsx
$path = $urlManager->getPathFileDetail($file);
// для текста сообщения в чате нужна полная ссылка
$url = $urlManager->getHostUrl() . $path;
}
Пример собран по коду ядра, на телефоне мы его не проверяли.
Папка по единой ссылке открывается в приложении
Единые ссылки на папки вида /folder/<код> теперь открываются списком файлов. Содержимое отдаёт Folder::getChildrenByUnifiedLinkAction(), оно перенаправляет запрос в контроллер единых ссылок модуля disk. Поиск в такой папке идёт по всем подпапкам, свежие файлы сверху.
Над содержимым работают те же действия, что и в своём хранилище: переименование, удаление, перемещение, копирование, создание файла и подпапки. Приложение вызывает их через disk.api.UnifiedLinkActions.* с кодом ссылки. Если ссылка закрыта паролем, приложение его спросит, а список обновляется по pull-событиям. Серверную сторону единых ссылок смотрите в разборе disk.
Единые ссылки, обёрнутые в https://bitrix24public.com/…, приложение открывает тоже, но только ссылки текущего портала. Обёртку чужого портала оно оставляет внешней ссылкой, а произвольный путь на публичном хосте в webview не откроет.
Новые действия контроллеров
diskmobile.Common.resolveFileId— файл по типу хранилища и пути.diskmobile.Common.getFileById— то же по id файла, приложение его пока не вызывает.diskmobile.Folder.getChildrenByUnifiedLink— содержимое папки по коду единой ссылки.
Все три вызываются только из приложения или AJAX, потому что базовый контроллер модуля требует авторизацию, CSRF-токен и POST и закрыт для REST.
Мелочи и находки
- Если ссылки на файлы общего диска начинаются не с
/docs/file/и не с/docs/<папка>/file/, превью по ним приложение не откроет. Роут единых ссылок примет имя папки за код ссылки, не узнает в нём формат из 20 латинских букв и цифр и откроет страницу портала. - Новое действие объявлено с
string $search = null, как и старыйgetChildrenAction. В PHP 8.4 такой неявный nullable даёт deprecation.