DarkRiDDeR12 мин

Bitrix API. Встроенный редактор изображений: UI не заменяет серверный контракт

BitrixPHP

Редактор показывает выбранную картинку, но после отправки формы поле остаётся пустым. Цена ошибки — оператор считает файл сохранённым и узнаёт о потере только на опубликованной странице.

В исходной заметке полезен сам вызов `Bitrix\Main\UI\FileInput`. Теперь рядом с ним нужен контроль жизненного цикла: UI создаёт данные для формы, сервер проверяет вход, а сущность хранит итоговую связь. Каждый слой должен иметь собственную проверку.

Bitrix API. Встроенный редактор изображений: UI не заменяет серверный контракт: схема границ проверки
Иллюстрация показывает границу между симптомом, техническим механизмом и проверяемым действием.

Что сохраняем из исходной заметки

В CMS Bitrix имеется довольно неплохой по функциональным возможностям и дизайну встроенный графический редактор картинок.

Поэтому может возникнуть желании использовать его на сайте. Но как это сделать? На самом деле это не так сложно. Класс компонента графического редактора является \Bitrix\Main\UI\FileInput и располагается в файле /bitrix/modules/main/lib/ui/fileinput.php

Для вывода кода компонента необходимо создать экземляр класс с помощью статического метода createInstance. Затем получить код на вывод через метод show. Полный код вызова компонента будет иметь следующий вид:

<?=\Bitrix\Main\UI\FileInput::createInstance([
	"name" => "picture",
	"description" => true,
	"upload" => true,
	"allowUpload" => "I",
	"medialib" => true,
	"fileDialog" => true,
	"cloud" => true,
	"delete" => true,
	"maxCount" => 1
	])->show($id);
?>

Переменная $id содержит идентификатор картинки в системе.

  • name – задаёт параметр формы, в котором будут переданы данные файла;
  • description – можно ли задавать описание к файлу;
  • upload – можно ли загружать файл;
  • allowUpload – какой тип файлов разрешён к загрузке (F – файлы, I – картинки, A – все типы, по умолчанию);
  • allowUploadExt – какие типы расширений разрешены к загрузке (*.zip,*.rar,*.doc и пр.);
  • medialib – можно ли использовать медиа-библиотеку;
  • fileDialog – разрешён ли файловый диалог для загрузки;
  • cloud – использовать ли модуль облачного хранилища для загрузки файлов;
  • delete – можно ли удалять картинку;
  • edit – можно ли редактировать картинку:
  • maxCount – максимальное количество файлов;
  • maxSize – максимальный размер файла (байт).

Также необходимо учитывать, что некоторые параметры будут работать только при определённых условиях, как, например, medialib и cloud.

Завершение интеграции

После вывода компонента важно не забыть обработать результат формы: сохранить ID файла, проверить тип загруженного файла и права пользователя. Сам редактор решает задачу интерфейса, но безопасность и привязка к сущности остаются на стороне вашего кода.

В параметрах компонента отдельно проверьте allowUpload, medialib, fileDialog, cloud, delete, edit и maxCount. Не все параметры будут иметь эффект в любой установке Bitrix: часть зависит от подключённых модулей, прав пользователя и контекста страницы.

$fileId = (int)$_POST['picture'];

if ($fileId > 0) {
    $file = CFile::GetFileArray($fileId);
    if ($file && str_starts_with($file['CONTENT_TYPE'], 'image/')) {
        // сохраняем ID картинки в своей сущности
    }
}

Если редактор не открывается, проверьте подключение модулей main и fileman, права на загрузку, административные JS-расширения и наличие сессии пользователя. В публичной части сайта проблема часто оказывается не в FileInput, а в том, что на странице не подключены нужные скрипты Bitrix.

Рабочая схема такая: выводим FileInput, разрешаем только картинки, ограничиваем количество, после отправки формы валидируем ID файла и сохраняем его в свою сущность. Тогда встроенный редактор становится нормальной частью формы, а не просто красивой кнопкой загрузки.

Механизм без лишних обещаний

Компонент FileInput умеет показать диалог и собрать поля формы, но не знает бизнес-правило, к какой записи относится файл. Идентификатор сущности и имя поля должны приходить из серверного контекста, а не из DOM.

После отправки сервер проверяет права, тип, размер и число файлов. Одного расширения недостаточно: MIME и содержимое могут расходиться. Для замены картинки нужно отдельно определить, удаляется ли старый файл и можно ли восстановить его при ошибке.

Результат сохранения проверяется чтением сущности. Наличие `ID` файла в ответе формы ещё не доказывает, что связь записана в нужное свойство инфоблока.

Минимальный воспроизводимый пример

Ниже — маленькая проверка, которую можно запустить или адаптировать в отдельном тестовом окружении. Значения демонстрационные; проектные идентификаторы, пути и версии нужно заменить своими и сохранить рядом с результатом.

<?php
$field = \Bitrix\Main\UI\FileInput::createInstance([
    "name" => "picture",
    "upload" => true,
    "allowUpload" => "I",
    "maxCount" => 1,
    "delete" => true,
]);

echo $field->show($elementId);

// После POST проверяем результат API, а не только состояние виджета.
$fileId = (int)($request->getPost("picture") ?? 0);
if ($fileId <= 0) {
    throw new RuntimeException("Файл не выбран");
}

Матрица диагностики

Участок: рабочая матрица проверки
УчастокВопросПроверка
ФормаПоля отправились?POST содержит ожидаемое имя и ID
ПраваКто меняет файл?Пользователь может редактировать сущность
ФайлЧто реально загружено?Размер, MIME, расширение и содержимое
СвязьКуда записан ID?Повторное чтение свойства элемента

Порядок действий

  1. Назвать сущность, поле и владельца операции до подключения редактора.
  2. Показать FileInput с ограничением количества и разрешённых типов.
  3. Проверить POST на сервере и отклонить неожиданные поля или пустой ID.
  4. Сохранить связь через API Bitrix и обработать `LAST_ERROR` или исключение.
  5. Повторно прочитать свойство элемента и проверить опубликованный сценарий.
  6. Для замены файла отдельно зафиксировать поведение старого файла и откат при ошибке.

Ограничения и безопасный следующий шаг

Названия параметров и доступные режимы зависят от версии Bitrix; перед переносом сверяйте API своего проекта.

Встроенный редактор не заменяет антивирусную и серверную проверку загрузки.

Пример не содержит реального ID или данных пользователя.

После проверки должен остаться конкретный артефакт: вывод команды, тест, diff конфигурации или запись результата. Если его нет, формулировку нужно вернуть к симптому и не выдавать гипотезу за исправление.

Что записать в ревью

Короткая запись должна отвечать на четыре вопроса: какой вход использовали, какой результат увидели, какая граница была проверена и какое действие разрешено дальше. Такая форма полезнее длинного вывода «всё работает»: другой инженер сможет повторить проверку и понять, где заканчивается пример.

Если результат зависит от версии Windows, PHP, Bitrix, D или браузера, версию фиксируем рядом с командой. Если проверка не охватывает сеть, production или реальные пользовательские данные, это ограничение пишем прямо. Тогда следующий шаг расширяет evidence, а не расширяет обещание.

Проверяемые источники