PHP скрипт добавления уже размещённого файла на сервере в медиабиблиотеку bitrix.
Исходные данные: Есть сайт на bitrix и в папку lk/mediatest/ относительно корня сайта загружен файл pdf.pdf Требуется разместить этот файл в медиабиблиотеке bitrix средствами API в Папке Документы / Жителям / Жалобы. Для этого будем использовать следующий код:
Пояснения по работе php скрипта.
Строчкой require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'; подключаем пролог bitrix.
Строчками CModule::IncludeModule("fileman"); и CMedialib::Init(); инициализируем работу с мадиабиблиотекой.
Далее создаём массив $arFields с информацией о размещаемом файле, где адреса файла передаём через метод CFile::MakeFileArray в который передаём полный путь до размещаемого файла(относительно корня сервера). Почему path устанавливаем в false я не знаю. Так же передаём массив с значениями ID папок в которые требуется поместить исходный файл под ключом arCollections(как определить ID папок медиабиблиотеки bitrix я напишу ниже). Обратите внимание, что в приведённом выше скрипте "arCollections" => Array (55,56), то есть файл присваивается папкам с значениями Id 55 и 56, но в выводе ниже он присвоен только папке с Id 56, поскольку на самом деле мне требовалось по задаче разместить файл именно в этой папке, в скрипте же выше я указал сразу 2 идентификатора папок, чтобы показать Вам как присвоить файл в случаи необходимости сразу нескольким папкам. Так же передаём массив с ключом arFields, который содержит следующие элементы: ID, NAME, DESCRIPTION, KEYWORDS. ID устанавливается в 0(нужно ли это делать и почему именно в щ я точно не знаю, возможно этот ключ требуется устанавливать при выборке уже размещённых файлов в медиабиблиотеке). NAME это название файла в медиабиблиотеке, DESCRIPTION описание файла, KEYWORDS - ключевые слова, их можно не передавать присвоив ключу KEYWORDS значение пустой строки("").
Сторочкой $arItem = CMedialibItem::Edit($arFields); применяем изменения, именно после выполнения этой строки файл будет размещён в нужной папке медиабиблиотеки. $arItem будет содержать массив элементов возвращенных в результате работы метода Edit.
Строчкой var_dump($arItem); смотрим какую информацию содержит массив $arItem, в моём случаи вывод имел следующий вид(у меня получился массив содержащий 22 элемента):
array(22) {
["ID"]=>
int(569)
["TIMESTAMP_X"]=>
string(19) "24.01.2019 12:17:52"
["MODULE_ID"]=>
string(7) "fileman"
["HEIGHT"]=>
string(1) "0"
["WIDTH"]=>
string(1) "0"
["FILE_SIZE"]=>
string(5) "33267"
["CONTENT_TYPE"]=>
string(24) "application/octet-stream"
["SUBDIR"]=>
string(16) "medialibrary/2e9"
["FILE_NAME"]=>
string(36) "2e9bb0e8b5e970327f0609d522a7e54d.pdf"
["ORIGINAL_NAME"]=>
string(7) "pdf.pdf"
["DESCRIPTION"]=>
string(39) "Описание Pdf документа"
["HANDLER_ID"]=>
NULL
["EXTERNAL_ID"]=>
string(32) "03fa3a6f9c917f55f89ea307db78a8b5"
["~src"]=>
bool(false)
["PATH"]=>
string(61) "/upload/medialibrary/2e9/2e9bb0e8b5e970327f0609d522a7e54d.pdf"
["NAME"]=>
string(8) "NameName"
["KEYWORDS"]=>
string(38) "Ключевое 1, Ключевое 2"
["~DATE_UPDATE"]=>
string(5) "now()"
["SEARCHABLE_CONTENT"]=>
string(61) "{NAMENAME}{ОПИСАН}{PDF}{ДОКУМЕНТ}{КЛЮЧЕВ}"
["SOURCE_ID"]=>
int(96846)
["~DATE_CREATE"]=>
string(5) "now()"
["ITEM_TYPE"]=>
string(0) ""
}
Описание массива полученного в результате работы скрипта.
В выводе выше ключи массива несут следующий смысл:
ID - Id файла размещённого в медиабиблиотеке(не могу сейчас сообщить считаются ли Id файлов и папок раздельно или совместно);
TIMESTAMP_X - время размещения файла в медиабиблиотеке, это не время закачки исходного и в дальнейшем перемещённого файла;
MODULE_ID - название модуля("fileman");
HEIGHT - возможно высота картинки, но точно не знаю, в моём случаи 0;
WIDTH - возможно ширина картинки, но точно не знаю, в моём случаи 0;
FILE_SIZE - размер размещённого файла;
CONTENT_TYPE - тип файла, в данном случаи поскольку файл PDF тип - "application/octet-stream";
SUBDIR - папка физического размещения файла, а данном случаи - "medialibrary/2e9";
FILE_NAME - имя физически размещённого файла в медиабиблиотеке, в данном случаи "2e9bb0e8b5e970327f0609d522a7e54d.pdf";
ORIGINAL_NAME - имя исходного файла(до размещения в медиабиблиотеке), в данном случаи "pdf.pdf";
DESCRIPTION - описание размещённого в медиабиблиотеке файла, в данном случаи - "Описание Pdf документа";
HANDLER_ID - не знаю что это, в данном случаи имеет значение NULL;
EXTERNAL_ID - не знаю что это, в данном случаи имеет значение - "03fa3a6f9c917f55f89ea307db78a8b5";
~src - не знаю что это, в данном случаи имеет значение false;
PATH - путь до файла относительно корня сайта, в данном случаи - "/upload/medialibrary/2e9/2e9bb0e8b5e970327f0609d522a7e54d.pdf";
NAME - название файла в медиабиблиотеке, в данном случаи - "NameName";
KEYWORDS - ключевые слова файла медиабиблиотеки, в данном случаи - "Ключевое 1, Ключевое 2";
~DATE_UPDATE - не знаю что это, в данном случаи - "now()";
SEARCHABLE_CONTENT - не знаю что это, в данном случаи "{NAMENAME}{ОПИСАН}{PDF}{ДОКУМЕНТ}{КЛЮЧЕВ}";
SOURCE_ID - не знаю что это, в данном случаи число 96846;
~DATE_CREATE - не знаю что это, в данном случаи - "now()";
ITEM_TYPE - не знаю что это в данном случаи - пустая строка("")
Как определить Id папок/директорий/каталога медиабиблиотеки bitrix.
В админке медиабиблиотеки битрикс я не нашёл, чтобы где то указывался идентификатор папок, тем не менее в скрипте выше нам требуется передать именно Id папки а не её название. Я нашёл 2 способа как можно узнать номер папки:
Способ 1: Метод опробован в браузере Firefox 62.0.2. Разместите в папке с которой предстоит работать какой либо файл через возможность загрузки файлов из админки. Теперь у этого файла выберите редактировать. В открывшемся меню элемента файла можно увидеть пункт коллекции - Коллекции. Выделите с помощью левой кнопки мыши текст начиная с коллекции до правой стороны названия нужной папки. Теперь нажмите правую кнопку мыши и выберите "Исходнйы код выделенного фрагмента". У себя я увидел следующее: Коллекции:</label></div><div class="mlsd-ch-col" title="Жалобы"><span>Жалобы</span><img src="/bitrix/images/1.gif" class="ml-col-del" title="Удалить элемент из коллекции" id="mlsd_it_56"> В данном куске кода имеет значение текст id="mlsd_it_56", в котором 56 и есть Id нужной папки медиабиблиотеки bitrix.
Способ 2: Так же протестирован в браузере Firefox 62.0.2. В административной панели bitrix открываем Контент - Медиабиблиотека и пока не открываем никаких папок(если открыли зайдите заново). Наживаем F12 чтобы открылась консоль браузера в ней нажимаем "Сеть". Теперь открываем нужную папку в административной панели битрикс, чтобы в ней открылись файлы(их может и не быть). Теперь в консоли браузера Вы можете последним POST запросов видеть тот который и подгрузил данные по папке, выберите его. Перейдите на вкладку параметры и в пункте данные форм у меня был такой: col_id: 56, который и содержит Id нужной папки.