Jump to content
  • 0

Почему null ?


Hol1killer
 Share

Question

Ситуация следующая есть форма с нее отправляю ajax запрос


jQuery.ajax({
url: that.dom.$form.prop( "action" ) ,
type: "POST",
data: dataJson,
dataType: "json",
success: function( data ){
alert(data);
that.onAjaxResponse( data );
},
});

ajax работает правильно.

в форме action прописан к нужному файлу order.php

Вот файл order.php


<?php
class OrderController
{
private $requestUserData = null;
const FORM_ACTION_TYPE__CALL_ORDER = 1;
const MSG_FORM_ACTION_TYPE__CALL_ORDER = "Спасибо за обращение! В ближайшее время с вами свяжется наш менеджер";
const MSG_ERROR__PHONE = "Нужно указать контактный телефон";
const MSG_ERROR__COMMENT = "Необходимо ввести текст";
const MSG_ERROR__MAILER = "Произошла ошибка при отправке письма. Пожалуйста, попробуйте отправить письмо еще раз";
const MSG_SUBJECT__CALL_ORDER = "Заказ звонка";
function __construct() {
$this->initRequestUserData();
$outputArr = $this->doOrderWithPhone();
$outputArr = json_encode($outputArr);
}

private function doOrderWithPhone() {
if ( $this->isPhoneExists() ) {
$isMailSuccess = $this->sendMail();
if ( $isMailSuccess === true ) {
$outputArr = $this->getSuccessOutput();
}
else {
$outputArr = $this->getErrorOutput( self::MSG_ERROR__MAILER );
}

}
else {
$outputArr = $this->getErrorOutput( self::MSG_ERROR__PHONE );
}
return $outputArr;
}
private function getSuccessOutput() {
$isError = false;
switch( $this->requestUserData[ 'orderTypeId' ] ) {
case self::FORM_ACTION_TYPE__CALL_ORDER:
$output = self::MSG_FORM_ACTION_TYPE__CALL_ORDER;
break;

}
return array( 'isError' => $isError, 'result' => $output );
}
private function getErrorOutput( $errorText ) {
$isError = true;
return array( 'isError' => $isError, 'result' => $errorText );
}

private function initRequestUserData() {
$this->requestUserData = array(
'name' => $_POST['name'],
'phone' => $_POST['phone'],
'time' => $_POST['time'],
'message' => $_POST['message'],
'orderTypeId' => $_POST['orderTypeId']
);
$this->requestUserData = array_map( "trim", $this->requestUserData );
$this->requestUserData = array_map( "htmlspecialchars", $this->requestUserData );
}
private function sendMail() {

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html;charset=utf-8 \r\n";
// Формирование тела письма
$body = "<html><body style='font-family:Arial,sans-serif;'>";
$body .= "<h2 style='font-weight:bold;border-bottom:1px dotted #ccc;'>Новое сообщение с сайта </h2>\r\n";
$body .= "<p><strong>Имя:</strong> ".$this->requestUserData[ 'name' ]."</p>\r\n";
$body .= "<p><strong>Телефон:</strong> ".$this->requestUserData[ 'phone' ]."</p>\r\n";
$body .= "<p><strong>Удобное время звонка:</strong> ".$this->requestUserData[ 'time' ]."</p>\r\n";
$body .= "<p><strong>Сообщение:</strong> ".$this->requestUserData[ 'message' ]."</p>\r\n";
$body .= "</body></html>";
$mailer->Body = $body;
$mailer->Headers = $headers;
$mailer->Subject = "Сообщение с сайта";
$mailer->Send = mail('нужный e-mail',$mailer->Subject, $mailer->Body, $mailer->Headers);
if($mailer->Send) return true;
else return false;
}
private function isPhoneExists() {
$isNotEmpty = ( $this->requestUserData[ 'phone' ] !== '' );
$isNotCodeOnly = ( $this->requestUserData[ 'phone' ] !== '+7' );
if ( $isNotEmpty AND $isNotCodeOnly ) {
return true;
}
else {
return false;
}
}

}

Смысл проверяю тут поле phone и если оно не проходит проверку возвращаю в ajax и вывожу ошибку. Если все верно то отправляю на почту письмо с данными.

Проблема в том что


return array( 'isError' => $isError, 'result' => $errorText );

и


return array( 'isError' => $isError, 'result' => $output );

возвращаю null.

Достаточно изменить на echo $output то в ajax данные из $output поступают, но мне нужно именно json формат данных, а не просто строка.

Подскажите не понимаю почему не получаю json представление, я же вроде возвращаю массив array ?

Edited by Hol1killer
Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

return json_encode(array( 'isError' => $isError, 'result' => $output ));

JS получит данные в виде


{"isError" : значение, "result" : значение}

PS никакого автоматического преобразования из массива в json формат в php нет. Для этого используйте метод json_encode(). А для обратного преобразования json_decode().

Edited by wwt
Link to comment
Share on other sites

  • 0

return json_encode(array( 'isError' => $isError, 'result' => $output ));

JS получит данные в виде


{"isError" : значение, "result" : значение}

PS никакого автоматического преобразования из массива в json формат в php нет. Для этого используйте метод json_encode(). А для обратного преобразования json_decode().

Спасибо за ответ но опять же в JS возвращается null, а когда я меняю return на echo то в js идут данные, но правдо в алерте они не отображаются, я ввижу их через firebug. Непонимаю почему так.

Я взял исходник у друга, у него просто нету json_encode и они возвращают return таким образом.

Edited by Hol1killer
Link to comment
Share on other sites

  • 0

return - это конструкция языка возвращающая результат работы метода/функции

echo - конструкция языка выводит в поток какие-то данные


<?php
function test(v){
return 1 + v;
}

$test = test(3);
echo $test;
?>

Чувствуете разницу?

Edited by wwt
Link to comment
Share on other sites

  • 0

Да чувствую.

Ну так в в случаи ошибки функция


private function getErrorOutput( $errorText ) {
$isError = true;
return json_encode(array( 'isError' => $isError, 'result' => $errorText ));
}

возвращает $isError = true и $errorText = "Нужно указать контактный телефон";

В случаи успеха функция


private function getSuccessOutput() {
$isError = false;
switch( $this->requestUserData[ 'orderTypeId' ] ) {
case self::FORM_ACTION_TYPE__CALL_ORDER:
$output = self::MSG_FORM_ACTION_TYPE__CALL_ORDER;
break;
}
return json_encode(array( 'isError' => $isError, 'result' => $output ));
}

вернет isError = false; result = "Спасибо за обращение! В ближайшее время с вами свяжется наш менеджер";

Но в ajax поступает null, меня интересует из за чего там null, почему нету никакого ответа от php скрипта, если есть конструкции return ? Или я что-то не понимаю?

Edited by Hol1killer
Link to comment
Share on other sites

  • 0

Вы не поняли.

Конструкция return не выводит в поток. Она возвращает результат работы метода. То есть :


<?php
// какая то функция или метод в классе не важно
function test(v){
return 1 + v;// метод возвращает результат работы
}
$test = test(3);// создается переменная и ей присваевается результат работы метода test()
echo $test;// выводится в поток результат работы кода, тоесть то что тут вернется будет доступно в браузере
?>

  • Like 1
Link to comment
Share on other sites

  • 0

Вы не поняли.

Конструкция return не выводит в поток. Она возвращает результат работы метода. То есть :


<?php
// какая то функция или метод в классе не важно
function test(v){
return 1 + v;// метод возвращает результат работы
}
$test = test(3);// создается переменная и ей присваевается результат работы метода test()
echo $test;// выводится в поток результат работы кода, тоесть то что тут вернется будет доступно в браузере
?>

Спасибо идею понял, често не знал про это. Близко не знаком с php и ajaxom.

Сформировал новый конструктор


function __construct() {
$this->initRequestUserData();
$outputArr = $this->doOrderWithPhone();
echo $outputArr;
}

вроде же в $outupArr у меня итог всей работы. Вешаю на него echo $outputArr;

Но опять же вижу null когда возвращаю. Вроде же все верно?

Link to comment
Share on other sites

  • 0

$outputArr это массив, а вам нужно возвращать json строку значит нужно так:

echo json_encode($outputArr);

Сам скрипт у вас работает без ошибок? Попробуйте к нему обратится напрямую , не через ajax а с помощью обычной формы . Посмотрите что возвращает скрипт. Когда уведите что он возвращает


{"isError" : значение, "result" : значение}

Значит все ок и можно уже делать запрос через ajax. Я подозреваю что скрипт работает с ошибкой и вам возвращается текст ошибки, а не то что вы ожидаете увидеть.

ЗЫ еще можно тестировать и смотря ответ на ajax запрос в отладчике

Link to comment
Share on other sites

  • 0

У меня скрипт вообще ничего не возвращает, просто null.

Я в отладчике firebug вижу ответ null и больше ничего. Но я не могу понять где ошибка. Уже 2 день бьюсь над этим.

Еще хотел узнать я могу так обращаться self::FORM_ACTION_TYPE__CALL_ORDER к константе класса FORM_ACTION_TYPE__CALL_ORDER ?

Edited by Hol1killer
Link to comment
Share on other sites

  • 0

Вроде решил проблему.

Проблема была в том что я не создавал объект этого класса

Вконце файла дописал


$obj = new OrderController();

все заработало, спасибо за помощь.

Но возник еще один вопрос, я брал код у друга а он писал его для yii я его видоизменил. Задача у нас такая же. И если используется MVC то где создаются объекты классов в моделе или контроллере ?

Возможно пишу какой-то идиотизм, но думаю идея понятна. Понимаю что вопрос не в тему, но надеюсь получить ответ. Спасибо

Edited by Hol1killer
Link to comment
Share on other sites

  • 0

Это зависит от разных вещей. Ну и конечно вы сами можете делать это и там и там. Но наверное стоит разделять все же. Смотря обьект какого класса вы создаете, что он делает . Если это класс работы с БД то вернее будет создавать в моделе. Если же это что-то для обработки входящих данных то в контроллере. Почитайте про MVC станет понятнее.

Link to comment
Share on other sites

  • 0
Это зависит от разных вещей. Ну и конечно вы сами можете делать это и там и там. Но наверное стоит разделять все же. Смотря обьект какого класса вы создаете, что он делает . Если это класс работы с БД то вернее будет создавать в моделе. Если же это что-то для обработки входящих данных то в контроллере. Почитайте про MVC станет понятнее.

Спасибо за ответ, да читаю потихоньку. А нельзя сделать единый файл в котором создать объекты всех классов? Или это нарушает концепцию?

Link to comment
Share on other sites

  • 0
Это зависит от разных вещей. Ну и конечно вы сами можете делать это и там и там. Но наверное стоит разделять все же. Смотря обьект какого класса вы создаете, что он делает . Если это класс работы с БД то вернее будет создавать в моделе. Если же это что-то для обработки входящих данных то в контроллере. Почитайте про MVC станет понятнее.

Спасибо за ответ, да читаю потихоньку. А нельзя сделать единый файл в котором создать объекты всех классов? Или это нарушает концепцию?

Ну разделение по файлам это уже другая песня )) С чисто технической стороны вопроса можно и имет ьв одном файле 3 разных класса для моделе контроллера и представления свои. А файл может быть и один )) обычно разделение пофайлово делают для более структурированного подхода да и классы могут разрастись до больших размеров и держать их в одном файле не удобно.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy