在 CakePHP 中使用 JsonView 返回 HTML 片段


Returning HTML fragments with JsonView in CakePHP

我正在使用Cake 2.1,随之而来的是新的JsonView。我想做的是 POST 到我的控制器中的一个方法并呈现一个 html 片段,以便我可以将其作为 json 中的值返回。

以前我会做这样的事情:

public function ajaxSubmit() {
    if (!$this->request->is('ajax')) {
        $this->redirect('/');
    } else {
        $this->autoRender = $this->layout = false;
        $message = 'Please enter a message';
        $this->set('message');
        $errorFragment = $this->render('/Elements/errors/flash_error');
        $toReturn = array('errorFragment' => $errorFragment);
        return json_encode($toReturn);
    }
}

它只发回该特定flash_error元素的 html 片段,这样我就不能在标准 json 对象中发回多个key => values。我希望能够将 html 片段和纯文本作为 json 发送。

所以我的问题是,我如何渲染一个 HTML 元素并使用 (key=>value 对) 将其设置为使用 Cake 2.1 提供的 JsonView 从我的控制器作为 json 发送回?我已经在我的路由文件中设置了Router::parseExtensions('json');并且我将RequestHandler组件包含在我的应用程序控制器中。

使用数据视图时,不需要对 AJAX 执行单独的操作。使用可以使用与非 AJAX 提交相同的操作。

但是,假设您希望对 AJAX 使用不同的操作,因为我不知道您的其他操作是什么样子的,您可以在 app/View/ControllerName/json/ajaxSubmit.ctp 中编写这样的东西。

<?php
$errorFragment = $this->element('errors/flash_error');
$toReturn = array('errorFragment' => $errorFragment);
echo json_encode($toReturn);

然后将您的操作更改为此

public function ajaxSubmit() {
    if (!$this->request->is('ajax')) {
        $this->redirect('/');
    } else {
        $message = 'Please enter a message';
        $this->set('message');
    }
}

请参阅文档中的"将数据视图与视图文件结合使用"。