diff --git a/includes/api/api_helpers.php b/includes/api/api_helpers.php index 5ba321c..f1bcae6 100644 --- a/includes/api/api_helpers.php +++ b/includes/api/api_helpers.php @@ -1,164 +1,159 @@ <?php /** * API helper functions * * Zed. The immensity of stars. The HyperShip. The people. * * (c) 2010, Dereckson, some rights reserved. * Released under BSD license. * * This file provides a functions to output the API message in several formats. * * The supported formats are preview (PHP dump), XML, PHP serialize and json. * * The XML outputs code uses the following codes: * - http://www.thedeveloperday.com/xml-beautifier-tool/ * - http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/ * * @package Zed * @subpackage API * @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org> * @copyright 2010 Sébastien Santoro aka Dereckson * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version 0.1 * @link http://scherzo.dereckson.be/doc/zed * @link http://zed.dereckson.be/ * @filesource */ /** * The main function for converting to an XML document. * * Pass in a multidimensional array and this recursively loops through * and builds up an XML document. * * @param mixed $data * @param string $rootNodeName What you want the root node to be — defaults to data. * @param SimpleXMLElement $xml Should only be used recursively * @param string $unknownNodeName Name to give to unknown (numeric) keys * @return string XML */ function toXml($data, $rootNodeName = 'data', $xml = null, $unknownNodeName = 'unknownNode') { if (!$rootNodeName) { $rootNodeName = 'data'; } if (!$unknownNodeName) { $unknownNodeName = 'unknownNode'; } - // turn off compatibility mode as simple xml throws a wobbly if you don't. - if (ini_get('zend.ze1_compatibility_mode') == 1) { - ini_set('zend.ze1_compatibility_mode', 0); - } - if ($xml == null) { if (!is_array($data) && !is_object($data)) { //We've got a singleton if (is_bool($data)) { $data = $data ? 'true' : 'false'; } return "<?xml version='1.0' encoding='utf-8'?><$rootNodeName>$data</$rootNodeName>"; } //Starts with simple document $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />"); } // loop through the data passed in. foreach ($data as $key => $value) { // no numeric keys in our xml please! if (is_numeric($key)) { // make string key... $key = $unknownNodeName . '_'. (string)$key; } // replace anything not alphanumeric $key = preg_replace('/[^a-z]/i', '', $key); //If there is another array found recursively call this function if (is_array($value)) { $node = $xml->addChild($key); //Recursive call. toXml($value, $rootNodeName, $node, $unknownNodeName); } elseif (is_object($value)) { $node = $xml->addChild($key); foreach ($value as $subkey => $subvalue) { if ($subkey == "lastError") { continue; } if ($subvalue === null) { //Ignore null values continue; } elseif (is_array($subvalue) || is_object($subvalue)) { //TODO: test this //Recursive call. $subnode = $node->addChild($subkey); toXml($subvalue, $rootNodeName, $subnode, $unknownNodeName); } elseif (is_bool($subvalue)) { $node->addChild($subkey, $subvalue ? 'true' : 'false'); } else { $node->addChild($subkey, htmlentities($subvalue)); } } //die(); //$array = array(); //$node = $xml->addChild($key); //toXml($value, $rootNodeName, $node, $unknownNodeName); } elseif (is_bool($value)) { $xml->addChild($key, $value ? 'true' : 'false'); } else { //Adds single node. if ($value || $value === 0) { $value = htmlentities($value); $xml->addChild($key, $value); } } } // pass back as string. or simple xml object if you want! return $xml->asXML(); } /** * Outputs API reply, printing it in the specified format. * * The format will be read form $_REQUEST['format']. * * @param mixed $reply the reply to format * @param string $xmlRoot the XML root element name (optional, default value is 'data'). * @param string $xmlChildren the XML children elements name (optional, will be deducted from the context if omitted, or, if not possible, will be unknownNode) */ function api_output ($reply, $xmlRoot = null, $xmlChildren = null) { $format = $_REQUEST['format'] ?? 'preview'; switch ($format) { case 'preview': echo '<pre>'; print_r($reply); echo '</pre>'; break; case 'php': echo serialize($reply); break; case 'json': echo json_encode($reply); break; case 'xml': require_once('BeautyXML.class.php'); $bc = new BeautyXML(); echo '<?xml version="1.0" encoding="utf-8"?>'; echo "\n"; echo $bc->format(toXml($reply, $xmlRoot, null, $xmlChildren)); break; case 'string': echo $reply; break; default: echo "Unknown API format: $_GET[format]"; break; } }