CakePHP-用于ajax请求的布局文件夹

CakePHP-用于ajax请求的布局文件夹,php,ajax,json,cakephp,Php,Ajax,Json,Cakephp,我的应用程序将有两种不同的请求类型:AJAX和JSON。 AJAX应输出html代码;JSON将返回纯JSON代码。 我通过调用如下控制器操作来发送JSON输出:/index.JSON-->OutputsJSON code,视图位于/view/Test/JSON/index.ctp 对于像/index.ajax这样的请求,如何将视图文件存储在/view/Test/ajax/index.ctp中 我试着设置 路由器::parseExtensions('json','ajax') 在my/Confi

我的应用程序将有两种不同的请求类型:AJAX和JSON。 AJAX应输出html代码;JSON将返回纯JSON代码。 我通过调用如下控制器操作来发送JSON输出:/index.JSON-->OutputsJSON code,视图位于/view/Test/JSON/index.ctp

对于像/index.ajax这样的请求,如何将视图文件存储在/view/Test/ajax/index.ctp

我试着设置 路由器::parseExtensions('json','ajax') 在my/Config/routes.php中,但是callling index.ajax刚刚输出了/View/Test/index.ctp的标准/View/Test/index.ctp insertad

我做错了什么

致以亲切的问候


Battlestr1k3

Ajax是一种方法,而不是一种数据类型

您可能正在发出一个ajax请求,该请求将返回json,在这种情况下,您可以在json视图中使用它,或者对它进行解码并在标准视图中使用它

如果要通过ajax请求重新调整json对象或数组以显示为HTML,还可以使用jquery对其进行解析。有关更多信息,请参见此处:

编辑以下评论:

首先,您需要有一个视图文件来输出HTML,这将在:

app/View/Tests/index.ctp app/View/Tests/add.ctp

然后在控制器中有相应的方法:

public function index(){
  //index method here
}
此时,当您在浏览器中转到/tests/index.html时,您的索引视图将呈现,并且您在index.ctp文件中设置的所有html结构都将显示出来。但是,您将没有数据,因为您没有从数据库中检索数据或将其设置为供视图使用

因此,要呈现它,您需要运行ajax调用并将url设置为/Tests/index

然后将逻辑添加到控制器中的索引函数中,如下所示:

if($this->RequestHandler->isAjax()){
  //debug can cause problems with AJAX requests so switch it off if it is on
  Configure::write('debug', 0);

//you need to pass the id through in the data parameter of your ajax call  
$id = $this->request->query['id'];

  $settings = array(
    'conditions' => array('Test.id' => $id),
  ); 
  $data = $this->Test->find('first', $settings);

  return json_encode($data);
}

这将返回一个json数组,您可以使用jquery解析该数组并将其附加到HTML中。

感谢您的快速回答。我已经考虑过用Javascript解析JSON,但是有一个HTML表和许多不同的标记,为它编写JSON解析器将非常耗时。我只想使用两个文件夹,一个用于JSON请求(已经在工作),另一个用于HTML-AJAX请求。我可以用什么来代替ajax,html显然不起作用。我可以澄清一下,您是在做ajax请求来获取数据吗?例如,您是否尝试在用户不必重新加载页面的情况下更新视图?如果是这样,您将别无选择,只能使用并解析JSON aray——这就是AJAX返回变量的方式。如果不使用AJAX获取数据,则只需在控制器中设置变量并使用标准的蛋糕视图。您提到了文件夹,在本例中,PHP/HTML视图文件的文件夹应该是/view/test/json/index.json和/view/test/index.ctp!我目前通过调用index.json输出html,这是不正确的,因为它不返回json。所以最好的做法是(对于ajax加载的html)在默认目录中加载一个视图,比如/view/Test/ajax\u tabledata.ctp?我是否可以设置一个通用路由,比如说所有带有.ajax extension的请求都应该从/View/Test/ajax/action.ctp接收输出?我曾考虑在AppController.phpAnswer edited中调用beforeRender()方法,希望这会让您走上正确的道路。非常感谢您,这是一个绝妙的想法!