Обработка Ajax-запросов и ответов Zend Framework - PullRequest
4 голосов
/ 06 марта 2012

Я хочу отправить Ajax-запрос на контроллер, я делаю так на стороне клиента

jQuery.ajax({
    url: "public/visits/visit/get-visits",
    type: "POST",
    dataType: 'json',
    data: data,
    success: function(data){
        alert(data)
    },
    error:function(){
        alert("fail :(");
    }
});

на стороне сервера Я обрабатываю запрос как другие запросы

public function getVisitsAction() {
if (isset($_POST)) {
    $mapper = new Visits_Model_VisitsMapper();
    $allVisits = $mapper->getAllVisits();
    echo json_encode($allVisits);
 }

КогдаЯ вызываю действие, возникает предупреждение о сбое, и когда я проверяю его через пожарную ошибку, я обнаружил, что он возвращает данные json на клиентскую страницу на страницу get-visit.phtml.

Как я могу обработать ответ вФункция успеха со страницы, которая отправляет запрос json и перенаправляет его на страницу get-visit.phtml?

Ответы [ 7 ]

19 голосов
/ 26 июня 2012

У Zend есть Zend_Controller_Action_Helper_Json, которые выполняют следующие действия:

$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
echo json_encode($allVisits);
exit;

Так что может быть еще проще:

public function getVisitsActions() {
    if ($this->getRequest()->isXmlHttpRequest()) {
        if ($this->getRequest()->isPost()) {
            $mapper = new Visits_Model_VisitsMapper();

            $this->_helper->json($mapper->getAllVisits());
        }
    }
    else {
        echo 'Not Ajax';
        // ... Do normal controller logic here (To catch non ajax calls to the script)
    }
}
5 голосов
/ 06 марта 2012

Для более правильного способа сделать это. Я бы использовал следующее в вашем контроллере

public function getVisitsActions() {
    if ($this->getRequest()->isXmlHttpRequest()) {
        if ($this->getRequest()-isPost()) {

            $mapper = new Visits_Model_VisitsMapper();
            $allVisits = $mapper->getAllVisits();

            $this->_helper->layout()->disableLayout();
            $this->_helper->viewRenderer->setNoRender(true);
            echo json_encode($allVisits);
            exit;
        }
    }
    else {
        // ... Do normal controller logic here (To catch non ajax calls to the script)
    }
}
2 голосов
/ 06 марта 2012

// на стороне клиента

jQuery.ajax({
    url: "public/visits/visit/get-visits",
    type: "POST",
    dataType: 'json',
    data: data,
    success: function(data){
        for(i=0;i<data.length;i++){
           alert(data[i]);
       }
    },
    error:function(){
        alert("fail :(");
    }
});

// на стороне сервера

public function getVisitsAction() {
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);
    if (isset($_POST)) {
        $mapper = new Visits_Model_VisitsMapper();
        $allVisits = $mapper->getAllVisits();
        echo json_encode($allVisits);
        exit;

    }
1 голос
/ 22 января 2015

В Zend при использовании Zend json вам не нужно дополнительно анализировать данные в части ajax.Zend делает это самостоятельно.Далее в заголовке ответа: Content-Type:application/json

на стороне сервера :

$this->_helper->json($data);

на стороне клиента :

jQuery.ajax({
  url: "public/path to",
  type: "POST",
  dataType: 'json',
  data: data,
  success: function(data){
      var username = data.user_name;
  ...
},
0 голосов
/ 16 февраля 2018

Вы можете использовать JsonModel - просто вернуть:

вернуть новый JsonModel ();

Не забудьте добавить

использовать Zend \ View \ Model \ JsonModel;

0 голосов
/ 15 декабря 2014
jQuery.ajax({
    url: "public/path to",
    type: "POST",
    dataType: 'json',
    data: data,
    success: function(data){
        for(i=0;i<data.length;i++){
           alert(data[i]);
       }
    },
    error:function(){
        alert("fail :("");
    }
});
0 голосов
/ 06 марта 2012

Возможно, вам потребуется отключить отображение представления для вашего действия, если оно вызывается с помощью POST HTTP-метода.Вот как я это делаю:

Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

Есть и другие способы сделать это.Вы можете увидеть больше информации в официальной документации ViewRenderer .

Надеюсь, что поможет.

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