【问题标题】:CakePHP - How to return string (like JSON) from controller action to Ajax requestCakePHP - 如何将字符串(如 JSON)从控制器操作返回到 Ajax 请求
【发布时间】:2011-08-19 16:32:26
【问题描述】:

所以我让我的 JavaScript 对 /my_controller/ajax_action 进行 Ajax 调用,但是在控制器中我不知道如何将某些内容输出回 JavaScript。

我收到错误,因为MyController::ajaxAction() 没有视图,但显然没有它的视图,我该怎么办?

【问题讨论】:

  • 如果响应不是 JSON 怎么办?我想要一个不仅返回 JSON 字符串,而且返回任何内容的解决方案。
  • 好吧,这不是问题标题所说的^^
  • 例如,如果您要求 JSON(通过 .json 扩展名),则应始终返回 JSON。还会是什么?你可以使用 JSON 传递几乎任何东西。请参阅this article 了解如何实现这一目标的详细信息。

标签: jquery ajax cakephp


【解决方案1】:

执行此操作,将您想要输出的变量放在一个数组中,比如说$data,然后使用$this->set('data', $data); 方法将该数组传递给视图,然后创建一个视图/General/SerializeJson.ctp。在该视图文件中,将<?PHP echo json_encode($data); ?> 放在后面,您可以使用$this->render('/General/SerializeJson');,它应该会输出json。

通用代码...

/Controllers/MyController.php

public class MyController extends AppController
{
    public function ajaxAction()
    {
        $data = Array(
            "name" => "Saad Imran",
            "age" => 19
        );
        $this->set('data', $data);
        $this->render('/General/SerializeJson/');
    }
}

/Views/General/SerializeJson.ctp

<?PHP echo json_encode($data); ?>

【讨论】:

    【解决方案2】:

    我发现最简单的方法是禁用自动渲染:

    function ajax_action($data = null) {
        if($this->RequestHandler->isAjax()) {
            $this->autoRender = false;
            //process my data and return it
            return $data;
        } else {    
            $this->Session->setFlash(__('Not an AJAX Query', true));
            $this->redirect(array('action' => 'index'));
        }   
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      在您的 view 文件夹中对应的 controller(my_controller) 创建一个名为 json 的文件夹并放置一个名为 index.ctp 的文件,然后在该 ctp 文件中写入以下代码:

      <?php echo json_encode($yourVariableNameReturnedFromController); ?>
      

      在您的my_controllerindex() 中写下了这段代码:

      $this->set('yourVariableNameReturnedFromController', $this->YOURMODEL->find('all'));
      

      在您的app_controller.php(如果不存在,您必须创建)中编写此代码

      function beforeFilter(){
        if ($this->RequestHandler->ext == 'json') {
           Configure::write('debug', 0);
        }
      }
      

      【讨论】:

      • 这里我使用index() 函数来访问json,你的url 会像'/my_controller/index.json'
      【解决方案4】:

      AutoRender=false 并返回 json_encode($code)

      public function returningJsonData($estado_id){
          $this->autoRender = false;
      
          return json_encode($this->ModelBla->find('first',array(
              'conditions'=>array('Bla.bla_child_id'=>$estado_id)
          )));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多