Я успешно использовал файлы представления XML в CakePHP (запросите тип вывода 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 &quot;/Users/test/Documents/hosts/mycakeapp/app/View/Orders/createorder.ctp&quot; is missing.</error>
<name>MissingViewException</name>
<code>500</code>
<url>/orders/createorder/</url>
</response>
Поэтому мне нужно сказать CakePHP, чтобы получить xml/createorder.ctp вместо createorder.ctp. Как мне это сделать?
Ура!
Эти ответы относятся к 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.php
XmlView.php //This extends View.php
JsonView.php //This extends View.php
Итак, вы сказали cakephp использовать XmlView. Когда вы создаете новый вид, вам нужно использовать XmlView вместо View. Или вы можете создать свой собственный 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 Keizer ответ должен работать. $this->render('/xml/createorder');
указывает на app/View/xml/createorder
. Если вам нужно это указать на app/View/Order/xml/create
просто используйте $this->render('/Orders/xml/create');
,
$this->render('/xml/createorder');