Битрикс создание формы с загрузкой файлов
- Содержание:
- 1. 1. Создание формы и подключение всех скриптов для валидации формы
- 2. 2. Создать инфоблок со свойствами, создать почтовый шаблон
- 3. 3. Создать скрипт php для проверки файлов, их загрузки, сохранением в инфоблок, отправки на почту уведомлений
Для того, чтобы создать форму с загрузкой файлов нужно:
1. Создание формы и подключение всех скриптов для валидации формы
Созданим папку /return/ и поместим туда все файлы с формой.
Файл index.php будет таким:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetPageProperty("title", "Форма с загрузкой файлов Mirdeveloper");
$APPLICATION->SetTitle("Форма с загрузкой файлов");
global $APPLICATION;
////$APPLICATION->AddHeadScript("jquery-3.3.1.min.js");
$APPLICATION->AddHeadScript("/return/jquery.mask.js");
$APPLICATION->AddHeadScript("/return/jquery.validate.min.js");
$APPLICATION->AddHeadScript("/return/script.js");
$APPLICATION->SetAdditionalCSS("/return/style.css");
?>
<div class="container">
<div class="row">
<div class="col-xl-12 col-md-4 rules_form_new">
<div class="map__feedback" style="position: relative; top: 0px; margin: 15px 0;">
<form id="form-rules-return" method="post" enctype="multipart/form-data" style="max-width: 100%;">
<div class="form-group">
<input class="map__input-text form-control" type="text" name="name" placeholder="ФИО" <?/*required=""*/?>>
</div>
<div class="form-group">
<input class="map__input-text form-control" type="text" name="phone" placeholder="Телефон" required="">
</div>
<div class="form-group">
<input class="map__input-text form-control" type="text" name="email" placeholder="E-mail" required="">
</div>
<div class="form-group">
<span class="file_name_rules">Фото 1</span>
<div class="fl_upld">
<label><input id="fl_inp" class="map__input-file form-control" type="file" name="file" placeholder="Фото отвеса" >Выберите файл</label>
<div id="fl_nm">Файл не выбран</div>
</div>
</div>
<div class="form-group">
<span class="file_name_rules">Копия 1</span>
<div class="fl_upld">
<label><input id="fl_inp1" class="map__input-file form-control" type="file" name="file1" placeholder="Копия чека" >Выберите файл</label>
<div id="fl_nm1">Файл не выбран</div>
</div>
</div>
<div class="form-group">
<input class="map__input-checkbox form-control" type="checkbox" name="terms" id="map__input-checkbox" checked="" required="">
<label class="map__input-checkbox-label terms_l" for="map__input-checkbox">Оставляя свои данные я соглашаюсь с
<a class="map__input-link" href="/privacy/">Политикой конфиденциальности</a>
</label>
</div>
<div class="result error" hidden></div>
<button class="button_fill map__button modal__button" type="submit">Отправить</button>
</form>
<!-- loader -->
<div class="formStatus-loaded">
<img class="formStatus-loaded-icon" id="loadImg" src="load.gif">
</div>
</div>
</div>
<img style="display: none;" id="loadImg" src="load.gif" />
</div>
</div>
<div class="modal fade modal__registration modal__call" id="myModalCall-done" tabindex="-1" role="dialog" aria-labelledby="myModalCallLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title map__heading" id="myModaCalllLabel">Уведомление</h4>
</div>
<div class="modal-body">
<span class="result done">
Ваша заявка успешно отправлена.
</span>
</div>
<div class="modal-footer">
<button class="button_fill map__button modal__button" data-dismiss="modal" aria-label="Close">Ок</button>
</div>
</div>
</div>
</div>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Скрипты и стили подключены через методы Битрикс. В форме с файлами будет сделана подмена стандартной кнопки (свой стили), чтобы кнопка была более презентабельной.
Далее необходимо создать файл со скриптом, script.js с содержимым кода.
$(document).ready(function(){
//добавляем маску на поле телефон
var customOptions = {
onKeyPress: function(val, e, field, options) {
if (val.replace(/\D/g, '').length===2)
{
val = val.replace('8','');
field.val(val);
}
field.mask("+7 (999) 999-99-99", options);
},
placeholder: "+7 (___) ___-__-__"
};
$("input[name=phone]").mask("+7 (999) 999-99-99", customOptions);
const formAnimationLoader = () => {
// найдем элемент с изображением загрузки и уберем невидимость:
var loaderBox = $(".formStatus-loaded");
loaderBox.toggleClass('fs-show');
}
function preg_match (regex, str) {
return (new RegExp(regex).test(str))
}
// страница c формой
$("#form-rules-return").validate({
errorPlacement: function(error, element) {
error.insertBefore(element);
},
rules: {
name:{
required: true,
minlength: 4
},
phone:{
required: true,
minlength: 5
},
email:{
required: true,
},
file:{
required: true,
},
file1:{
required: true,
},
},
messages: {
name: {
required: "Поле имя компании обязательно для заполнения",
minlength: jQuery.validator.format("Длина названия компании должна быть больше 4-ти символов")
},
phone:{
required: "Поле 'Телефон' обязательно для заполнения",
minlength: jQuery.validator.format("Проверьте правильность заполнения поля")
},
email:{
required: "Поле 'Email' обязательно для заполнения",
},
file:{
required: "Поле 'Фото 1' обязательно для заполнения",
},
file1:{
required: "Поле 'Копия 1' обязательно для заполнения",
},
},
submitHandler: function(form) {
var form = $('#form-rules-return')[0];
console.log(form);
console.log("=====");
formAnimationLoader();
$.ajax({
type: 'post',
url: '/return/ajax_form.php',
//dataType: 'json',
type: 'POST',
data: new FormData(form),
processData: false,
contentType: false,
success: function(response) {
formAnimationLoader();
//// console.log("response=" + JSON.stringify(response, null, 4));
if (response==='INVALID FILE SIZE'){
// здесь ставим своё уведомление о том, что превышен размер файла
var err_text_size = "Превышен размер файла";
//$('#form-rules-return').children('.result').text(response).show();
$('#form-rules-return').children('.result').text(err_text_size).show();
return;
}
if (response==='INVALID FILE TYPE'){
// здесь ставим своё уведомление о том, что не тот тип файла (не картинка)
var err_text = "Неверный формат файла, необходимо загружать изображения";
// $('#form-rules-return').children('.result').text(response).show();
$('#form-rules-return').children('.result').text(err_text).show();
return;
}
//получаем ответ и разбираем его, преобразуя в объект
var data_response = JSON.parse(response);// response["data"];
var data = Number(data_response["data"]);
var data_id = data_response["id"];
/*console.log(data_response);
console.log(data);
*/
if (data==1){
console.log('response='+response);
grecaptcha.reset();
$('#form-rules-return').children('.result').text('').hide();
$('#form-rules-return').each(function(indx){
$('input , textarea').removeClass("error , valid");
});
$('#form-rules-return').trigger('reset');
//$('#modal_create_act').modal('toggle');
$('#myModalCall-done span.result').html('Ваша заявка № '+data_id+' успешно отправлена. Уведомление отправлено на Ваш email адрес');
$('#myModalCall-done').modal('show');
}
else{
$('#form-rules-return').children('.result').text(response).show();
return;
}
}
});
//successForm(form);
}
});
});
$(document).ready( function() {
$("#fl_inp").change(function(){
var filename = $(this).val().replace(/.*\\/, "");
$("#fl_nm").html(filename);
});
$("#fl_inp1").change(function(){
var filename = $(this).val().replace(/.*\\/, "");
$("#fl_nm1").html(filename);
});
});
Пояснения по файлам:для валидации форм используется jquery validate. Для телефона используется маска, jquery input mask.
Если форма не заполнена, то валидатор сообщит об этом:

2. Создать инфоблок со свойствами, создать почтовый шаблон
Далее переходим в админ панель Битрикс и создаем свойства: имя, телефон, фотография, копия. Будет 2 файла с картинками.
Переходим в Настройки-Почтовые и смс события-Типы событий в меню админки Битрикс. Или по адресу: /bitrix/admin/type_edit.php?lang=ru и создаем следующее содержание.
Создаем новое событие: FORM_RULES_RETURN с памятку с полями:
#NAME# - ФИО #EMAIL# - Email #PHONE# - Телефон #PHOTO# - Фото #PHOTO1# - Фото копии
В почтовых шаблонах выбираем созданное событие FORM_RULES_RETURN и добавляем поля, которые есть в форме.
Сообщение почтового шаблона будет таким.
<table style="border-collapse: collapse; width: 378pt;"> <tbody> <tr style="height: 0pt;"> <td> <p> <span style="color: #353744;">ФИО: #NAME# </span> </p> </td> </tr> <tr style="height: 0pt;"> <td> <p> <span style="color: #353744;">Телефон: #PHONE# </span> </p> </td> </tr> <tr style="height: 0pt;"> <td> <p> <span style="color: #353744;">Электронная почта: #EMAIL# </span> </p> </td> </tr> <tr style="height: 0pt;"> <td> <p> <span style="color: #353744;"> Фото: #PHOTO#</span> </p> </td> </tr> <tr style="height: 0pt;"> <td> <p> <span style="color: #353744;"> Копия: #PHOTO1#</span> </p> </td> </tr> </tbody> </table>
3. Создать скрипт php для проверки файлов, их загрузки, сохранением в инфоблок, отправки на почту уведомлений
Скрипт называется ajax_form.php и будет со следующим содержимым.
<?
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");
?>
<?
//проверяем размер файла
if ($_FILES['file']['error']=='1'){
echo 'INVALID FILE SIZE';
die();
}
if ($_FILES['file1']['error']=='1'){
echo 'INVALID FILE SIZE';
die();
}
// если есть вложение
if (!empty($_FILES['file']['tmp_name']) && !empty($_FILES['file1']['tmp_name'])) {
//здесь проверяем расширение (картинка):
if(strripos($_FILES['file']['type'], 'image')!==false
and strripos($_FILES['file1']['type'], 'image')!==false){
// echo json_encode($_FILES);
// Закачиваем файл в /tmp_img
//для этого в корне создаем папку tmp_img
$name_file = $_FILES['file']['name'];
$name_file1 = $_FILES['file1']['name'];
$uploads_dir = $_SERVER['DOCUMENT_ROOT'].'/tmp_img';
$is_moved = move_uploaded_file($_FILES['file']['tmp_name'], "$uploads_dir/$name_file");
$is_moved1 = move_uploaded_file($_FILES['file1']['tmp_name'], "$uploads_dir/$name_file1");
if ($is_moved && $is_moved1){
// если всё ок:
// действия...
CModule::IncludeModule("iblock");
$name = $_POST["name"];
$phone = $_POST["phone"];
$email = $_POST["email"];
$el = new CIBlockElement;
$props = array();
$props['IBLOCK_ID'] = 52; // ID инфоблока
$props['ACTIVE'] = 'Y';
$props['NAME'] = 'Обращение от '.$name.' '.date('d.m.Y H:i:s');
$props['ACTIVE_FROM'] = date('d.m.Y H:i:s');
$arParams = array("replace_space" => "-", "replace_other" => "-");
$trans = Cutil::translit($name, "ru", $arParams);
$props["CODE"] = $trans.mt_rand();
$property_values = array();
//PHOTO
$property_values['PHOTO'] = CFile::MakeFileArray( $uploads_dir."/".$name_file);
$property_values['PHOTO1'] = CFile::MakeFileArray( $uploads_dir."/".$name_file1);
$property_values['PHONE'] = $phone;
$property_values['MAIL'] = $email;
$props['PROPERTY_VALUES'] = $property_values;
//добавляем элемент в инфоблок:
// unlink ($uploads_dir."/".$name_file);
if($new_el = $el->Add($props)){
unlink ($uploads_dir."/".$name_file);
unlink ($uploads_dir."/".$name_file1);
$resItemsList = CIBlockElement::GetList(
array(),
Array("IBLOCK_ID"=>52, "CODE" => $props["CODE"]),
false,
false,
array()
);
while($item = $resItemsList->GetNextElement())
{
$element = $item->GetFields();
$element['PROPERTIES'] = $item->GetProperties();
$arElems = $element; // соответствие XML_ID => ID
}
$photo_one =CFile::GetPath($arElems['PROPERTIES']['PHOTO']['VALUE']);
$photo_one_min = CFile::ResizeImageGet(
$arElems['PROPERTIES']['PHOTO']['VALUE'],
array(
'width'=>200,
'height'=>200
),
BX_RESIZE_IMAGE_PROPORTIONAL,
Array(
"name" => "sharpen",
"precision" => 0
)
);
$photo_one = "<a style='color: #4c5d68;' href='https://".$_SERVER["HTTP_HOST"].$photo_one."'>
<img style='width:200px; ' src='https://".$_SERVER["HTTP_HOST"].$photo_one_min['src']."'></a>";
$photo_to = CFile::GetPath($arElems['PROPERTIES']['PHOTO1']['VALUE']);
$photo_to_min = CFile::ResizeImageGet(
$arElems['PROPERTIES']['PHOTO1']['VALUE'],
array(
'width'=>200,
'height'=>200
),
BX_RESIZE_IMAGE_PROPORTIONAL,
Array(
"name" => "sharpen",
"precision" => 0
)
);
//$photo_to = 'https://'.$_SERVER["HTTP_HOST"].$photo_to;
$photo_to = "<a style='color: #4c5d68;' href='https://".$_SERVER["HTTP_HOST"].$photo_to."'>
<img style='width:200px; ' src='https://".$_SERVER["HTTP_HOST"].$photo_to_min['src']."'></a>";
// Отправка письма клиенту
$sitename = 's1';
$emailEvent = "FORM_RULES_RETURN";
$arEventFields = array(
'NAME' => $name,
'EMAIL' => $email,
'PHONE' => $phone,
'PHOTO' => $photo_one,
'PHOTO1' => $photo_to,
);
$return['id'] = $arElems["ID"];
$return['data'] = 1;
CEvent::SendImmediate($emailEvent, $sitename, $arEventFields);
echo json_encode($return);//'OK';
}
else{
unlink ($uploads_dir."/".$name_file);
unlink ($uploads_dir."/".$name_file1);
echo "Error: ".$el->LAST_ERROR;
}
// удаляем темповый файл:
}else{
echo 'ERROR FILE MOVED';
}
}else{
echo 'INVALID FILE TYPE';
}
}
Здесь необходимо ввести номер информационного блока, чтобы все было корректно. В данном случае это 52 инфоблок.
Также нужно создать в корне папку для временного сохранения файлов картинок: tmp_img
Вначале происходит запись в инфоблок. Затем получение файлов из инфоблока. В письме уже создается мини-версия картинок(превью) и загруженные изображения. После отсылается email сообщение на указанный адрес в шаблон. Шаблонов писем может быть несколько и может быть разное содержание.
Файлы можно прикреплять как вложения, но здесь рассмотрен более простой вариант.
Дальше уже все проверять и тестировать.
Надеюсь статья была полезной, оставьте отзыв или мнение, что можно улучшить.


Комментарии находятся на модерации или не добавлены.
Для добавления комментариев необходимо зарегистрироваться и авторизоваться
Также возможно авторизоваться через Социальную сеть Вконтакте (VK)