Модули коробки
Диск
Рабочая справка по модулю disk в коробочном Bitrix24: хранилища, папки, объекты, файлы Диска, загрузка файлов и права.
Диск — это не просто запись в b_file. В Bitrix24 файл часто является объектом
Диска: у него есть хранилище, папка, права, версии и связи с CRM, задачами или сообщениями.
Общее понимание
Модуль disk нужен для работы с файлами Диска, а не только с физическими файлами.
Что такое Диск
В Диске есть хранилища, папки и файлы. Хранилище может принадлежать пользователю, группе или быть общим. Файл Диска может ссылаться на физический файл в файловом хранилище Битрикса.
Подключение модуля
<?php
use Bitrix\Main\Loader;
Loader::includeModule('disk'); <?php
use Bitrix\Main\Loader;
/**
* Подключает модуль disk.
*/
function requireDiskModule(): void
{
if (!Loader::includeModule('disk')) {
throw new \RuntimeException('Не удалось подключить модуль disk');
}
}
requireDiskModule(); b_file и Disk
| Сущность | Что означает |
|---|---|
b_file | Физический файл в файловой системе Битрикса. |
| Файл Диска | Объект Диска с правами, хранилищем, папкой и связями. |
| Привязка файла | Связь файла Диска с задачей, CRM, сообщением или другой сущностью. |
Карта методов
| Метод | Что делает | Когда использовать |
|---|---|---|
Driver::getInstance() | Возвращает драйвер Диска. | Точка входа для хранилищ и прав. |
getStorageByUserId() | Получает хранилище пользователя. | Файлы конкретного пользователя. |
getStorageByGroupId() | Получает хранилище группы. | Файлы рабочей группы или проекта. |
Storage::loadById() | Получает хранилище по ID. | Когда ID хранилища уже известен. |
$storage->getRootObject() | Возвращает корневую папку. | Поиск и создание файлов в корне. |
$folder->getChild() | Ищет дочерний объект. | Найти папку или файл по имени. |
$folder->addSubFolder() | Создаёт подпапку. | Создать папку внутри папки. |
$folder->uploadFile() | Загружает файл в папку Диска. | Импорт файлов в Диск. |
File::loadById() | Получает файл Диска. | Работа с известным ID объекта файла. |
$disk_file->getFileId() | Возвращает ID физического файла. | Переход от объекта Диска к CFile. |
getRightsManager() | Возвращает менеджер прав. | Проверка и настройка прав Диска. |
Хранилища и папки
Работа с Диском обычно начинается с получения хранилища.
Получить хранилище пользователя
<?php
use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;
use Bitrix\Disk\Storage;
Loader::includeModule('disk');
/**
* Получает хранилище пользователя.
*/
function fetchUserDiskStorage(int $user_id): ?Storage
{
if ($user_id <= 0) {
return null;
}
return Driver::getInstance()->getStorageByUserId($user_id);
}
$storage = fetchUserDiskStorage($user_id);
if ($storage !== null) {
echo $storage->getId();
} Хранилище группы и по ID
<?php
use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;
use Bitrix\Disk\Storage;
Loader::includeModule('disk');
/**
* Получает хранилище группы.
*/
function fetchGroupDiskStorage(int $group_id): ?Storage
{
if ($group_id <= 0) {
return null;
}
return Driver::getInstance()->getStorageByGroupId($group_id);
}
/**
* Получает хранилище по ID.
*/
function fetchDiskStorageById(int $storage_id): ?Storage
{
if ($storage_id <= 0) {
return null;
}
return Storage::loadById($storage_id);
}
$group_storage = fetchGroupDiskStorage($group_id);
$storage = fetchDiskStorageById($storage_id); Получить корневую папку
<?php
use Bitrix\Disk\Folder;
use Bitrix\Disk\Storage;
/**
* Получает корневую папку хранилища.
*/
function fetchStorageRootFolder(Storage $storage): ?Folder
{
$root_object = $storage->getRootObject();
return $root_object instanceof Folder ? $root_object : null;
}
$root_folder = fetchStorageRootFolder($storage);
if ($root_folder !== null) {
echo $root_folder->getName();
} Найти папку или файл
<?php
use Bitrix\Disk\BaseObject;
use Bitrix\Disk\Folder;
use Bitrix\Disk\Internals\FolderTable;
/**
* Ищет папку в родительской папке.
*/
function findChildFolder(Folder $parent_folder, string $folder_name): ?Folder
{
$child = $parent_folder->getChild([
'=NAME' => $folder_name,
'TYPE' => FolderTable::TYPE_FOLDER,
]);
return $child instanceof Folder ? $child : null;
}
/**
* Ищет объект в корневой папке по имени.
*/
function findDiskRootChild(Folder $root_folder, string $name): ?BaseObject
{
if ($name === '') {
return null;
}
$object = $root_folder->getChild([
'=NAME' => $name,
]);
return $object instanceof BaseObject ? $object : null;
}
$folder = findChildFolder($root_folder, 'Документы');
if ($folder !== null) {
echo $folder->getId();
} Создать папку
<?php
use Bitrix\Disk\Folder;
/**
* Создаёт подпапку.
*/
function addDiskSubFolder(Folder $parent_folder, string $name, int $created_by_id): ?Folder
{
if ($name === '' || $created_by_id <= 0) {
return null;
}
$folder = $parent_folder->addSubFolder([
'NAME' => $name,
'CREATED_BY' => $created_by_id,
]);
return $folder instanceof Folder ? $folder : null;
}
$folder = addDiskSubFolder($root_folder, 'Документы', $created_by_id); Файлы
Файл Диска можно получить как объект, а потом перейти к физическому файлу.
Получить файл по ID
<?php
use Bitrix\Main\Loader;
use Bitrix\Disk\File;
Loader::includeModule('disk');
/**
* Получает файл Диска по ID.
*/
function fetchDiskFileById(int $file_id): ?File
{
if ($file_id <= 0) {
return null;
}
$file = File::loadById($file_id);
return $file instanceof File ? $file : null;
}
$disk_file = fetchDiskFileById($file_id);
if ($disk_file !== null) {
echo $disk_file->getName();
} Получить физический файл
<?php
use Bitrix\Disk\File;
/**
* Получает массив физического файла из объекта Диска.
*/
function fetchDiskPhysicalFile(File $disk_file): array
{
$file_id = (int) $disk_file->getFileId();
if ($file_id <= 0) {
return [];
}
$file = \CFile::GetFileArray($file_id);
return is_array($file) ? $file : [];
}
$disk_file = File::loadById($disk_file_id);
if ($disk_file instanceof File) {
$file = fetchDiskPhysicalFile($disk_file);
print_r($file);
} Так можно получить путь, размер, имя и другие данные физического файла через стандартный файловый API.
Загрузить файл в папку
<?php
use Bitrix\Disk\File;
use Bitrix\Disk\Folder;
/**
* Загружает физический файл в папку Диска.
*/
function uploadFileToDiskFolder(Folder $folder, string $absolute_file_path, int $created_by_id): ?File
{
if ($absolute_file_path === '' || $created_by_id <= 0 || !file_exists($absolute_file_path)) {
return null;
}
$file_array = \CFile::MakeFileArray($absolute_file_path);
if (!is_array($file_array)) {
return null;
}
$disk_file = $folder->uploadFile(
$file_array,
[
'CREATED_BY' => $created_by_id,
]
);
return $disk_file instanceof File ? $disk_file : null;
}
$disk_file = uploadFileToDiskFolder(
$root_folder,
$_SERVER['DOCUMENT_ROOT'] . '/upload/example.pdf',
$created_by_id
); Привязки файлов
Файлы в задачах, сообщениях и CRM часто хранятся как привязки к объектам Диска. Конкретная таблица связи зависит от места использования: задачи, IM, CRM, комментарии или пользовательские поля.
Если файл пришёл из IM-сообщения или задачи, сначала нужно понять, какой ID у вас на руках: ID физического файла, ID объекта Диска или ID прикреплённого объекта.
Права Диска
<?php
use Bitrix\Main\Loader;
use Bitrix\Disk\Driver;
Loader::includeModule('disk');
/**
* Получает ID права Диска по имени.
*/
function fetchDiskAccessTaskId(string $task_name): int
{
$rights_manager = Driver::getInstance()->getRightsManager();
return (int) $rights_manager->getTaskIdByName($task_name);
}
$rights_manager = Driver::getInstance()->getRightsManager();
$read_task_id = fetchDiskAccessTaskId($rights_manager::TASK_READ);
$edit_task_id = fetchDiskAccessTaskId($rights_manager::TASK_EDIT);
$full_task_id = fetchDiskAccessTaskId($rights_manager::TASK_FULL);
print_r([
'read' => $read_task_id,
'edit' => $edit_task_id,
'full' => $full_task_id,
]); Настройка прав Диска зависит от объекта, хранилища и типа доступа. Перед изменением прав лучше сначала вывести текущие права объекта на тестовой сущности.