将视图渲染为字符串,然后在cakephp中输出json

时间:2014-05-05 08:06:40

标签: ajax json cakephp cakephp-2.4

在使用AJAX和JSON时,我正面临CakePHP 2.4的一些问题。

我想用视图渲染数据,但是将生成的html保存为变量中的字符串。 之后,我想设置一个数组,其中包含此html字符串以及其他数据作为JSON对象返回。不幸的是,我还没有找到正确的方法。

到目前为止,我的控制器代码使用了CakePHP json magic:

//Controller (just parts) 

$data = $this->paginate();

if($this->request->is('ajax')) {

        $jsonResponse = array(

            'jobs' => $data,

            'foci' => $foci,

            'jobTypes' => $jobTypes,

            'count_number'=> $count_number

        );

        $this->set('jsonResponse', $jsonResponse);

        $this->set('_serialize', 'jsonResponse');

    } else {

        // render regular view
        $this->set(compact('data', 'foci', 'jobTypes', 'count_number'));

    }

这在javascript控制台中输出完美的json,除了事实之外,$ data中的数据是纯数据。

以某种方式可以将$ data传递给视图,渲染它,将输出保存到字符串变量$ html,并将$ html传递给jsonResponse中的作业而不是$ data?

3 个答案:

答案 0 :(得分:22)

是的!您可以将视图渲染为变量。您只需要创建一个视图对象。 在控制器内部试试这个:

$view = new View($this,false);
$view->viewPath='Elements';  // Directory inside view directory to search for .ctp files
$view->layout=false; // if you want to disable layout
$view->set ('variable_name','variable_value'); // set your variables for view here
$html=$view->render('view_name'); 

// then use this $html for json response

答案 1 :(得分:11)

对于那些使用 CakePhp3

的人
$view = new View($this->request,$this->response,null);
$view->viewPath='MyPath';  // Directory inside view directory to search for .ctp files
$view->layout='ajax'; // layout to use or false to disable
$html=$view->render('view_name');

不要忘记在命名空间中添加它

use Cake\View\View;

答案 2 :(得分:1)

Controller::render()函数实际上通过调用CakeResponse::body()然后返回当前CakeResponse对象来设置响应的主体。这意味着您可以在控制器操作中调用render()方法,捕获其返回值,然后再次调用CakeResponse::body(),从而用所需的输出替换响应主体。

示例代码:

$data = $this->paginate();

// Pass the data that needs to be used in the view
$this->set(compact('data', 'foci', 'jobTypes', 'count_number'));

if($this->request->is('ajax')) {

    // Disable the layout and change the view 
    // so that only the desired html is rendered
    $this->layout = false;
    $this->view = 'VIEW_PASSED_AS_JSON_STRING';

    // Call the render() method returns the current CakeResponse object
    $response = $this->render();

    // Add any other data that needs to be returned in the response
    // along with the generated html
    $jsonResponse = array(
        'html'       => $response->body(),
        'other_data' => array('foo' => 'bar'),
        'bar'        => 'foo'
    );

    // Replace the response body with the json encoded data
    $response->body(json_encode($jsonResponse));

}