Bitrix: Временное хранение файлов

September 27, 2016

Это надо вам записать, ибо этого нигде не найдете. Никакая документация этого не держит.

Мне требовалось временно сохранить файлы, прикрепленные к задачам в Битрикс24. Т.к. нынче модно все действия с файлами переносить на Диск, а не через CFile.

В общем, вся суть сводится к тому, что привязка файлов к задаче хранится в USER_FIELD_MANAGER('TASKS_TASK") В поле UF_TASK_WEBDAV_FILES хранятся ID Аттача (Attached). Когда мы удаляем задачу, мы удаляем и записи в USER_FIELD_MANAGER('TASKS_TASK", $taskId). Модуль диска это ловит и удаляет файлы физически.

Если требуется использовать пользовательские поля или свойства типа файл помните - Файл (DEPRECATED) Нужно использовать Файл (Диск)

Чтобы временно сохранить файлы и не допустить, чтобы они удалились, необходимо:


    // Получить все записи:
    $userFields = $USER_FIELD_MANAGER->GetUserFields("TASKS_TASK", $taskId );
    $attachedIds = $userFields['UF_TASK_WEBDAV_FILES']['VALUE'];
  
    // Загрузить данные из диска по этим айдишникам:
    $userFieldManager = \Bitrix\Disk\Driver::getInstance()->getUserFieldManager();
    $userFieldManager->loadBatchAttachedObject($attachedIds);
    
    // Пройти по каждому аттачу:
    foreach($attachedIds as $attachedId)
    {
        // Получить информацию о файле из текущего аттача
        $attachedObject = $userFieldManager->getAttachedObjectById($attachedId);
        // Запоминаем айди обьекта/файла С(!) ПРЕФИКСОМ НОВОГО ФАЙЛА, простигоспди
        $newValues[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $attachedObject->getObjectId();
    }
  

И затем только ( ! ) запоминаем в своих юзерфилдах:


    $USER_FIELD_MANAGER->update("TRASH_DISK", $this->entityId, array(
        'UF_TRASH_TASK_FILE' => $newValues,
    ));
    
    // Сохранение у себя в юзерфилдах
    $userFields = $USER_FIELD_MANAGER->GetUserFields("TASKS_TASK", $this->entityId );
    $attachedIds = $userFields['UF_TASK_WEBDAV_FILES']['VALUE'];
    $newValues = array();
    $userFieldManager = \Bitrix\Disk\Driver::getInstance()->getUserFieldManager();
    $userFieldManager->loadBatchAttachedObject($attachedIds);
    foreach($attachedIds as $attachedId)
    {
        $attachedObject = $userFieldManager->getAttachedObjectById($attachedId);
        $newValues[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $attachedObject->getObjectId();
    }
    $USER_FIELD_MANAGER->update("TRASH_DISK", $this->entityId, array(
        'UF_TRASH_TASK_FILE' => $newValues,
    ));

    // Восстановление к новой задаче
    $userFields = $USER_FIELD_MANAGER->GetUserFields("TRASH_DISK", $oldTaskId );
    $attachedIds = $userFields['UF_TRASH_TASK_FILE']['VALUE'];
    $newValues = array();
    $userFieldManager = \Bitrix\Disk\Driver::getInstance()->getUserFieldManager();
    $userFieldManager->loadBatchAttachedObject($attachedIds);
    foreach($attachedIds as $attachedId)
    {
        $attachedObject = $userFieldManager->getAttachedObjectById($attachedId);
        $newValues[] = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $attachedObject->getObjectId();
    }
    $USER_FIELD_MANAGER->update("TASKS_TASK", $task->getID(), array(
        'UF_TASK_WEBDAV_FILES' => $newValues,
    ));
  

Короче как-то так

Комментарии

comments powered by Disqus