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の配列にしてくれるので後々扱いやすいです。