Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.01.2017, 16:57
Аспирант
Отправить личное сообщение для INSIDER73 Посмотреть профиль Найти все сообщения от INSIDER73
 
Регистрация: 12.01.2017
Сообщений: 48

Как сделать отправку ответа по json c этой формой?
Есть ajax форма обратной связи ,все работает хорошо,но как переделать чтобы скрипт отвечал в JSON (например status: success или status: false), а уже в jQuery-скрипте выводится HTML ответ на страницу ?
Я так понял нужно завести переменную,в нее буду получать статус(как?) и в зависимости от этого статуса буду выводить сообщение в скрипте js?
smartlanding.biz/ajax-forma-v-modalnom-okne.html использовал эту форму.

Попытался я сделать так
файл mail.php
<?php
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    // Если к нам идёт Ajax запрос, то ловим его
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_POST['name'])) {$name = $_POST['name'];}
    if (isset($_POST['phone'])) {$phone = $_POST['phone'];}
    if (isset($_POST['messages'])) {$messages = $_POST['messages'];}
    if (isset($_POST['formData'])) {$formData = $_POST['formData'];}
  $json = array(); // пoдгoтoвим мaссив oтвeтa
  if (!$name or !$phone or !$messages) { // eсли хoть oднo пoлe oкaзaлoсь пустым
    $json['error'] = 'Вы зaпoлнили нe всe пoля! oбмaнуть рeшили? =)'; // пишeм oшибку в мaссив
    echo json_encode($json); // вывoдим мaссив oтвeтa 
    die(); // умирaeм
  }
  
    $to = "viktor242424@gmail.com"; /*Укажите адрес, га который должно приходить письмо*/
    $sendfrom   = "codabra@yandex.ru"; /*Укажите адрес, с которого будет приходить письмо, можно не настоящий, нужно для формирования заголовка письма*/
    $headers  = "From: " . strip_tags($sendfrom) . "\r\n";
    $headers .= "Reply-To: ". strip_tags($sendfrom) . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html;charset=utf-8 \r\n";
    $subject = "$formData";
    $message = "$formData<br> <b>Имя пославшего:</b> $name <br><b>Телефон:</b> $phone  <br><b>Сообщение:</b> $messages";
    $send = mail ($to, $subject, $message, $headers);

    $json['error'] = 0; // oшибoк нe былo

  echo json_encode($json); // вывoдим мaссив oтвeтa
} else {
    http_response_code(403);
    echo "Попробуйте еще раз";
}
}
//Если это не ajax запрос
echo 'Ошибка!';

?>



файл со скриптом
файл со скриптом
$(document).ready(function () {
    $("form").submit(function () {
        // Получение ID формы
        var formID = $(this).attr('id');
        // Добавление решётки к имени ID
        var formNm = $('#' + formID);
        $.ajax({
            type: "POST",
            url: 'mail.php',
      dataType: 'json', // oтвeт ждeм в json фoрмaтe
         data: data, // дaнныe для oтпрaвки
           success: function(data){ // сoбытиe пoслe удaчнoгo oбрaщeния к сeрвeру и пoлучeния oтвeтa
           		if (data['error']) { // eсли oбрaбoтчик вeрнул oшибку
           			alert(data['error']); // пoкaжeм eё тeкст
           		} else { // eсли всe прoшлo oк
           			alert('Письмo oтврaвлeнo! Чeкaйтe пoчту! '); // пишeм чтo всe oк
           		}
             },
        });
        return false;
    });
});

Немного запутался крч,решение тут простое как я понимаю
Ответить с цитированием
  #2 (permalink)  
Старый 12.01.2017, 17:25
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от INSIDER73
http_response_code(403);
echo "Попробуйте еще раз";
и

Сообщение от INSIDER73
//Если это не ajax запрос
echo 'Ошибка!';
кому?
Ответить с цитированием
  #3 (permalink)  
Старый 13.01.2017, 11:22
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

INSIDER73, достаточно так:
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
Ответить с цитированием
  #4 (permalink)  
Старый 13.01.2017, 11:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Rise,
если не выключен вывод предупреждений, то это вызовет его вывод в браузер.
Ответить с цитированием
  #5 (permalink)  
Старый 13.01.2017, 11:48
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Браузеру, вестимо, то бишь перед JSON, коего ожидает клиент.

HTTP_X_ХХХХХ это вообще-то пользовательские заголовки, и благо что JQ и требуемый будет, а может то и не быть. И автор поступает правильно, используя проверку установления переменной, иначе можно получить предупреждение.
И только если вывод предупреждений отключен не объявленная переменная будет равна NULL и все будет тихо.
Ответить с цитированием
  #6 (permalink)  
Старый 13.01.2017, 12:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

E_NOTICE - уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы.

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

Поэтому он поступается правильно. Хотя, если контролируем сервер, то все отключаем и пишем в лог, тогда и можно спокойно echo $asd, хотя она может быть и не определена.
Ответить с цитированием
  #7 (permalink)  
Старый 13.01.2017, 14:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Причем тут php.ini руководства?
Смотреть надо настройки реального сервера, а они изначально определяются хостером, а не мануалом.
Я не использую isset() везде и вся ибо привык контролировать код и настройки сервера, которые многие можно переопределять. И могу сказать из опыта, что на многих "по умолчанию" будет вывод и уведомлений и предупреждений, не говоря уже об ошибках (фатальные конечно иной вопрос).

Он поступает правильно, хотя бы уже потому, что видимо не знает о таком поведении РНР.
Ответить с цитированием
  #8 (permalink)  
Старый 13.01.2017, 15:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

А причем тут имена и пароли?
Не надо лить все в одну лужу. Автор топика поступает правильно, узнавая наличие переменной, а затем обращаясь к ней. Вы советуете, что можно проще. Можно, но надо пояснять когда это возможно делать не вызывая возможных уже ошибок. Кроме того нужно знать, что переменные могут быть переопределены извне, поэтому поступая проще в особо щекотливых ситуациях необходим строгий контроль.

Вы же просто начинаете перегибать палку.
Ответить с цитированием
  #9 (permalink)  
Старый 13.01.2017, 17:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Rise,
не надо ерунды городить, хорошо?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Акардион меню из чекбоксов и списка, как сделать подсветку текущего элемента OliLoi jQuery 0 08.11.2016 08:15
Как сделать чтобы кнопка «Назад» работала бы в пределах определенного сайта? Askeer Общие вопросы Javascript 7 14.10.2016 12:23
Как сделать чтобы кнопка «Назад» работала бы в пределах определенного сайта? Askeer Общие вопросы Javascript 0 12.10.2016 18:58
Как сделать поворот DIV клонов alexgrenn Элементы интерфейса 4 18.04.2016 21:58
Как сделать переход по этой ссылке с помощью js licn87 Events/DOM/Window 7 03.01.2016 16:35