forked from extern/egroupware
ecb972ca66
XML files are parsed into JSON objects on the server, then sent as JSON. Etemplate parses the JSON object on the client side instead of the XML file directly. This is supposed to be faster for IE.
127 lines
2.8 KiB
PHP
127 lines
2.8 KiB
PHP
<?php
|
|
|
|
/*
|
|
* Egroupware
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
* @package etemplate
|
|
* @subpackage api
|
|
* @link http://www.egroupware.org
|
|
* @author Nathan Gray
|
|
* @version $Id$
|
|
*/
|
|
|
|
const CACHE_TIME = 3600;
|
|
|
|
//Set all necessary info and fire up egroupware
|
|
$GLOBALS['egw_info']['flags'] = array(
|
|
'currentapp' => 'etemplate',
|
|
'noheader' => true,
|
|
'nonavbar' => true
|
|
);
|
|
include ('../header.inc.php');
|
|
|
|
if (!ajaxtoJSON($_GET['name']))
|
|
{
|
|
header('404 Not found');
|
|
http_response_code(404);
|
|
}
|
|
|
|
/**
|
|
* Gets the specified template XML file converted to JSON representation
|
|
*
|
|
* @param String $name
|
|
* @return JSON
|
|
*/
|
|
function ajaxtoJSON($name)
|
|
{
|
|
if(!$name)
|
|
{
|
|
$name = get_var('name');
|
|
}
|
|
$filename = etemplate_widget_template::rel2path(etemplate_widget_template::relPath($name));
|
|
// Bad template name
|
|
if(trim($filename) == '')
|
|
{
|
|
return false;
|
|
}
|
|
error_log("Filename: $filename");
|
|
|
|
$mtime = filemtime($filename);
|
|
|
|
// First, check cache
|
|
$cached = egw_cache::getInstance('etemplate', $name);
|
|
|
|
// Not found, or modified
|
|
if(!$cached || !is_array($cached) || is_array($cached) && $cached['mtime'] != $mtime)
|
|
{
|
|
// Load XML & parse into JSON
|
|
$reader = simplexml_load_file($filename);
|
|
$template = json_encode(nodeToArray($reader));
|
|
$cached = array(
|
|
'template' => $template,
|
|
'mtime' => $mtime
|
|
);
|
|
}
|
|
else if ($cached);
|
|
{
|
|
$template = $cached['template'];
|
|
}
|
|
if($cached)
|
|
{
|
|
// Keep in instance cache so we don't have to regenerate it
|
|
egw_cache::setInstance('etemplate', $name, $cached, CACHE_TIME);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// Should set some headers so the browser can cache it too
|
|
header('Cache-Control: public, max-age='.CACHE_TIME);
|
|
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+CACHE_TIME) . ' GMT');
|
|
header('Content-type: application/json');
|
|
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime));
|
|
header('Content-Length: ' . mb_strlen($template));
|
|
|
|
echo $template;
|
|
return true;
|
|
}
|
|
|
|
function nodeToArray($xmlnode, &$jsnode = false)
|
|
{
|
|
if(!$xmlnode) return;
|
|
|
|
if(!($xmlnode instanceof SimpleXMLElement) && trim($xmlnode))
|
|
{
|
|
$jsnode['content'] = $xmlnode;
|
|
return '';
|
|
}
|
|
$nodename = $xmlnode->getName();
|
|
$node =& $jsnode ? $jsnode : array();
|
|
$node['tag'] = strtolower($nodename);
|
|
$node['attributes'] = array();
|
|
|
|
if (count($xmlnode->attributes()) > 0)
|
|
{
|
|
$node["attributes"] = array();
|
|
foreach($xmlnode->attributes() as $key => $value)
|
|
{
|
|
$node["attributes"][$key] = (string)$value;
|
|
}
|
|
}
|
|
|
|
if(trim($xmlnode->__toString()) != '')
|
|
{
|
|
$node['content'] = $xmlnode->__toString();
|
|
}
|
|
|
|
// Load children
|
|
$child_index = 0;
|
|
foreach ($xmlnode->children() as $childxmlnode)
|
|
{
|
|
$node['children'][$child_index] = array('tag' => $childxmlnode->getName());
|
|
nodeToArray($childxmlnode, $node['children'][$child_index++]);
|
|
}
|
|
return $node;
|
|
}
|