BadHorsie
BadHorsie

Reputation: 14544

CakePHP - How to return string (like JSON) from controller action to Ajax request

So I have my JavaScript making an Ajax call to /my_controller/ajax_action but then in the controller I don't know what to do to output something back to the JavaScript.

I am getting errors because there is no view for MyController::ajaxAction() but obviously there is no view for it, so what do I do?

Upvotes: 4

Views: 14141

Answers (4)

Guilherme Oliveira
Guilherme Oliveira

Reputation: 2369

AutoRender=false and Return 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)
    )));
}

Upvotes: 1

Saad Imran.
Saad Imran.

Reputation: 4530

do this, have your variables you want to output in an array let's say $data, then pass that array to the view using the $this->set('data', $data); method, then create a view /General/SerializeJson.ctp. In that view file, put <?PHP echo json_encode($data); ?> after that you can use $this->render('/General/SerializeJson'); and it should output the json.

General code...

/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); ?>

Upvotes: 8

Shaz Ravenswood
Shaz Ravenswood

Reputation: 1835

Easiest way I found was to disable the automatic rendering:

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

Upvotes: 4

thecodeparadox
thecodeparadox

Reputation: 87073

try this:

within your view folder for the corresponding controller(my_controller) make a folder named json and place a file named index.ctp and within that ctp file write this code:

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

within your my_controller in index() wrote this code:

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

within your app_controller.php(if not exist you have to made it) write this code

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

Upvotes: 3

Related Questions