cakePHP1.2とPEAR:XMLでXML出力
cakePHP1.2ではXML機能があるので、PHPのバージョンによらずXMLがあつかいやすくなったそうだ、、、けどPHP4の環境ということもあり、あえてPEAR:XMLを使うことにする。
cakePHP1.2の$xml->serialize(変数)では属性に展開されてしまうのでイヤでした。配列にもどすやり方もわからなかったし(相互変換ができれば使うかも)。
そのまえにcakePHP1.2では「webservice」が変わり、「(URL).xml」等でXML,RSS,JSONなどのフォーマットで出力できるようになった。
/app/config/routes.phpに
Router::parseExtensions('rss','xml','json');
を追加して、コントローラーの頭で
var $components = array('RequestHandler');
を設定しておく。これで
(コントローラー)/index/page:2/serch:hoge/category:flower.xml
でXML出力を試みるみたい。VIEWは
/app/views/(コントローラー)/xml/フォルダに各アクション名のを置いておく。LAYOUTも同様。
(余談:RequestHandlerを読むと携帯判別しているような箇所もある^^)
※あらかじめ「vendors」にPEARおよびXMLを仕込んでパスを通して使えるようにしておいてください。
smartyが使いたいので、smartyプラグインでserializeできるようにする。
function.xml_serializer.php
<?php
function smarty_function_xml_serializer($params, &$smarty) {
if($params['value'] == '') return;
require_once 'XML/Serializer.php';
$options = array(
"indent" => " ",
"linebreak" => "\n",
"typeHints" => false,
"addDecl" => true,
"encoding" => "UTF-8",
"rootName" => "root",
"rootAttributes" => null,
"defaultTagName" => "data",
);
$serializer = new XML_Serializer($options);
if ($serializer->serialize($params['value'])) {
$xml = $serializer->getSerializedData();
print($xml);
}
}
?>
VIEWからは
<{xml_serializer value=(変数)}>
layouts/default.tplには
<{$content_for_layout}>
だけ書いておく。
出力は
<?xml version="1.0" encoding="UTF-8" ?>
<data>
<Article>
<id>2</id>
<title>2</title>
<category_id />
<comment>2</comment>
<body>2</body>
<visible>0</visible>
<modified>2008-03-12 14:19:48</modified>
<created>2008-03-12 14:19:48</created>
</Article>
</data>
となります。$xml->UnserializerにかませるとPHPの配列にしてくれるので後々扱いやすいです。

