2013-12-11 3 views
0

Я хотел бы спросить вас, как я могу отправить запрос ajax с помощью сериализации по форме jQuery и получить ответ JSON от контроллера? Я пытался много решений, но никто из них не работал для меня. У меня есть небольшой опыт в этом вопросе.Отправка jQuery.serialize формы через POST, ожидая ответа JSON от контроллера

Можете ли вы привести хороший пример? Спасибо!

  1. Отправить сообщение с сериализованной формой (POST) с помощью AJAX
  2. действий
  3. процесса в функции контроллера и получить ответ JSON в AJAX -> успеха

Я использую CakePHP 2.4.1


Мой Аякса запрос

 $.ajax({ 
     type: "post", 
     url: location.pathname + "/edit", 
     data: data, 
     success: function(response) { 
      $("#content").html(response); // i would like to recieve JSON response 
      alert(response);    // here ;C 

     }, 
     error: function(){   
       alert("error"); 
     } 
     }); 

часть моей функции в контроллере

 public function admin_edit(){ 
     //................ some logic passed 
     if($this->request->is('ajax')){ 
     $this->layout = 'ajax'; 
     $this->autoRender = false; 
     $this->set(compact('user')); 
     $this->disableCache(); 
     foreach($this->request->data['User'] as $key => $value){ 
      if(empty($value)){ 
       unset($this->request->data['User'][$key]); 
      } 
     } 
     $this->User->id = $this->request->data['User']['id']; 
     if($this->User->save($this->request->data)){ 
      $this->Session->setFlash('Użytkownik został zmodyfikowany'); 
      return $this->redirect(array('action' => 'index')); 
     } 
     $this->Session->setFlash('Nie zmodyfikowano użytkownika'); 
     } 
     } 

Что я хотел бы, чтобы получать это JSON ответ от контроллера. пример

[{"id":"1", "username":"test", ... }] 
+0

Вы пытались использовать [serialize] (http://book.cakephp.org/2.0/ru/views/json-and-xml-views.html#using-data-views-with-the-serialize-key) (например, '$ this-> set ('_ serialize', array ('posts'));')? – Nunser

+0

Да, но это не сработало :( – elharion

+0

Что это за ошибка? – Nunser

ответ

0

Хорошо, я думаю, что вы путаете себя немного, но смешивать их можно немного отлаживать для кого-то, у кого мало опыта. Я отправлю базовый пример того, что должно работать для вас, и вы перебираете это. Сообщите нам, есть ли еще одна ошибка (проще проверить конкретные ошибки, а не возможную ошибку просмотра/контроллера).

Во-первых, при вызове Ajax, изменение для console.log(response); отладки лучше

//alert(response); 
    console.log(response); 
}, 
error: function(){   
    alert("error"); 
    console.log(response); 
} 
}); 

И в контроллере

public function admin_edit(){ 
    //................ some logic passed 
    if($this->request->is('ajax')){ 
     /* layout not necessary if you have autoRender = false */ 
     //$this->layout = 'ajax'; 
     /* actually, no need for this either with _serialize, but add it if you have unwanted html rendering problems */ 
     //$this->autoRender = false; 

     $this->set(compact('user')); 

     /* other code that doesn't really matter for the example ... */ 

     $this->User->id = $this->request->data['User']['id']; 
     if($this->User->save($this->request->data)){ 
      /* NO!! */ 
      //$this->Session->setFlash('Użytkownik został zmodyfikowany'); 
      //return $this->redirect(array('action' => 'index')); 

      $status = 'OK'; 
      $message = 'Użytkownik został zmodyfikowany'; 
      $this->set(compact('message', 'status')); 
     } 
     /* NO EITHER!! */ 
     //$this->Session->setFlash('Nie zmodyfikowano użytkownika'); 
      $status = 'NOT-OK'; 
      $message = 'Not sure what your flash says but let\'s assume it an error alert'; 
      $this->set(compact('message', 'status')); 

     //serialize variables you have set for the "ghost" view 
     $this->set('_serialize', array('user', 'message', 'status')); 
    } 
    } 

Я думаю, что ваш главный недостаток здесь, чтобы вернуться редирект. Это не для json. То, что вы делаете с этим, - это ajax-вызов html для действия индекса. Это бессмысленно. Если вы хотите, чтобы действие возвращало JSON, все случаи должны возвращать json, no html. Итак, нет setFlash, № redirect.То, что я обычно делаю здесь, это вернуть данные JSON со статусом и сообщением (например, в коде выше). Затем в вызове ajax, при успешном выполнении, вы анализируете данные JSON, читаете статус, если вы хотите перенаправить (через js), а если нет, покажите сообщение об ошибке, которое вы получили.

Надеюсь, что это ясно для вас.

[tiny edit]: json_encode также будет работать, но когда в CakePHP сделайте то, что CakePHP (ians?) Do (serialize) (потому что вам не нужно эхо-переменные).

+0

он многое проясняет! Спасибо! – elharion

+0

Я сделал это как в вашем примере, но у меня есть пустой ответ в console.log :( – elharion

+0

забыли включить статус и сообщение там ... позвольте мне исправить это ... Там все еще получают пустой ответ? (Я просто изменил последняя строка) – Nunser

0

Там пример на JQuery.com

Пример: Сообщение на страницу test.php и получить содержание, которое было возвращено в формате JSON

<?php echo json_encode(array("name"=>"John","time"=>"2pm")); ?> 

.

$.post(location.pathname + "/edit", data, function(data) { 
    console.log(data.name); // John 
    console.log(data.time); // 2pm 
}, "json"); 

Так затыкать в вашем Ajax вызова что-то вроде:

$.post("test.php", data, function(response) { 
      $("#content").html(response); 
      alert(response);    

     }, "json"); 

Edit: Если вы не получаете правильный ответ, пожалуйста, покажите код PHP, который Echos или возвращает json..it-х нигде в той функции, которую вы предоставили.

+0

Спасибо, Нил, я проверю ваше решение сразу! – elharion

Смежные вопросы