处理Ajax请求和响应zend框架

时间:2012-03-06 11:20:08

标签: ajax json zend-framework

我想向控制器发送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 个答案:

答案 0 :(得分:19)

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)
    }
}

答案 1 :(得分:5)

有关更正确的方法。我会在您的控制器中使用以下内容

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 :(得分:2)

//客户端

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;

    }

答案 3 :(得分:1)

在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;
  ...
},

答案 4 :(得分:0)

如果使用POST HTTP方法调用,您可能需要禁用操作的视图呈现。我是这样做的:

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

但是还有其他方法可以做到这一点。您可以在官方ViewRenderer documentation中查看更多信息。

希望有所帮助。

答案 5 :(得分:0)

您可以使用JsonModel - 只需返回:

  

返回新的JsonModel();

别忘了添加

  

使用Zend \ View \ Model \ JsonModel;

答案 6 :(得分:-1)

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 :("");
    }
});