линия

Главная

четверг, 16 ноября 2017 г.

Bitrix: ajax загрузка фото или облегчаем себе жизнь

Недавно случился казус. Поступила задача, прикрутить к форме отправки сообщений  возможность прикрепить файлы. И чтобы был прогрессбар и смотрелось сие дело чинно и красиво. Да, задача решаема, особых сложностей не вызывает. В молодости,  я  имел вредную привычку, решать задачи в лоб. Но теперь то я не такой и зеленый. Практически на стадии зрелости. Первым делом отошел от компьютера и посмотрел в окно. На улице шел снег. Наконец то грязная последняя стадия осени сдалась и все стало бело.  Всматриваясь в даль вдруг меня осенило - по любому в битриксе есть встроенный компонент для загрузки файлов. И я сильно удивился, когда такой имелся. Обрадовался я кончено дико. Визжал от радости как подросток.



Ближе к делу


Итак, что имеем:
Обычная форма. При клике на отправить обрабатывается JQUERY и предает данные в /inlude/ajax/form.php. Разумеется все работает AJAX-ом.

Теперь добавляем в шаблон формы компонент:

$APPLICATION->IncludeComponent("bitrix:main.file.input", "drag_n_drop",
   array(
     "INPUT_NAME"=>"FILE",
     "MULTIPLE"=>"N",
     "MODULE_ID"=>"main",
     "MAX_FILE_SIZE"=>"100000",
     "ALLOW_UPLOAD"=>"F", 
     "ALLOW_UPLOAD_EXT"=>""
),
false
);?>


Ищем компонент в /bitrix/components/main.file.input/ копируем шаблон в шаблон сайта. переименуем шаблон в drag_n_drop  - на случай если будем менять стили.

Открываем форму и видим такую красоту:



Кстати, можно сделать мульти загрузку, задать маску входных файлов.
Компонент загружает файл в /upload/main/ и после загрузки возвращает id файла.


Сохранение в инфоблок и отправка письма с файлом

Открываем файл /include/ajax/form.php
Тут только пример.


CModule::IncludeModule('iblock'); 
$el = new CIBlockElement; 

$arLoadProductArray = Array(
 "MODIFIED_BY"    => 1, 
 "IBLOCK_SECTION_ID" => false,
 "IBLOCK_ID"      => 9, 
 "ACTIVE"         => "Y"
);
/*
  Проверяйте входные данные. Это только пример!
*/
$arLoadProductArray["NAME"] = $_POST['NAME'];
$arLoadProductArray['PROPERTY_VALUES']['PHONE'] = $_POST['PHONE'];
$arLoadProductArray['PROPERTY_VALUES']['FILE'] = $_POST['FILE'];
//Добавили в инфоблок
$PRODUCT_ID = $el->Add($arLoadProductArray);
//Отправляем письмо
$arSend = Array(
"NAME"=>$_POST['NAME'],
"PHONE"=> $_POST['PHONE']
);
CEvent::SendImmediate(
    $_POST['EVENT'],
    SITE_ID,
    $arSend,
    "Y",
    "",
    Array( $_POST['FILE']])
);
?>




Не все гладко у Bitrix


Ты же нутром чуешь что не все так просто у Битрикса. И твое чутье тебя не обманывает. Есть несколько нюансов.
1. Пользователь загрузил  файл. Но не отправил данные.  Таких файлов может быть много. Решил проблему так:  скопировал компонент в свое простарнство имен.  Открыл файл file.php  и код в строке 351 (  CFile::SaveFile (.......)  изменил на
if (($fileID = CFile::SaveFile($file, 'appeal_files', $md5))  appeal_files - своя папка. Получается все файлы загружаются в эту папку.
После отпавки данных можно переместить из этой папки файлы, например в main и очистить папку appeal_files . СОгласен, некарсиво, но работает.











Комментариев нет:

Отправить комментарий