告诉cakePHP呈现为XML /使用xml / blah.ctp而不是blah.ctp

时间:2014-11-09 21:07:07

标签: php xml cakephp

我已成功使用CakePHP中的XML视图文件(请求标头中的XML输出类型,以便CakePHP将使用例如Orders / xml / create.ctp而不是Order / create.ctp)。

但是,现在我需要添加一些功能,这些功能要求我在控制器中的大多数业务逻辑结束时重新格式化XML。

所以我在控制器动作中尝试了这个:

public function createorder() {
    $this->autoRender = false; // disable automatic content output
    $view = new View($this, false); // setup a new view

    { ... all kinds of controller logic ...}

    { ... usually i would be done here and the XML would be outputted, but the autorender will stop that from happening ... }

    { ... now i want the XML in a string so i can manipulate the xml ... }
   $view_output = $view->render('createorder'); // something like this

}

但这给了我的是:

<?xml version="1.0" encoding="UTF-8"?>
 <response>
  <error>View file &amp;quot;/Users/test/Documents/hosts/mycakeapp/app/View/Orders/createorder.ctp&amp;quot; is missing.</error>
  <name>MissingViewException</name>
  <code>500</code>
  <url>/orders/createorder/</url>
 </response>

所以我需要告诉CakePHP拾取xml / createorder.ctp而不是createorder.ctp。我该怎么做呢?

干杯!

2 个答案:

答案 0 :(得分:0)

$this->render('/xml/createorder');

答案 1 :(得分:0)

这个答案指的是cakephp 2.4

I have been successfully using XML view files in CakePHP (request the XML output 
type in headers so CakePHP will use e.g. Orders/xml/create.ctp 
instead of Order/create.ctp).

在lib / Cake / View中,您可以看到不同的View文件,如:

View.php
XmlView.php //This extends View.php
JsonView.php //This extends View.php

所以你告诉cakephp使用XmlView。创建新视图时,需要使用XmlView而不是View。或者,您可以创建自己的自定义视图并将其放在app / View文件夹中。在自定义视图中,您可以设置子目录。

<?php
App::uses('View', 'View');

class CustomView extends View {

    public $subDir = 'xml';

    public function __construct(Controller $controller = null) {
        parent::__construct($controller);
    }

    public function render($view = null, $layout = null) {
        return parent::render($view, $layout);
    }  
}

因此,您现在需要创建自定义视图$view = new CustomView($this, false);

您还可以在CustomView函数中编写以xml格式处理数据并将其用于每个操作。

@Jelle Keiser的答案也应该有效。 $this->render('/xml/createorder');指向app/View/xml/createorder。如果您需要指向app/View/Order/xml/create,请使用$this->render('/Orders/xml/create');