Shevchenko-SPb
@Shevchenko-SPb
Web-разработка

Почему не записывается id файла в ячейку таблицы БД при использовании фабрики?

При загрузки файла с внешнего приложения используется метод CFile::SaveFile. Файл успешно загружается и в ответе я получаю id файла. Далее я хочу загрузить этот id в ячейку столбца `UF_CRM_11_AVATAR` базы данных, чтобы файл отображался на странице.
65a10c84a160d429331922.png
С помощью этого метода поучается изменить данные в любых столбцах, кроме `UF_CRM_11_AVATAR`. При попытке записать данные в ячейку, то значение становится 0. Если там уже было число, то оно тоже при попытки записи становится 0. Пробовал различные типы данных записывать и результат тот же самый. Если пытаться записать sql запросом, то число пишется без проблем и файл отображается.
Каких либо ограничений в базе данных не нашел.
65a10de20d9e7524301345.png
65a10e432e17d077723870.png
Единственное отличие в данном столбце - это в битриксе указано, что тип данных файл.
65a10f0e84156987797530.png
Помогите, пожалуйста, решить эту задачу стандартными методами битрикса.
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
При создании записи вы должны не просто "закинуть файл в поле", но и зарегистрировать его (внутренняя техническая особенность).

Адаптируйте ваш пример и попробуйте код:
use \Bitrix\Main\Loader;
use \Bitrix\Crm\Service\Container;

// $entityTypeID - entity type id
// $fileId - saved file identifier (CFile::SaveFile)

Loader::requireModule('crm');

$factory = Container::getInstance()->getFactory($entityTypeID);

$avatarField = $factory->getFieldsCollection()
  ->getField('UF_CRM_11_AVATAR');

$item = $factory->createItem();
$item->set('UF_CRM_11_AVATAR', $fileId);

Container::getInstance()
  ->getFileUploader()
  ->registerFileId($avatarField, $fileId);

$result = $factory->getAddOperation($item)->launch();
var_dump($result->isSuccess());
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@user_41144
Ты получается делаешь операцию добавления а надо изменения. Ну или у тебя поля не так переданы возможно. Вот как я это делаю если надо изменить поля сущности с помощью нового API.
У меня это в классе поэтому надо заменить this на свое.
В массив $fields надо передать поля которые будешь править в формате:
$name // Имя поля
$value // Значение
$fields['UF_FIELDS'][$name] = $value;
Сам код:
$item = $this->factory->getItem($this->entity_id);
        $item->setFromCompatibleData($fields);

        $operation = $this->factory->getUpdateOperation($item)
            ->disableCheckAccess()
            ->disableCheckFields()
            ->enableAutomation()
            ->enableBizProc();

        $result = $operation->launch();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы