• Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    SpeakyLlve91, у них должна быть документация или готовый обработчик, который настроен на приём форм с ajax.
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    Не очень ясно, зачем им быть в консоли, и где происходит вывод в консоль тоже не ясно. У меня с абстрактным Ваней всё окей, прикладываю скриншот с var_dump ($data). Если какая-то жесть приходит на ajax.php, значит, этот шаблонный скрипт и отправляет жесть в любом случае. Главное, что достаются данные и отправляется эмейл. Я не уверен, но, кажется, дело в том, что этот скрипт ожидает, что php обработчик вернёт все те же самые данные, которые только что были отправлены. Если так, то на сервере попробуйте в конце, где
    echo (json_encode ($response));
    написать
    echo (json_encode ($data));
    И ещё. Пробовал найти по этому скрипту https://pastebin.com/raw/UeXtHCre фразы "Спасибо", "в ближайшее время" и т.д., как на вашем скриншоте с дизайном. Ничего подобного там нет, только титры с ошибками. Похоже, что нужно к массиву $data до того, как он будет преобразован через json_encode, добавить элемент с ответом. Какой - не знаю, но наверняка тот, который ожидает скрипт. Если совсем туго будет, то просто переопределите функцию y, чтобы она вызывала нужный экран, т.к., ещё раз повторюсь, на стороне сервера всё выглядит ок.

    5c44600fce284667263466.png
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    Окей. Теперь смотрите.
    Я не могу знать обо всех полях, которые отправляет Ваш скрипт, но абстрактный Ваня с именем, эмейлом и телефоном, указанный в объекте, проходит валидацию. Вам нужно кое-что заменить в клиентской и серверной частях.

    Клиентская часть.

    1. Поменяйте
    data:
      {
        name: 'Ваня',
        email: 'vanya@example.com',
        phone: '8 800 5553535'
      },

    на
    data: v,

    2. Поменяйте
    success: function (data)
      {
        try
        {
          data = $.parseJSON (data);
          if (data['status'] == 'ok')
            alert (data['message']);
          else
            alert (data['status']);
        }
        catch (e)
        {
          alert (data);
        }
      }

    на
    success: y

    Серверная часть

    1. В строчке поменяйте эмейл в кавычках
    $admin_email = 'admin@example.ru';
    на тот эмейл, на который должны приходить письма.

    2. В следующем куске кода придётся описать все те переменные, которые приходят с объектом v.
    // Проверяем, есть ли в массиве нужные нам значения
    if
    (
    (isset ($data['name'])) && ($data['name']) &&
    (isset ($data['email'])) && ($data['email']) &&
    (isset ($data['phone'])) && ($data['phone'])
    )
    {
    	// Сбор и отправка письма владельцу лендинга (переменная с email'ом задана в начале листинга)
    	// Рекомендую установить и использовать PHPMailer вместо стандартной функции mail
    	$mail_subject = "Форма обратной связи";
    	$mail_message = "Имя: " . $data['name'] . "\r\n";
    	$mail_message .= "Email: " . $data['email'] . "\r\n";
    	$mail_message .= "Телефон: " . $data['phone'];
    	mail ($admin_email, $mail_subject, $mail_message);

    Например, на вашем скриншоте на сайте не вижу поля с эмейлом. Значит, везде, где $data['email'], стираем. Если возникнут какие-то ошибки, то, вероятно, поля, передаваемые с объектом v, могут иметь другие имена, отличные от тех, что в скрипте. Это вам нужно проконтролировать самостоятельно. Справитесь?
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    SpeakLive91, не удалось разобраться. Ох уж эти шаблоны.
    Предлагаю попробовать другое решение. Сделайте на всякий случай бекап вашего клиентского скрипта.
    Далее, поменяйте всю вот эту часть с ajax на стороне клиента на код ниже
    $.ajax
    ({
    	url: '/ajax.php',
    	data:
    	{
    		name: 'Ваня',
    		email: 'vanya@example.com',
    		phone: '8 800 5553535'
    	},
    	success: function (data)
    	{
    		try
    		{
    			data = $.parseJSON (data);
    			if (data['status'] == 'ok')
    				alert (data['message']);
    			else
    			  alert (data['status']);
    		}
    		catch (e)
    		{
    			alert (data);
    		}
    	}
    });


    А на стороне сервера в ajax.php сделайте так:
    <?
    // Email владельца лендинга, на который придёт форма
    $admin_email = 'admin@example.ru';
    
    // Сразу объявляем массив ответа клиенту
    $response = [];
    $response['status'] = 'during';
    $data = $_GET;
    
    // Проверяем, есть ли в массиве нужные нам значения
    if
    (
    (isset ($data['name'])) && ($data['name']) &&
    (isset ($data['email'])) && ($data['email']) &&
    (isset ($data['phone'])) && ($data['phone'])
    )
    {
    	// Сбор и отправка письма владельцу лендинга (переменная с email'ом задана в начале листинга)
    	// Рекомендую установить и использовать PHPMailer вместо стандартной функции mail
    	$mail_subject = "Форма обратной связи";
    	$mail_message = "Имя: " . $data['name'] . "\r\n";
    	$mail_message .= "Email: " . $data['email'] . "\r\n";
    	$mail_message .= "Телефон: " . $data['phone'];
    	mail ($admin_email, $mail_subject, $mail_message);
    
    	// Установка статуса ответа ок и текста для того, чтобы вывести сообщение
    	$response['status'] = 'ok';
    	$response['message'] = 'Спасибо! Ваша заявка принята.';
    }
    // Если не все поля формы были заполнены или не все дошли до сервера
    else
    {
    	$response['status'] = 'error_data_is_not_complete';
    }
    
    // Вывод (отправка обратно) Json-представления ответа, который легко можно распарсить на стороне клиента
    // Если что-то пошло не так, то в объекте ответа будет status с ошибкой, иначе будет status: ok.
    echo (json_encode ($response));
    exit;
    ?>


    Я заменил POST запрос на GET и убрал преобразование в Json при отправке на сервер. Проверьте, что всплывает "Спасибо..." через стандартный алерт, потом отпишите.
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    SpeakLive91, в вашем коде отправляется объект "v". Что в него пишется? Также success и error ссылаются на одну функцию "y", что странно. Можно код этой функции тоже?
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    Хм, теперь какая-то хрень с обработчиком на php.
    В данный момент при положительном результате должно вывестись "Спасибо! Ваша заявка принята." через стандартный алерт. Как только убеждаемся, что выводятся "Спасибо! ...", меняем success обратно на код ниже, чтобы выводилась уже форма с Вашим дизайном.
    success: y,
    На сервере переменная $_POST['data'] почему-то не существует, хотя должна. Сейчас попробую запустить у себя код.
  • Что нужно включить в серверную часть PHP для формы обратной связи (JS, Ajax)?

    @sorokinfil
    Попробуйте убрать
    data = $.parseJSON (data);
    из клиентского кода. Похоже, что оно автоматом преобразуется.
  • Как заставить работать прокси socket.io через nginx на Ubuntu?

    @sorokinfil Автор вопроса
    Спасибо! Теперь, кажется, всё работает.
  • Как заставить работать прокси socket.io через nginx на Ubuntu?

    @sorokinfil Автор вопроса
    С одной стороны не помогло. С другой, что удивительно, до ноды начал доходить emit дисконнекта с клиента, который отправляется автоматически при разрыве соединения. При этом любые другие emit'ы по-прежнему не доходят, как и ответ от ноды до клиента. Наверно, /ws/ было каким-то зарезервированным словом. В любом случае поиграюсь с настройками ещё раз, спасибо.
  • Поддерживаете ли вы IPv6 в ваших проектах?

    @sorokinfil Автор вопроса
    Mystray, спасибо, погуглю про бан по маске. Уже удалось найти советы по хранению IPv6 отдельным столбцом, подготовлю почву для масштабирования в будущем.
  • Поддерживаете ли вы IPv6 в ваших проектах?

    @sorokinfil Автор вопроса
    Понял, спасибо. Пока с поддержкой повременю.
  • Поддерживаете ли вы IPv6 в ваших проектах?

    @sorokinfil Автор вопроса
    Stalker_RED, Не знаю, с чем могу столкнуться. Вдруг, конкурент напакостит. Имхо поддержка бана по IP это мастхэв.
    Сейчас погуглил по англоязычному интернету и пришёл к выводу, что баны по диапазонам для IPv6 нет смысла делать, слишком длинные адреса + проблемы с упаковкой и сравнением.
    Решил пока с поддержкой повременить, вроде как IPv4 адрес всё равно остаётся у всех, пользователей не потеряю.
  • Поддерживаете ли вы IPv6 в ваших проектах?

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

    Что касается блокировок по IP, это поможет оградиться от вредителей. Для заблокированного IP сайт грузиться не будет, нагрузка меньше. Они заносятся в базу данных через специальный веб-интерфейс с поддержкой диапазонов. Для IPv6 не знаю, насколько справедливы диапазоны.
  • Поддерживаете ли вы IPv6 в ваших проектах?

    @sorokinfil Автор вопроса
    Диапазон IPv4 уже исчерпан, рано или поздно с IPv6 или иным протоколом придётся считаться. Для этого нужно давать доступ к сайту по иному адресу и вводить его поддержку функционалом. Но другой вопрос, как скоро и стоит ли заниматься этим сейчас для среднего проекта, рассчитанного на РФ.
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    rustler2000, обернул, больше ошибок не выдаёт. Дебаггинг на js то ещё удовольствие. Для меня было неочевидно, но сейчас всё кажется в порядке, спасибо!
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    rustler2000, я не js-разработчик по профилю, но мысль понятна, цикл отрабатывает прежде, чем срабатывает первый таймаут. Правильно ли я понимаю, что чтобы код работал, как надо, мне нужно обернуть path.resolve и fs.unlink в функцию? Уже ни в чём не уверен.
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    rustler2000, да, просто path.resolve возвращает строку, а не объект, а это простой тип и должен передаваться по значению. С моим пониманием асинхронности не вижу никаких противоречий. Самое смешное, что картинка, на которой он якобы спотыкается, удаляется, а остальные нет.

    Переформулирую вопрос - как лучше всего сделать удаление файлов в цикле? Рекурсивной функцией с рекурсией по коллбеку?
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    Если это и так, то можно ли как-то побороть? Я не нашёл в интернете таких ситуаций, что вообще странно, многие сидят на винде. Мб что-то в настройках системы изменить?
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    Владимир Скибин, вот вывел ссылки, которые возвращаются в цикле. Все разные, все картинки по путям точно существуют.
    5aa8dd25bdfe4496784266.jpeg

    rustler2000, но ведь цикл работает синхронно, или я чего-то не понимаю? Переменная path_image объявляется и передаётся в unlink по значению, это не объект. Как она может вдруг поменяться? Почему, когда я меняю на unlinkSync, результат тот же самый? Там нет никакого коллбека.
  • Как побороть непонятную ошибку fs.unlink в node.js?

    @sorokinfil Автор вопроса
    Ну с правами точно должен быть порядок, ведь какие-то из картинок удаляются, а вот динамически заносятся все из них.
    В параллельной таблице, аналогичная ситуация, а там все картинки проходят через изменение размера и пересохранение.
    Мне кажется, что связано либо с ограничениями операционки, либо с ограничениями самого fs на количество удаляемых одновременно файлов, и я не имею понятия, как это можно пофиксить.