- В шаблоне вывода формы создаем множественное поле
2. Создаем дополнительные поля типа Строка, где будут ссылки на файлы храниться
3. На событие добавление результата вешаем подобное:
function onBeforeResultAddHandler($WEB_FORM_ID,&$arFields,&$arrVALUES){
$input_id = "";
switch($WEB_FORM_ID){//id вебформы
case 5:
$input_id = 62;//id ответа, где будут ссылки на файлы
break;
}
if(!empty($_FILES) && $input_id!=""){
$files = reset($_FILES);
foreach($files["name"] as $id=>$name){
$arFile = array(
"name" => $name,
"tmp_name" => $files["tmp_name"][$id],
"type" => $files["type"][$id],
"MODULE_ID"=>"form",
"size"=>$files["size"][$id]
);
$res = CFile::SaveFile($arFile,"form_result");//сохраняем файлы и создаем массив ссылок на них
if($res){
$arFiles[] = "https://www.bwt.ru".CFile::GetPath($res);
}
}
$arrVALUES["form_text_".$input_id] = implode("; ",$arFiles);
}
return true;
}
Теперь при сохранении результата в файловом поле будет пусто, но файлы сохранятся и (ссылки на них).
4. В моем случае обработчик данных с форм самописный (обращение к нему идет по ajax), последовательность приблизительно: следующая:
$formId = intval($_POST["WEB_FORM_ID"]);
CForm::Check($formId, false, false, "Y", "N");//проверяем форму
if ($resultId = CFormResult::Add($formId)) {//Добавляем результат
CFormResult::Mail($resultId);//отправляем письмо, если нужно
$dbRes = CFormCrm::GetByFormID($formId);
$arLink = $dbRes->Fetch();
if (is_array($arLink) && $arLink['LINK_TYPE'] == CFormCrm::LINK_AUTO) {//если есть связь с CRM - создаем лид
$oForm = new CFormCrm();
$lead_id = $oForm->AddLead($formId, $resultId, $arLink);
}
if ($lead_id) {//если лид есть
/* лид в Битрикс24 */
$b24_response = json_decode(get_token());//тут вызов подключения к битрикс24, здесь кода не будет (важен принцип)
$leadParam = array();
$leadParam["ID"] = $lead_id;
$arFormResults = array();
$arFormAnswers = array();
$arFormResult = CFormResult::GetDataByID($resultId, array("DOCUMENT_LINK"), $arFormResults, $arFormAnswers);//DOCUMENT_LINK - символьный код поля со списком ссылок
if(reset($arFormResult["DOCUMENT_LINK"])["USER_TEXT"]!=""){
$arFiles = explode("; ",reset($arFormResult["DOCUMENT_LINK"])["USER_TEXT"]);
foreach($arFiles as $file){
$leadParam["FIELDS"]["UF_CRM_1613738699"][] = array('fileData'=>array(end(explode("/",$file)), base64_encode(file_get_contents($_SERVER["DOCUMENT_ROOT"].end(explode("bwt.ru",$file))))));//UF_CRM_1613738699 - это id нужного пользовательского поля из CRM
}
}
query($b24_response->access_token, 'crm.lead.update', $leadParam);//обновляем лид
/* лид в Битрикс24 */
}
}
После передачи лида обновляем его любым удобным способом, прикрепляя туда содержимое файлов в base64.
Минус — при удалении результаты формы файлы сами не исчезнут.