cakephp, jquery, .ajax (), dataType: json - PullRequest
3 голосов
/ 06 августа 2009

возможно ли обойтись без представления для функции контроллера cakephp? я пытаюсь, чтобы мой сервер возвращал тип данных, который не является строкой - но массив

моя функция контроллера:


    function test() {
      $this->layout = 'plain';
      $task['Numbers']['uno'] = 'mooo';
      $task['Numbers']['dos'] = 'says the cow';
      $result = json_encode($task);
      $this->set('result', $result);
    }

файл моего просмотра test.ctp



    echo $result;


мой jquery:

<code>

    $('#test').live('click', test);

    function test() {

        var data = $('#form').serialize();

        $.ajax({
        type: "post",
        url: "/controller/test",
        data: data,
        dataType: 'json',
        success: function(response){            
        alert(response.Numbers.uno);
        }
        });

    }

щелчок по элементу html, помеченному test, ничего не дает. Однако, если я вынимаю

dataType: 'json', 

и измените alert(response.Numbers.uno); на
alert(response);
в моем jquery - я получаю предупреждение: данные, закодированные в json, но в виде строки (
alert(typeof response);
)

У кого-нибудь есть идеи, что может происходить?

Ответы [ 5 ]

3 голосов
/ 06 августа 2009

Во-первых, чтобы ответить на ваш вопрос, да, вы можете обойтись без представления (и это хороший случай для этого). В вашем действии контроллера (test, в данном случае) просто установите $this->autoRender = false;. Это то, что я обычно делаю и просто повторяю закодированную строку JSON в самом контроллере. Меньше беспорядка таким образом.

Следующее, на что я посмотрю, это ваши настройки отладки в config.php. Если не установить 0, очень вероятно, что это ваша проблема. Ваш оператор echo может повторять строку в формате JSON, но добавляет к ней отладочный вывод. В метод просто включите Configure::write ( 'debug', 0 ). Это отключит отладку только для текущего запроса . Обычно я делаю это в моем AppController:

if ( $this->RequestHandler->isAjax() ) {
   Configure::write ( 'debug', 0 );
}

Я бы задействовал такой инструмент, как Firebug, и посмотрел бы, что происходит с вашим запросом на ajax. Он будет отслеживать эти запросы и предоставлять вам заголовки запросов и ответов для проверки. Это может помочь. Если последняя проблема, то Firebug показал бы вам это в заголовках ответов.

1 голос
/ 19 февраля 2010

Я согласен с Робом, за исключением установки вашей отладки в контроллере приложения. Это немного раздражает меня, потому что вы должны устанавливать уровень отладки в контроллере приложения каждый раз, когда хотите отладить что-то для определенной функции. Я пишу свой обработчик так в контроллере, в котором я работаю.

Configure::write('debug', 0);
$this->autoRender = false;

Также я согласен с использованием firebug. С Firebug все, что вам нужно сделать, это открыть Firebug, нажать на консоль, а затем запустить тест. Это скажет вам, что вы делаете с вашим jquery и даст вам результаты.

0 голосов
/ 15 марта 2012

Я просто использую

die(json_encode(array('success' => true, 'result' => $result)));

в конце вызванного метода контроллера, и он работает для меня.

0 голосов
/ 02 февраля 2012

Вы должны преобразовать данные перед использованием.
Смотрите этот ответ:

jQuery ajax-запрос с ответом json, как?

вы должны использовать

var json = $.parseJSON(response);
alert(json.Numbers.uno);
0 голосов
/ 06 августа 2009

Ознакомьтесь с книгой cakePHP по обработке запросов:

http://book.cakephp.org/view/174/Request-Handling

CakePHP имеет некоторые встроенные функции для обработки методов контроллера, которые возвращают json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...