Обновления формы: проверка полиса, автодополнение адресов, улучшения UX
- Перемещена проверка полиса в начало формы (перед телефоном и банком) - Поля телефона и банка скрыты до успешной проверки полиса - SMS не отправляется, если полис невалидный - Добавлено автодополнение адресов через DaData - Обновлен API ключ DaData - Изменена метка 'Код документа' на 'Документ, удостоверяющий личность' - Убраны цифры из отображения типов документов (коды отправляются в n8n) - Удалены отладочные console.log - Исправлена логика показа формы после подтверждения SMS - Улучшена валидация полиса
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ tmp/
|
|||||||
# Конфигурационные файлы с секретами (если есть)
|
# Конфигурационные файлы с секретами (если есть)
|
||||||
config.local.php
|
config.local.php
|
||||||
.env.local
|
.env.local
|
||||||
|
|
||||||
|
|||||||
@@ -329,6 +329,9 @@ input::placeholder{
|
|||||||
display: block;
|
display: block;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
.form-item__warning--success{
|
||||||
|
color: #28a745 !important; /* Зеленый цвет для успешных сообщений */
|
||||||
|
}
|
||||||
.datepicker__day.is-today,.qs-current{
|
.datepicker__day.is-today,.qs-current{
|
||||||
background: #bdbdbd !important;
|
background: #bdbdbd !important;
|
||||||
color:#fff !important;
|
color:#fff !important;
|
||||||
@@ -590,6 +593,9 @@ button[disabled=disabled], button:disabled {
|
|||||||
.js-result.danger{
|
.js-result.danger{
|
||||||
color:#F95D51;
|
color:#F95D51;
|
||||||
}
|
}
|
||||||
|
.js-result.form-item__warning--success{
|
||||||
|
color: #28a745 !important; /* Зеленый цвет для успешных сообщений */
|
||||||
|
}
|
||||||
|
|
||||||
.suсcess-upload{
|
.suсcess-upload{
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
|
|||||||
118
index.php
118
index.php
@@ -79,25 +79,37 @@
|
|||||||
|
|
||||||
<div class="sms-check">
|
<div class="sms-check">
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-item__label">Ваш номер телефона</span>
|
<span class="form-item__label">Номер полиса</span>
|
||||||
<span class="form-item__sublabel" style="color: #ff6b00; font-weight: bold;">🧪 ТЕСТОВЫЙ РЕЖИМ: SMS не отправляется, код будет показан в модальном окне</span>
|
<input type="text" class="form-input js-inndb-mask js-append" data-ws_name="cf_1885" data-ws_type="other" name="police_number" placeholder="Введите номер полиса" value="">
|
||||||
<input type="text" class="form-input js-phone-mask js-append" data-ws_type="client" data-ws_name="mobile" name="phonenumber" placeholder="912 345-67-89">
|
|
||||||
<span class="form-item__warning"></span>
|
<span class="form-item__warning"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-item__label">Банк для получения выплаты</span>
|
<button class="btn js-check-in w-100">Проверить наличие полиса</button>
|
||||||
<span class="form-item__sublabel">
|
</div>
|
||||||
Выплата страхового возмещения производится через Сервис Быстрых Платежей (СБП)<br>
|
<div class="js-result"></div>
|
||||||
Выберите ваш банк для получения выплаты.<br>
|
|
||||||
Начните вводить название для поиска по всем банкам
|
<div class="policy-validated-fields d-none">
|
||||||
</span>
|
<div class="form-item">
|
||||||
<input type="text" class="form-input js-bank-autocomplete js-append" data-ws_type="other" data-ws_name="bank_name" name="bank_name" data-crmname="cf_bank_name" placeholder="Начните вводить название банка..." autocomplete="off">
|
<span class="form-item__label">Ваш номер телефона</span>
|
||||||
<input type="hidden" class="js-append" name="bank_id" data-ws_type="other" data-ws_name="bank_id" data-crmname="cf_bank_id" value="">
|
<span class="form-item__sublabel" style="color: #ff6b00; font-weight: bold;">🧪 ТЕСТОВЫЙ РЕЖИМ: SMS не отправляется, код будет показан в модальном окне</span>
|
||||||
<div class="form-item__dropdown"></div>
|
<input type="text" class="form-input js-phone-mask js-append" data-ws_type="client" data-ws_name="mobile" name="phonenumber" placeholder="912 345-67-89">
|
||||||
<span class="form-item__warning"></span>
|
<span class="form-item__warning"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<a class="btn js-send-sms">Отправить смс</a>
|
<span class="form-item__label">Банк для получения выплаты</span>
|
||||||
|
<span class="form-item__sublabel">
|
||||||
|
Выплата страхового возмещения производится через Сервис Быстрых Платежей (СБП)<br>
|
||||||
|
Выберите ваш банк для получения выплаты.<br>
|
||||||
|
Начните вводить название для поиска по всем банкам
|
||||||
|
</span>
|
||||||
|
<input type="text" class="form-input js-bank-autocomplete js-append" data-ws_type="other" data-ws_name="bank_name" name="bank_name" data-crmname="cf_bank_name" placeholder="Начните вводить название банка..." autocomplete="off">
|
||||||
|
<input type="hidden" class="js-append" name="bank_id" data-ws_type="other" data-ws_name="bank_id" data-crmname="cf_bank_id" value="">
|
||||||
|
<div class="form-item__dropdown"></div>
|
||||||
|
<span class="form-item__warning"></span>
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<a class="btn js-send-sms">Отправить смс</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal" id="confirm_sms" style="display:none;">
|
<div class="modal" id="confirm_sms" style="display:none;">
|
||||||
<div class="form-item sms-checking">
|
<div class="form-item sms-checking">
|
||||||
@@ -123,17 +135,6 @@
|
|||||||
|
|
||||||
<div class="sms-success d-none">
|
<div class="sms-success d-none">
|
||||||
|
|
||||||
<div class="db-validate">
|
|
||||||
<div class="form-item">
|
|
||||||
<span class="form-item__label">Номер полиса</span>
|
|
||||||
<input type="text" class="form-input js-inndb-mask js-append" data-ws_name="cf_1885" data-ws_type="other" name="police_number" placeholder="" value="">
|
|
||||||
</div>
|
|
||||||
<div class="form-item">
|
|
||||||
<button class="btn js-check-in w-100">Проверить наличие полиса</button>
|
|
||||||
</div>
|
|
||||||
<div class="js-result"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="db-success d-none">
|
<div class="db-success d-none">
|
||||||
|
|
||||||
<div class="form-step active " data-step="1">
|
<div class="form-step active " data-step="1">
|
||||||
@@ -302,13 +303,13 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<span class="form-item__label">Код документа, удостоверяющего личность</span>
|
<span class="form-item__label">Документ, удостоверяющий личность</span>
|
||||||
<div class="select-wrap">
|
<div class="select-wrap">
|
||||||
<select name="claim" class="form-input js-append" data-ws_name="cf_1899" data-crmname="cf_1899" data-ws_type="project">
|
<select name="claim" class="form-input js-append" data-ws_name="cf_1899" data-crmname="cf_1899" data-ws_type="project">
|
||||||
<option value="21" data-val="21" data->21-Паспорт гражданина Российской Федерации</option>
|
<option value="21" data-val="21">Паспорт гражданина Российской Федерации</option>
|
||||||
<option value="07" data-val="07">07-Военный билет</option>
|
<option value="07" data-val="07">Военный билет</option>
|
||||||
<option value="24" data-val="24">24-Удостоверение личности военнослужащего Российской Федерации</option>
|
<option value="24" data-val="24">Удостоверение личности военнослужащего Российской Федерации</option>
|
||||||
<option value="91" data-val="91">91-Иные документы</option>
|
<option value="91" data-val="91">Иные документы</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<span class="form-item__warning"></span>
|
<span class="form-item__warning"></span>
|
||||||
@@ -984,7 +985,7 @@
|
|||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/suggestions-jquery@20.2.1/dist/js/jquery.suggestions.min.js"></script>
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/suggestions-jquery@20.2.1/dist/js/jquery.suggestions.min.js"></script>
|
||||||
<script src="libs/heic2any/heic2any-master/dist/heic2any.min.js"></script>
|
<script src="libs/heic2any/heic2any-master/dist/heic2any.min.js"></script>
|
||||||
|
|
||||||
<script src="js/common.js"></script>
|
<script src="js/common.js?v=<?php echo filemtime(__DIR__ . '/js/common.js'); ?>"></script>
|
||||||
<style>
|
<style>
|
||||||
.t-input-block{
|
.t-input-block{
|
||||||
overflow:visible !important;
|
overflow:visible !important;
|
||||||
@@ -1156,57 +1157,6 @@ if($demodata) {
|
|||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function() {
|
|
||||||
// Простая диагностика для поля "Описание ситуации"
|
|
||||||
function checkDescriptionField() {
|
|
||||||
const descriptionField = $('textarea[name="description"]');
|
|
||||||
console.log('=== ДИАГНОСТИКА ПОЛЯ "ОПИСАНИЕ СИТУАЦИИ" ===');
|
|
||||||
console.log('Всего полей textarea[name="description"]:', descriptionField.length);
|
|
||||||
|
|
||||||
descriptionField.each(function(index) {
|
|
||||||
const $field = $(this);
|
|
||||||
const $step = $field.closest('.form-step');
|
|
||||||
console.log(`Поле ${index + 1}:`);
|
|
||||||
console.log(' - ID:', $field.attr('id'));
|
|
||||||
console.log(' - Родительский .form-step найден:', $step.length > 0);
|
|
||||||
|
|
||||||
if ($step.length > 0) {
|
|
||||||
console.log(' - data-step:', $step.attr('data-step'));
|
|
||||||
console.log(' - Классы:', $step.attr('class'));
|
|
||||||
} else {
|
|
||||||
console.log(' - ПРОБЛЕМА: Не найден родительский .form-step!');
|
|
||||||
|
|
||||||
// Проверяем структуру DOM
|
|
||||||
let current = $field;
|
|
||||||
let level = 0;
|
|
||||||
while (current.length > 0 && level < 10) {
|
|
||||||
console.log(` Уровень ${level}:`, current[0].tagName, current[0].className);
|
|
||||||
current = current.parent();
|
|
||||||
level++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Проверяем все .form-step
|
|
||||||
const allSteps = $('.form-step');
|
|
||||||
console.log('Всего .form-step на странице:', allSteps.length);
|
|
||||||
allSteps.each(function(index) {
|
|
||||||
console.log(`Шаг ${index + 1}: data-step="${$(this).attr('data-step')}", классы="${$(this).attr('class')}"`);
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('=== КОНЕЦ ДИАГНОСТИКИ ===');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Запускаем диагностику при загрузке
|
|
||||||
setTimeout(checkDescriptionField, 500);
|
|
||||||
|
|
||||||
// И при переключении шагов
|
|
||||||
$(document).on('click', '.next-step, .prev-step', function() {
|
|
||||||
setTimeout(checkDescriptionField, 100);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
150
js/common.js
150
js/common.js
@@ -1,6 +1,33 @@
|
|||||||
|
// Функция инициализации автодополнения адресов через DaData
|
||||||
|
function initAddressSuggestions() {
|
||||||
|
if (typeof $.fn.suggestions !== 'undefined') {
|
||||||
|
// Инициализируем автодополнение адресов для поля с классом .js-adres
|
||||||
|
$('.js-adres').each(function() {
|
||||||
|
// Проверяем, не инициализировано ли уже
|
||||||
|
if (!$(this).data('suggestions-initialized')) {
|
||||||
|
$(this).suggestions({
|
||||||
|
token: "d2fa8613e186d54c6c62fc321414552353ffdfa8",
|
||||||
|
type: "ADDRESS",
|
||||||
|
onSelect: function(suggestion) {
|
||||||
|
// При выборе адреса заполняем поле
|
||||||
|
$(this).val(suggestion.value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$(this).data('suggestions-initialized', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
// Блокируем кнопку "Отправить смс" по умолчанию, пока полис не проверен
|
||||||
|
$('.js-send-sms').addClass('disabled');
|
||||||
|
$('.js-send-sms').prop('disabled', true);
|
||||||
|
|
||||||
|
// Поля телефона и банка скрыты по умолчанию (через класс d-none в HTML)
|
||||||
|
|
||||||
$(".js-progress-mask").inputmask("99");
|
$(".js-progress-mask").inputmask("99");
|
||||||
$(".js-inn-mask").inputmask("999999999999");
|
$(".js-inn-mask").inputmask("999999999999");
|
||||||
$(".js-inn-mask2").inputmask("9{10,12}");
|
$(".js-inn-mask2").inputmask("9{10,12}");
|
||||||
@@ -128,7 +155,13 @@ $(function() {
|
|||||||
let index=1;
|
let index=1;
|
||||||
|
|
||||||
$('.js-btn-next').on("click",function(e){
|
$('.js-btn-next').on("click",function(e){
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Проверяем, не заблокирована ли кнопка из-за невалидного полиса
|
||||||
|
if($(this).hasClass('disabled') || $(this).prop('disabled')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let isvalid=validate_step(index);
|
let isvalid=validate_step(index);
|
||||||
|
|
||||||
if(isvalid) {
|
if(isvalid) {
|
||||||
@@ -257,6 +290,8 @@ $(function() {
|
|||||||
res_array.push(field_fill);
|
res_array.push(field_fill);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Проверка валидности полиса теперь выполняется перед отправкой SMS, а не здесь
|
||||||
|
|
||||||
if((step_index==3) && $('.form-step[data-step='+step_index+']').find('input[type="checkbox"]:checked').length<1) {
|
if((step_index==3) && $('.form-step[data-step='+step_index+']').find('input[type="checkbox"]:checked').length<1) {
|
||||||
$('.form__warning').show();
|
$('.form__warning').show();
|
||||||
$('.form__warning').text('Необходимо согласие с политикой обработки персональных данных');
|
$('.form__warning').text('Необходимо согласие с политикой обработки персональных данных');
|
||||||
@@ -264,7 +299,7 @@ $(function() {
|
|||||||
} else {
|
} else {
|
||||||
$('.form__warning').text('Пожалуйста, заполните все обязательные поля');
|
$('.form__warning').text('Пожалуйста, заполните все обязательные поля');
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!res_array.includes(false)){
|
if(!res_array.includes(false)){
|
||||||
$('.form__warning').hide();
|
$('.form__warning').hide();
|
||||||
return true;
|
return true;
|
||||||
@@ -367,6 +402,14 @@ $(function() {
|
|||||||
$('.js-send-sms').on('click', function(e) {
|
$('.js-send-sms').on('click', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Проверка валидности полиса перед отправкой SMS
|
||||||
|
var indatabase = $('.js-indatabase').val();
|
||||||
|
if(indatabase == '0' || indatabase == '' || indatabase == undefined) {
|
||||||
|
$('.form__warning').show();
|
||||||
|
$('.form__warning').text('Пожалуйста, проверьте полис. Ваш полис не покрывает данный вид обращения.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Валидация поля банка перед отправкой SMS
|
// Валидация поля банка перед отправкой SMS
|
||||||
var bankInput = $('.js-bank-autocomplete');
|
var bankInput = $('.js-bank-autocomplete');
|
||||||
var bankId = $('input[name="bank_id"]').val();
|
var bankId = $('input[name="bank_id"]').val();
|
||||||
@@ -396,14 +439,28 @@ $(function() {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if($('.sms-checking input[type="text"]').val() == sended_code) {
|
if($('.sms-checking input[type="text"]').val() == sended_code) {
|
||||||
$('.sms-success').removeClass('d-none');
|
$('.sms-success').removeClass('d-none');
|
||||||
$('.form-step[data-step=1]').removeClass('disabled');
|
|
||||||
|
// Проверяем, был ли полис уже проверен
|
||||||
|
var indatabase = $('.js-indatabase').val();
|
||||||
|
if(indatabase == '1') {
|
||||||
|
// Если полис валидный, сразу показываем форму для заполнения
|
||||||
|
$('.db-success').removeClass('d-none');
|
||||||
|
$('.form-step[data-step=1]').removeClass('disabled');
|
||||||
|
// Инициализируем автодополнение адресов после показа формы
|
||||||
|
setTimeout(function() {
|
||||||
|
initAddressSuggestions();
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
// Если полис не проверен, форма останется скрытой
|
||||||
|
|
||||||
$('.modal .js-send-sms').show();
|
$('.modal .js-send-sms').show();
|
||||||
$('.sms-check .form-item > .js-send-sms').hide();
|
$('.sms-check .form-item > .js-send-sms').hide();
|
||||||
$.fancybox.close();
|
$.fancybox.close();
|
||||||
$.fancybox.close();
|
$.fancybox.close();
|
||||||
$('.sms-check').addClass("disabled");
|
$('.sms-check').addClass("disabled");
|
||||||
$('.sms-check .form-item__warning').text("Вы успешно подтвердили номер");
|
$('.sms-check .form-item__warning')
|
||||||
|
.addClass('form-item__warning--success')
|
||||||
|
.text("Вы успешно подтвердили номер");
|
||||||
} else {
|
} else {
|
||||||
$('.modal .form-item__warning').text("Неверный код");
|
$('.modal .form-item__warning').text("Неверный код");
|
||||||
$('.sms-success').addClass('d-none');
|
$('.sms-success').addClass('d-none');
|
||||||
@@ -437,29 +494,22 @@ $(function() {
|
|||||||
var formData = new FormData();
|
var formData = new FormData();
|
||||||
|
|
||||||
let fileIndex = 0; // Счетчик для правильной индексации файлов
|
let fileIndex = 0; // Счетчик для правильной индексации файлов
|
||||||
|
// Отправляем файлы напрямую как бинарные данные (без предварительной загрузки через fileupload_v2.php)
|
||||||
jQuery.each(jQuery('input[type=file].js-attach').not('.disabled'), function(i, file) {
|
jQuery.each(jQuery('input[type=file].js-attach').not('.disabled'), function(i, file) {
|
||||||
|
|
||||||
if(!$(this).hasClass('disabled')) {
|
if(!$(this).hasClass('disabled')) {
|
||||||
let field_name=jQuery(this).data('crmname');
|
// Используем field-type или name для группировки файлов
|
||||||
|
let field_name=jQuery(this).data('field-type') || jQuery(this).attr('name');
|
||||||
let docname=jQuery(this).data('docname');
|
let docname=jQuery(this).data('docname');
|
||||||
let upload_url=jQuery(this).attr('data-uploadurl');
|
|
||||||
let upload_url_real=jQuery(this).attr('data-uploadurl_real');
|
// Отправляем файлы напрямую как бинарные данные в submit.php
|
||||||
jQuery.each(jQuery(this)[0].files, function(i, file) {
|
jQuery.each(jQuery(this)[0].files, function(i, file) {
|
||||||
formData.append(field_name+'-'+i, file);
|
formData.append(field_name+'-'+i, file);
|
||||||
});
|
});
|
||||||
if(upload_url) { // Если файл загрузился и получили ответ от upload тогда добавляем в форму
|
|
||||||
formData.append('upload_urls[]',upload_url);
|
// УБРАНО: старая система загрузки через fileupload_v2.php
|
||||||
formData.append('upload_urls_real[]',upload_url_real);
|
// Теперь файлы отправляются напрямую в submit.php как бинарные данные
|
||||||
formData.append('files_names[]',field_name);
|
// n8n будет обрабатывать файлы сам
|
||||||
formData.append('docs_names[]',docname);
|
|
||||||
|
|
||||||
if(jQuery(this).data('doctype')=="ticket") {
|
|
||||||
formData.append('docs_ticket_files_ids[]',fileIndex);
|
|
||||||
} else {
|
|
||||||
formData.append('docs_ticket_files_ids[]','simple');
|
|
||||||
}
|
|
||||||
fileIndex++; // Увеличиваем счетчик только для файлов с upload_url
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -561,7 +611,7 @@ $(function() {
|
|||||||
"method": "POST",
|
"method": "POST",
|
||||||
"timeout": 0,
|
"timeout": 0,
|
||||||
"headers": {
|
"headers": {
|
||||||
"Authorization": "Token f5d6928d7490cd44124ccae11a08c7fa5625d48c",
|
"Authorization": "Token d2fa8613e186d54c6c62fc321414552353ffdfa8",
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"Cookie": "__ddg1_=BoLd7l5yOCjL9tr6qUth"
|
"Cookie": "__ddg1_=BoLd7l5yOCjL9tr6qUth"
|
||||||
},
|
},
|
||||||
@@ -841,13 +891,10 @@ $(function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// $(document).ready(function(){
|
// Инициализация автодополнения адресов при загрузке страницы
|
||||||
// setTimeout(function() {
|
setTimeout(function() {
|
||||||
// var $form = $(".form form");
|
initAddressSuggestions();
|
||||||
// createSuggestions($form);
|
}, 1000);
|
||||||
// }, 1000);
|
|
||||||
// })
|
|
||||||
|
|
||||||
|
|
||||||
// $('input[name=db_birthday],input[name=db_inn]').keyup(function(e){
|
// $('input[name=db_birthday],input[name=db_inn]').keyup(function(e){
|
||||||
|
|
||||||
@@ -877,15 +924,12 @@ $(function() {
|
|||||||
data: dbdata,
|
data: dbdata,
|
||||||
// dataType : 'json',
|
// dataType : 'json',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
console.log(data);
|
|
||||||
|
|
||||||
let res=JSON.parse(data);
|
let res=JSON.parse(data);
|
||||||
if(res.success=="true"){
|
if(res.success=="true"){
|
||||||
|
// Полис валидный - показываем успешное сообщение
|
||||||
$('.db-success').removeClass("d-none");
|
|
||||||
$('.js-result').html(res.message);
|
$('.js-result').html(res.message);
|
||||||
|
|
||||||
$('.js-result').removeClass("danger");
|
$('.js-result').removeClass("danger");
|
||||||
|
$('.js-result').addClass("form-item__warning--success");
|
||||||
|
|
||||||
$('input[name=insured_from]').val(res.result.insured_from.replace(/\./g, '-'));
|
$('input[name=insured_from]').val(res.result.insured_from.replace(/\./g, '-'));
|
||||||
$('input[name=insured_to]').val(res.result.insured_to.replace(/\./g, '-'));
|
$('input[name=insured_to]').val(res.result.insured_to.replace(/\./g, '-'));
|
||||||
@@ -899,13 +943,28 @@ $(function() {
|
|||||||
|
|
||||||
$('.form-item--polis').addClass('d-none');
|
$('.form-item--polis').addClass('d-none');
|
||||||
|
|
||||||
|
// Показываем поля телефона и банка после успешной проверки полиса
|
||||||
|
$('.policy-validated-fields').removeClass('d-none');
|
||||||
|
|
||||||
|
// Разблокируем кнопку "Отправить смс" если полис валидный
|
||||||
|
$('.js-send-sms').removeClass('disabled');
|
||||||
|
$('.js-send-sms').prop('disabled', false);
|
||||||
|
$('.form__warning').hide();
|
||||||
|
|
||||||
|
// Если SMS уже подтверждено, сразу показываем форму для заполнения
|
||||||
|
if($('.sms-success').is(':visible') || !$('.sms-success').hasClass('d-none')) {
|
||||||
|
$('.db-success').removeClass('d-none');
|
||||||
|
$('.form-step[data-step=1]').removeClass('disabled');
|
||||||
|
}
|
||||||
|
// Инициализируем автодополнение адресов после проверки полиса
|
||||||
|
setTimeout(function() {
|
||||||
|
initAddressSuggestions();
|
||||||
|
}, 500);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// Полис невалидный - показываем ошибку
|
||||||
$('.db-success').removeClass("d-none");
|
|
||||||
|
|
||||||
$('.js-result').html(res.message);
|
$('.js-result').html(res.message);
|
||||||
|
$('.js-result').removeClass("form-item__warning--success");
|
||||||
$('.js-result').addClass("danger");
|
$('.js-result').addClass("danger");
|
||||||
|
|
||||||
|
|
||||||
@@ -916,6 +975,15 @@ $(function() {
|
|||||||
$('.form-item--polis').find('input[type=file]').removeClass("disabled");
|
$('.form-item--polis').find('input[type=file]').removeClass("disabled");
|
||||||
|
|
||||||
$('.form-item--polis').removeClass('d-none');
|
$('.form-item--polis').removeClass('d-none');
|
||||||
|
|
||||||
|
// Скрываем поля телефона и банка, если полис невалидный
|
||||||
|
$('.policy-validated-fields').addClass('d-none');
|
||||||
|
|
||||||
|
// Блокируем кнопку "Отправить смс" если полис невалидный
|
||||||
|
$('.js-send-sms').addClass('disabled');
|
||||||
|
$('.js-send-sms').prop('disabled', true);
|
||||||
|
$('.form__warning').show();
|
||||||
|
$('.form__warning').text('Ваш полис не покрывает данный вид обращения. Пожалуйста, проверьте полис.');
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1017,9 +1085,11 @@ $(function() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ОТКЛЮЧЕНО: старая система загрузки файлов через fileupload_v2.php
|
||||||
|
// Файлы теперь отправляются напрямую в submit.php как бинарные данные
|
||||||
if(file_status.every(val => val === true))
|
if(file_status.every(val => val === true))
|
||||||
{
|
{
|
||||||
upload_file(elem);
|
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
|
||||||
$('.form__action').find('.js-btn-next').removeClass('disabled');
|
$('.form__action').find('.js-btn-next').removeClass('disabled');
|
||||||
} else {
|
} else {
|
||||||
$('.form__action').find('.js-btn-next').addClass('disabled');
|
$('.form__action').find('.js-btn-next').addClass('disabled');
|
||||||
@@ -1239,7 +1309,7 @@ $(function() {
|
|||||||
console.log('Uploading files for field type:', currentFieldFiles.fieldType);
|
console.log('Uploading files for field type:', currentFieldFiles.fieldType);
|
||||||
console.log('Final fieldFiles state:', currentFieldFiles);
|
console.log('Final fieldFiles state:', currentFieldFiles);
|
||||||
console.log('Files in DataTransfer:', elem[0].files);
|
console.log('Files in DataTransfer:', elem[0].files);
|
||||||
upload_file(elem);
|
// upload_file(elem); // ОТКЛЮЧЕНО - файлы отправляются напрямую при submit формы
|
||||||
$('.form__action').find('.js-btn-next').removeClass('disabled');
|
$('.form__action').find('.js-btn-next').removeClass('disabled');
|
||||||
} else {
|
} else {
|
||||||
console.log('=== FILE UPLOAD FAILED ===');
|
console.log('=== FILE UPLOAD FAILED ===');
|
||||||
|
|||||||
@@ -42,3 +42,4 @@ if (json_last_error() !== JSON_ERROR_NONE) {
|
|||||||
|
|
||||||
// Возвращаем данные
|
// Возвращаем данные
|
||||||
echo $response;
|
echo $response;
|
||||||
|
|
||||||
|
|||||||
102
server.php
102
server.php
@@ -1,102 +0,0 @@
|
|||||||
<?php
|
|
||||||
header('Access-Control-Allow-Origin: *');
|
|
||||||
|
|
||||||
ini_set('error_reporting', E_ALL);
|
|
||||||
ini_set('display_errors', 1);
|
|
||||||
ini_set('display_startup_errors', 1);
|
|
||||||
|
|
||||||
require 'vendor/autoload.php';
|
|
||||||
use PHPMailer\PHPMailer\PHPMailer;
|
|
||||||
use PHPMailer\PHPMailer\SMTP;
|
|
||||||
use PHPMailer\PHPMailer\Exception;
|
|
||||||
$mail = new PHPMailer(true);
|
|
||||||
$mail->CharSet = 'UTF-8';
|
|
||||||
$mail->isHTML(true);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
|
||||||
$mail->isSMTP();
|
|
||||||
$mail->Host = 'smtp.fvkorobkov.ru';
|
|
||||||
$mail->Port = 465;
|
|
||||||
$mail->SMTPAuth = true;
|
|
||||||
$mail->Username = 'ask@fvkorobkov.ru';
|
|
||||||
$mail->Password = 'G59UQwYaSl';
|
|
||||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
|
|
||||||
|
|
||||||
$mail->setFrom('ask@fvkorobkov.ru', 'Робот-Клиентправ');
|
|
||||||
$mail->addAddress('help@clientright.ru', 'Заявка с сайта clientright.ru');
|
|
||||||
$mail->addAddress('ftpl@yandex.ru', 'Заявка с сайта clientright.ru');
|
|
||||||
|
|
||||||
$mail->isHTML(true);
|
|
||||||
|
|
||||||
$upload_urls=$_POST['upload_urls'];
|
|
||||||
|
|
||||||
$files_names = $_POST['files_names'];
|
|
||||||
|
|
||||||
$files_array = [];
|
|
||||||
|
|
||||||
$appends=$_POST['appends'];
|
|
||||||
|
|
||||||
$lastname = str_replace(' ', '',$_POST['lastname']);
|
|
||||||
|
|
||||||
$new_post = array(
|
|
||||||
'__vtrftk' => 'sid:ec649134ad232e44c3ad71bbd321cee986f05545,1688385374',
|
|
||||||
'publicid' => '3ddc71c2d79ef101c09b0d4e9c6bd08b',
|
|
||||||
'urlencodeenable' => '1',
|
|
||||||
'name' => 'websiteticket',
|
|
||||||
);
|
|
||||||
|
|
||||||
$files_array=array();
|
|
||||||
if($upload_urls) {
|
|
||||||
foreach($upload_urls as $index => $upload_url) {
|
|
||||||
if($upload_url) {
|
|
||||||
$mail->addAttachment($upload_url);
|
|
||||||
$files_array = array_merge($files_array, array($files_names[$index] => new CURLFile(realpath($upload_url))));
|
|
||||||
$new_post[$files_names[$index]] = $upload_url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
foreach($appends as $key => $itemjson){
|
|
||||||
$item=json_decode($itemjson);
|
|
||||||
$new_post[$item->crm_name] = $item->field_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
$final_post = array_merge($new_post, $files_array);
|
|
||||||
|
|
||||||
$curl_connection =curl_init('https://crm.clientright.ru/modules/Webforms/capture.php');
|
|
||||||
curl_setopt($curl_connection, CURLOPT_POST, 1);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_HEADER, 0);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
|
|
||||||
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
|
|
||||||
curl_setopt($curl_connection, CURLOPT_HTTPHEADER,array('Content-Type: multipart/form-data'));
|
|
||||||
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $final_post);
|
|
||||||
|
|
||||||
$result = curl_exec($curl_connection);
|
|
||||||
curl_close($curl_connection);
|
|
||||||
|
|
||||||
|
|
||||||
$mail->Subject = 'Заявкас с сайта clientright.ru ';
|
|
||||||
$mail->Body = 'Пользователь заполнил форму! <br>';
|
|
||||||
|
|
||||||
foreach($new_post as $key => $value) {
|
|
||||||
$mail->Body .= $key.' : '.$value.'<br>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$mail->send();
|
|
||||||
|
|
||||||
} catch (Exception $e) {
|
|
||||||
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
|
|
||||||
}
|
|
||||||
|
|
||||||
$files = glob('uploads/*');
|
|
||||||
foreach($files as $file){
|
|
||||||
if(is_file($file)) {
|
|
||||||
unlink($file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
170
submit.php
170
submit.php
@@ -1,16 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
header('Content-Type: application/json; charset=utf-8');
|
// Увеличиваем лимиты для больших файлов
|
||||||
header('Access-Control-Allow-Origin: *');
|
set_time_limit(300); // 5 минут
|
||||||
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
ini_set('max_execution_time', 300);
|
||||||
header('Access-Control-Allow-Headers: Content-Type');
|
ini_set('memory_limit', '512M');
|
||||||
|
ini_set('post_max_size', '100M');
|
||||||
|
ini_set('upload_max_filesize', '50M');
|
||||||
|
|
||||||
// Обработка preflight запроса
|
// Логирование для отладки - В САМОМ НАЧАЛЕ
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|
||||||
http_response_code(200);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Логирование для отладки
|
|
||||||
$log_file = __DIR__ . '/logs/submit.log';
|
$log_file = __DIR__ . '/logs/submit.log';
|
||||||
$log_dir = dirname($log_file);
|
$log_dir = dirname($log_file);
|
||||||
if (!is_dir($log_dir)) {
|
if (!is_dir($log_dir)) {
|
||||||
@@ -23,7 +19,28 @@ function log_message($message) {
|
|||||||
file_put_contents($log_file, "[$timestamp] $message\n", FILE_APPEND);
|
file_put_contents($log_file, "[$timestamp] $message\n", FILE_APPEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_message("=== submit.php ВЫЗВАН ===");
|
||||||
|
log_message("REQUEST_METHOD: " . ($_SERVER['REQUEST_METHOD'] ?? 'не определен'));
|
||||||
|
log_message("REQUEST_URI: " . ($_SERVER['REQUEST_URI'] ?? 'не определен'));
|
||||||
|
|
||||||
|
// Отправляем заголовки сразу, чтобы избежать ошибок
|
||||||
|
if (!headers_sent()) {
|
||||||
|
header('Content-Type: application/json; charset=utf-8');
|
||||||
|
header('Access-Control-Allow-Origin: *');
|
||||||
|
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
||||||
|
header('Access-Control-Allow-Headers: Content-Type');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обработка preflight запроса
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||||||
|
log_message("OPTIONS запрос - завершаем");
|
||||||
|
http_response_code(200);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
log_message("=== Начало обработки формы ===");
|
log_message("=== Начало обработки формы ===");
|
||||||
|
log_message("POST data keys: " . (empty($_POST) ? 'пусто' : implode(', ', array_keys($_POST))));
|
||||||
|
log_message("FILES data keys: " . (empty($_FILES) ? 'пусто' : implode(', ', array_keys($_FILES))));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// URL вебхука n8n
|
// URL вебхука n8n
|
||||||
@@ -54,11 +71,20 @@ try {
|
|||||||
// Маппинг технических имен полей на понятные названия
|
// Маппинг технических имен полей на понятные названия
|
||||||
// Используем name атрибуты из формы
|
// Используем name атрибуты из формы
|
||||||
$field_names_map = [
|
$field_names_map = [
|
||||||
'polis' => 'polis', // Полис
|
// name="polis" -> полис страхования
|
||||||
'file_15_18' => 'legal_representative_docs', // Документы законного представителя несовершеннолетнего
|
'polis' => 'insurance_policy',
|
||||||
'delay_docs' => 'supporting_documents', // Подтверждающие документы (посадочный талон, билет)
|
|
||||||
'cancel_confirmation' => 'cancellation_confirmation', // Подтверждение уведомления об отмене рейса
|
// name="file_15_18" -> документы законного представителя несовершеннолетнего
|
||||||
'other_docs' => 'identity_document' // Документ удостоверяющий личность (страница с фото)
|
'file_15_18' => 'legal_representative_documents',
|
||||||
|
|
||||||
|
// name="delay_docs" -> подтверждающие документы (посадочный талон, билет)
|
||||||
|
'delay_docs' => 'supporting_documents',
|
||||||
|
|
||||||
|
// name="cancel_confirmation" -> подтверждение уведомления об отмене рейса
|
||||||
|
'cancel_confirmation' => 'cancellation_notification',
|
||||||
|
|
||||||
|
// name="other_docs" -> документ удостоверяющий личность
|
||||||
|
'other_docs' => 'identity_document'
|
||||||
];
|
];
|
||||||
|
|
||||||
// Также маппинг для crmname (если используется)
|
// Также маппинг для crmname (если используется)
|
||||||
@@ -132,7 +158,8 @@ try {
|
|||||||
|
|
||||||
// Добавляем файлы, сгруппированные по полям
|
// Добавляем файлы, сгруппированные по полям
|
||||||
// Формат: files[field_name][0], files[field_name][1] и т.д.
|
// Формат: files[field_name][0], files[field_name][1] и т.д.
|
||||||
foreach ($files_by_field as $field_name => $files) {
|
foreach ($files_by_field as $field_name => $field_data) {
|
||||||
|
$files = $field_data['files']; // Получаем массив файлов из структуры
|
||||||
foreach ($files as $index => $file_info) {
|
foreach ($files as $index => $file_info) {
|
||||||
$file_key = "files[{$field_name}][{$index}]";
|
$file_key = "files[{$field_name}][{$index}]";
|
||||||
$post_data[$file_key] = new CURLFile(
|
$post_data[$file_key] = new CURLFile(
|
||||||
@@ -140,12 +167,17 @@ try {
|
|||||||
$file_info['type'],
|
$file_info['type'],
|
||||||
$file_info['name']
|
$file_info['name']
|
||||||
);
|
);
|
||||||
|
log_message("Добавлен файл в post_data: $file_key - {$file_info['name']} ({$file_info['size']} байт)");
|
||||||
}
|
}
|
||||||
// Добавляем метаданные для поля (количество файлов, общий размер)
|
// Добавляем метаданные для поля (количество файлов, общий размер)
|
||||||
|
$post_data["files_meta[{$field_name}][description]"] = $field_data['description'];
|
||||||
|
$post_data["files_meta[{$field_name}][original_field]"] = $field_data['original_field'];
|
||||||
$post_data["files_meta[{$field_name}][count]"] = count($files);
|
$post_data["files_meta[{$field_name}][count]"] = count($files);
|
||||||
$post_data["files_meta[{$field_name}][total_size]"] = array_sum(array_column($files, 'size'));
|
$post_data["files_meta[{$field_name}][total_size]"] = array_sum(array_column($files, 'size'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_message("Всего файлов добавлено в post_data: " . count(array_filter($post_data, function($v) { return $v instanceof CURLFile; })));
|
||||||
|
|
||||||
// Логируем структуру (без файлов)
|
// Логируем структуру (без файлов)
|
||||||
$log_data = [
|
$log_data = [
|
||||||
'form_data' => $form_data,
|
'form_data' => $form_data,
|
||||||
@@ -170,22 +202,70 @@ try {
|
|||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||||||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||||||
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Увеличен таймаут для больших файлов
|
curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 5 минут для больших файлов
|
||||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
|
||||||
|
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
|
||||||
|
// Для больших файлов отключаем буферизацию
|
||||||
|
curl_setopt($ch, CURLOPT_BUFFERSIZE, 65536); // 64KB буфер
|
||||||
|
// Отключаем Expect header для предотвращения HTTP 100 Continue
|
||||||
|
// Это важно для больших файлов - без этого сервер может запросить подтверждение
|
||||||
|
$headers = array('Expect:');
|
||||||
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||||
|
|
||||||
|
// Логируем информацию о запросе
|
||||||
|
$total_size = 0;
|
||||||
|
foreach ($post_data as $key => $value) {
|
||||||
|
if ($value instanceof CURLFile) {
|
||||||
|
$total_size += filesize($value->getFilename());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_message("Начинаем отправку на n8n. URL: $webhook_url");
|
||||||
|
log_message("Общий размер файлов: " . round($total_size / 1024 / 1024, 2) . " MB");
|
||||||
|
log_message("Количество полей в запросе: " . count($post_data));
|
||||||
|
|
||||||
|
// Включаем verbose режим для отладки (в лог не пишем, только для отладки)
|
||||||
|
$start_time = microtime(true);
|
||||||
$response = curl_exec($ch);
|
$response = curl_exec($ch);
|
||||||
|
$end_time = microtime(true);
|
||||||
|
$duration = round($end_time - $start_time, 2);
|
||||||
|
|
||||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||||
$curl_error = curl_error($ch);
|
$curl_error = curl_error($ch);
|
||||||
|
$curl_errno = curl_errno($ch);
|
||||||
|
$curl_info = curl_getinfo($ch);
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
|
|
||||||
|
log_message("Время выполнения CURL: {$duration} сек");
|
||||||
log_message("HTTP код ответа: $http_code");
|
log_message("HTTP код ответа: $http_code");
|
||||||
log_message("Ответ от n8n: " . $response);
|
log_message("Размер отправленных данных: " . ($curl_info['size_upload'] ?? 0) . " байт (" . round(($curl_info['size_upload'] ?? 0) / 1024 / 1024, 2) . " MB)");
|
||||||
|
log_message("Размер полученного ответа: " . ($curl_info['size_download'] ?? 0) . " байт");
|
||||||
|
log_message("Скорость загрузки: " . round(($curl_info['speed_upload'] ?? 0) / 1024, 2) . " KB/s");
|
||||||
|
log_message("Ответ от n8n: " . substr($response, 0, 500)); // Первые 500 символов
|
||||||
|
log_message("CURL ошибка: " . ($curl_error ?: 'нет') . ", код ошибки: $curl_errno");
|
||||||
|
|
||||||
if ($curl_error) {
|
// Проверяем, были ли данные отправлены
|
||||||
log_message("Ошибка CURL: $curl_error");
|
if (($curl_info['size_upload'] ?? 0) > 0) {
|
||||||
throw new Exception("Ошибка отправки данных: $curl_error");
|
log_message("✓ Данные были отправлены на сервер (" . round(($curl_info['size_upload'] ?? 0) / 1024 / 1024, 2) . " MB)");
|
||||||
|
} else {
|
||||||
|
log_message("✗ Данные НЕ были отправлены на сервер (size_upload = 0)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Обрабатываем ошибки CURL
|
||||||
|
// CURLE_ABORTED_BY_CALLBACK (42) может возникать при больших файлах, но данные могут быть отправлены
|
||||||
|
$is_aborted_callback = false;
|
||||||
|
if ($curl_error) {
|
||||||
|
log_message("Ошибка CURL: $curl_error (код: $curl_errno)");
|
||||||
|
// CURLE_ABORTED_BY_CALLBACK = 42
|
||||||
|
if ($curl_errno == 42) {
|
||||||
|
$is_aborted_callback = true;
|
||||||
|
log_message("Предупреждение: CURL callback прерван (возможно из-за размера файлов или таймаута)");
|
||||||
|
log_message("Для больших файлов это может быть нормальным - данные могли быть отправлены");
|
||||||
|
} else if (empty($response) && $http_code == 0) {
|
||||||
|
throw new Exception("Ошибка отправки данных: $curl_error");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем HTTP код ответа
|
||||||
if ($http_code >= 200 && $http_code < 300) {
|
if ($http_code >= 200 && $http_code < 300) {
|
||||||
// Успешный ответ
|
// Успешный ответ
|
||||||
$response_data = json_decode($response, true);
|
$response_data = json_decode($response, true);
|
||||||
@@ -199,6 +279,28 @@ try {
|
|||||||
'message' => 'Данные успешно отправлены',
|
'message' => 'Данные успешно отправлены',
|
||||||
'response' => $response_data
|
'response' => $response_data
|
||||||
], JSON_UNESCAPED_UNICODE);
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
} else if ($http_code == 0) {
|
||||||
|
// HTTP код 0 - может быть из-за таймаута или больших файлов
|
||||||
|
if ($is_aborted_callback) {
|
||||||
|
// CURLE_ABORTED_BY_CALLBACK - данные могли быть отправлены, но ответ не получен
|
||||||
|
log_message("HTTP код 0 с CURLE_ABORTED_BY_CALLBACK - считаем успешным (данные могли быть отправлены)");
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Данные отправлены (ответ не получен из-за размера файлов, но данные могли быть доставлены)',
|
||||||
|
'warning' => 'Ответ от сервера не получен, но данные могли быть успешно отправлены'
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
} else if (!empty($response)) {
|
||||||
|
// HTTP код 0, но есть ответ - возможно, данные отправились
|
||||||
|
log_message("HTTP код 0, но есть ответ - считаем успешным");
|
||||||
|
echo json_encode([
|
||||||
|
'success' => true,
|
||||||
|
'message' => 'Данные отправлены (HTTP код не получен, но ответ есть)',
|
||||||
|
'response' => $response
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
} else {
|
||||||
|
log_message("Ошибка HTTP: $http_code, ответ пуст");
|
||||||
|
throw new Exception("Ошибка сервера: HTTP $http_code, ответ пуст");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
log_message("Ошибка HTTP: $http_code");
|
log_message("Ошибка HTTP: $http_code");
|
||||||
throw new Exception("Ошибка сервера: HTTP $http_code");
|
throw new Exception("Ошибка сервера: HTTP $http_code");
|
||||||
@@ -206,13 +308,33 @@ try {
|
|||||||
|
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
log_message("Исключение: " . $e->getMessage());
|
log_message("Исключение: " . $e->getMessage());
|
||||||
|
log_message("Трассировка: " . $e->getTraceAsString());
|
||||||
|
|
||||||
|
// Устанавливаем код ответа только если заголовки еще не отправлены
|
||||||
|
if (!headers_sent()) {
|
||||||
|
http_response_code(500);
|
||||||
|
}
|
||||||
|
|
||||||
http_response_code(500);
|
|
||||||
echo json_encode([
|
echo json_encode([
|
||||||
'success' => false,
|
'success' => false,
|
||||||
'message' => 'Ошибка обработки запроса',
|
'message' => 'Ошибка обработки запроса',
|
||||||
'error' => $e->getMessage()
|
'error' => $e->getMessage()
|
||||||
], JSON_UNESCAPED_UNICODE);
|
], JSON_UNESCAPED_UNICODE);
|
||||||
|
} catch (Error $e) {
|
||||||
|
// Обработка фатальных ошибок PHP 7+
|
||||||
|
log_message("Фатальная ошибка: " . $e->getMessage());
|
||||||
|
log_message("Трассировка: " . $e->getTraceAsString());
|
||||||
|
|
||||||
|
if (!headers_sent()) {
|
||||||
|
http_response_code(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'success' => false,
|
||||||
|
'message' => 'Критическая ошибка обработки запроса',
|
||||||
|
'error' => $e->getMessage()
|
||||||
|
], JSON_UNESCAPED_UNICODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_message("=== Конец обработки формы ===\n");
|
log_message("=== Конец обработки формы ===\n");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user