diff --git a/e107_admin/db.php b/e107_admin/db.php
index bad7cd911..04151b117 100644
--- a/e107_admin/db.php
+++ b/e107_admin/db.php
@@ -9,8 +9,8 @@
* Administration - Database Utilities
*
* $Source: /cvs_backup/e107_0.8/e107_admin/db.php,v $
- * $Revision: 1.12 $
- * $Date: 2009-08-22 00:28:54 $
+ * $Revision: 1.13 $
+ * $Date: 2009-08-24 00:58:32 $
* $Author: e107coders $
*
*/
@@ -285,12 +285,42 @@ function export_core_prefs()
function importCorePrefs()
{
//TODO - Cameron - move to own class and make generic.
- $xml = e107::getSingleton('xmlClass')->loadXMLfile($_FILES['file_userfile']['tmp_name'][0],TRUE);
- $data = e107::getSingleton('xmlClass')->xmlFileContents;
- $xll = new SimpleXMLElement($data);
+ $dummyXml = "
+
+
+1165362615
+e107 Powered Website
+/e107_0.8/
+{e_IMAGE}button.png
+e107 Website System
+
+admin
+user@yoursite.com
+
+
+
+
+";
+
- print_a($xll);
+ echo "
Example XML
".htmlentities($dummyXml)."
";
+
+ $data = $dummyXml;
+
+// $xml = e107::getSingleton('xmlClass')->loadXMLfile($_FILES['file_userfile']['tmp_name'][0],TRUE);
+ $xml = e107::getSingleton('xmlClass')->parseXml($dummyXml);
+ echo "Core XML Class
";
+ print_a($xml);
+
+// $data = e107::getSingleton('xmlClass')->xmlFileContents;
+
+ echo '3rd Party Class
';
+ $array_3rd = e107::getSingleton('xmlClass')->xml2ary($data);
+
+ print_a($array_3rd);
+
+
foreach ($xll->corePref as $key=>$val)
{
// echo "
". $xll->corePref['@attributes'] ." = ".$val;
@@ -312,6 +342,10 @@ function importCorePrefs()
function importCorePrefsForm()
{
+ //TODO - Fix Core XML class - array returned is incorrect.
+ importCorePrefs();
+ return;
+
// Get largest allowable file upload
$frm = e107::getSingleton('e_form');
diff --git a/e107_handlers/xml_class.php b/e107_handlers/xml_class.php
index 0d6efba24..4a0f4b47d 100644
--- a/e107_handlers/xml_class.php
+++ b/e107_handlers/xml_class.php
@@ -1,151 +1,155 @@
FALSE,
- // 'administration' => FALSE,
- // 'management' => array('install' => FALSE)
- // );
- var $stripComments; // Set true to strip all mention of comments from the returned array (default); FALSE to return comment markers
+ var $filter; // Optional filter for loaded XML
+ // Set to FALSE if not enabled (default on initialisation)
+ // Otherwise mirrors the required subset of the loaded XML - set a field FALSE to accept all
+ // ...elements lower down the tree. e.g.:
+ // $filter = array(
+ // 'name' => FALSE,
+ // 'administration' => FALSE,
+ // 'management' => array('install' => FALSE)
+ // );
+ var $stripComments; // Set true to strip all mention of comments from the returned array (default); FALSE to return comment markers
// Constructor - set defaults
+
+
function xmlClass()
{
$this->xmlFileContents = '';
$this->filter = FALSE;
- $this->stripComments = TRUE; // Don't usually want comments back
+ $this->stripComments = TRUE; // Don't usually want comments back
}
- function getRemoteFile($address, $timeout=10)
+
+ function getRemoteFile($address, $timeout = 10)
{
- // Could do something like: if ($timeout <= 0) $timeout = $pref['get_remote_timeout']; here
- $timeout = min($timeout,120);
- $timeout = max($timeout,3);
-
- $address = str_replace(array("\r","\n", "\t"),'',$address); // May be paranoia, but streaky thought it might be a good idea
- // ... and there shouldn't be unprintable characters in the URL anyway
-
- if(function_exists('file_get_contents'))
+ // Could do something like: if ($timeout <= 0) $timeout = $pref['get_remote_timeout']; here
+ $timeout = min($timeout, 120);
+ $timeout = max($timeout, 3);
+ $address = str_replace(array("\r", "\n", "\t"), '', $address); // May be paranoia, but streaky thought it might be a good idea
+ // ... and there shouldn't be unprintable characters in the URL anyway
+ if (function_exists('file_get_contents'))
{
-
- $old_timeout = e107_ini_set('default_socket_timeout', $timeout);
- $data = file_get_contents(urlencode($address));
- // $data = file_get_contents(htmlspecialchars($address)); // buggy - sometimes fails.
- if ($old_timeout !== FALSE) { e107_ini_set('default_socket_timeout', $old_timeout); }
-
- if ($data)
- {
- return $data;
- }
+ $old_timeout = e107_ini_set('default_socket_timeout', $timeout);
+ $data = file_get_contents(urlencode($address));
+ echo "data=".$data;
+ // $data = file_get_contents(htmlspecialchars($address)); // buggy - sometimes fails.
+ if ($old_timeout !== FALSE)
+ {
+ e107_ini_set('default_socket_timeout', $old_timeout);
+ }
+ if ($data)
+ {
+ return $data;
+ }
}
-
- if(function_exists("curl_init"))
+ if (function_exists("curl_init"))
{
$cu = curl_init();
curl_setopt($cu, CURLOPT_URL, $address);
curl_setopt($cu, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt ($cu, CURLOPT_HEADER, 0);
- curl_setopt ($cu, CURLOPT_TIMEOUT, $timeout);
+ curl_setopt($cu, CURLOPT_HEADER, 0);
+ curl_setopt($cu, CURLOPT_TIMEOUT, $timeout);
$this->xmlFileContents = curl_exec($cu);
if (curl_error($cu))
{
- $this -> error = "Curl error: ".curl_errno($cu).", ".curl_error($cu);
+ $this->error = "Curl error: ".curl_errno($cu).", ".curl_error($cu);
return FALSE;
}
curl_close($cu);
return $this->xmlFileContents;
}
-
- if(ini_get("allow_url_fopen"))
+ if (ini_get("allow_url_fopen"))
{
$old_timeout = e107_ini_set('default_socket_timeout', $timeout);
$remote = @fopen($address, "r");
- if(!$remote)
+ if (!$remote)
{
- $this -> error = "fopen: Unable to open remote XML file: ".$address;
+ $this->error = "fopen: Unable to open remote XML file: ".$address;
return FALSE;
}
}
else
{
- $old_timeout = $timeout;
- $tmp = parse_url($address);
- if(!$remote = fsockopen ($tmp['host'], 80 ,$errno, $errstr, $timeout))
- {
- $this -> error = "Sockets: Unable to open remote XML file: ".$address;
- return FALSE;
- }
- else
- {
- socket_set_timeout($remote, $timeout);
- fputs($remote, "GET ".urlencode($address)." HTTP/1.0\r\n\r\n");
- }
+ $old_timeout = $timeout;
+ $tmp = parse_url($address);
+ if (!$remote = fsockopen($tmp['host'], 80, $errno, $errstr, $timeout))
+ {
+ $this->error = "Sockets: Unable to open remote XML file: ".$address;
+ return FALSE;
+ }
+ else
+ {
+ socket_set_timeout($remote, $timeout);
+ fputs($remote, "GET ".urlencode($address)." HTTP/1.0\r\n\r\n");
+ }
}
-
- $this -> xmlFileContents = "";
+ $this->xmlFileContents = "";
while (!feof($remote))
{
- $this->xmlFileContents .= fgets ($remote, 4096);
+ $this->xmlFileContents .= fgets($remote, 4096);
}
- fclose ($remote);
+ fclose($remote);
if ($old_timeout != $timeout)
{
- if ($old_timeout !== FALSE) { e107_ini_set('default_socket_timeout', $old_timeout); }
+ if ($old_timeout !== FALSE)
+ {
+ e107_ini_set('default_socket_timeout', $old_timeout);
+ }
}
return $this->xmlFileContents;
}
-
- function parseXml($xml='')
+ function parseXml($xml = '')
{
- if($xml == '' && $this->xmlFileContents)
+ if ($xml == '' && $this->xmlFileContents)
{
$xml = $this->xmlFileContents;
}
- if(!$xml)
+ if (!$xml)
{
return false;
}
-
$xml = simplexml_load_string($xml);
- if(is_object($xml))
+ if (is_object($xml))
{
- $xml = (array)$xml;
+ $xml = (array) $xml;
}
$xml = $this->xml_convert_to_array($xml, $this->filter, $this->stripComments);
return $xml;
}
+
function xml_convert_to_array($xml, $localFilter = FALSE, $stripComments = TRUE)
{
- if(is_array($xml))
+ if (is_array($xml))
{
- foreach($xml as $k => $v)
+ foreach ($xml as $k=>$v)
{
if ($stripComments && ($k === 'comment'))
{
@@ -165,9 +169,9 @@ class xmlClass
}
if ($enabled)
{
- if(is_object($v))
+ if (is_object($v))
{
- $v = (array)$v;
+ $v = (array) $v;
}
$xml[$k] = $this->xml_convert_to_array($v, $onFilter, $stripComments);
}
@@ -176,7 +180,7 @@ class xmlClass
unset($xml[$k]);
}
}
- if(count($xml) == 1 && isset($xml[0]))
+ if (count($xml) == 1 && isset($xml[0]))
{
$xml = $xml[0];
}
@@ -185,39 +189,37 @@ class xmlClass
}
-
- function loadXMLfile($fname='', $parse = false, $replace_constants = false)
+ function loadXMLfile($fname = '', $parse = false, $replace_constants = false)
{
- if($fname == '')
+ if ($fname == '')
{
return false;
}
$xml = false;
-
- if(strpos($fname, '://') !== false)
+ if (strpos($fname, '://') !== false)
{
$this->getRemoteFile($fname);
}
else
{
- if($xml = file_get_contents($fname))
+ if ($xml = file_get_contents($fname))
{
$this->xmlFileContents = $xml;
}
}
- if($this->xmlFileContents)
+ if ($this->xmlFileContents)
{
- if($replace_constants == true)
+ if ($replace_constants == true)
{
global $tp;
- if(!is_object($tp))
+ if (!is_object($tp))
{
- require_once('e_parse_class.php');
+ require_once ('e_parse_class.php');
$tp = new e_parse;
}
$this->xmlFileContents = $tp->replaceConstants($this->xmlFileContents, '', true);
}
- if($parse == true)
+ if ($parse == true)
{
return $this->parseXML('');
}
@@ -230,5 +232,121 @@ class xmlClass
}
+ function xml2ary(&$string)
+ {
+ $parser = xml_parser_create();
+ xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
+ xml_parse_into_struct($parser, $string, $vals, $index);
+ xml_parser_free($parser);
+ $mnary = array();
+ $ary = &$mnary;
+ foreach ($vals as $r)
+ {
+ $t = $r['tag'];
+ if ($r['type'] == 'open')
+ {
+ if (isset($ary[$t]))
+ {
+ if (isset($ary[$t][0]))
+ $ary[$t][] = array();
+ else
+ $ary[$t] = array($ary[$t], array());
+ $cv = &$ary[$t][count($ary[$t]) - 1];
+ }
+ else
+ $cv = &$ary[$t];
+ if (isset($r['attributes']))
+ {
+ foreach ($r['attributes'] as $k=>$v)
+ $cv['_a'][$k] = $v;
+ }
+ $cv['_c'] = array();
+ $cv['_c']['_p'] = &$ary;
+ $ary = &$cv['_c'];
+ }
+ elseif ($r['type'] == 'complete')
+ {
+ if (isset($ary[$t]))
+ { // same as open
+ if (isset($ary[$t][0]))
+ $ary[$t][] = array();
+ else
+ $ary[$t] = array($ary[$t], array());
+ $cv = &$ary[$t][count($ary[$t]) - 1];
+ }
+ else
+ $cv = &$ary[$t];
+ if (isset($r['attributes']))
+ {
+ foreach ($r['attributes'] as $k=>$v)
+ $cv['_a'][$k] = $v;
+ }
+ $cv['_v'] = (isset($r['value']) ? $r['value'] : '');
+ }
+ elseif ($r['type'] == 'close')
+ {
+ $ary = &$ary['_p'];
+ }
+ }
+ $this->_del_p($mnary);
+ return $mnary;
+ }
+
+
+ function _del_p(&$ary)
+ {
+ foreach ($ary as $k=>$v)
+ {
+ if ($k === '_p')
+ unset($ary[$k]);
+ elseif (is_array($ary[$k]))
+ $this->_del_p($ary[$k]);
+ }
+ }
+ // Array to XML
+
+
+ function ary2xml($cary, $d = 0, $forcetag = '')
+ {
+ $res = array();
+ foreach ($cary as $tag=>$r)
+ {
+ if (isset($r[0]))
+ {
+ $res[] = $this->ary2xml($r, $d, $tag);
+ }
+ else
+ {
+ if ($forcetag)
+ $tag = $forcetag;
+ $sp = str_repeat("\t", $d);
+ $res[] = "$sp<$tag";
+ if (isset($r['_a']))
+ {
+ foreach ($r['_a'] as $at=>$av)
+ $res[] = " $at=\"$av\"";
+ }
+ $res[] = ">".((isset($r['_c'])) ? "\n" : '');
+ if (isset($r['_c']))
+ $res[] = $this->ary2xml($r['_c'], $d + 1);
+ elseif (isset($r['_v']))
+ $res[] = $r['_v'];
+ $res[] = (isset($r['_c']) ? $sp : '')."$tag>\n";
+ }
+ }
+ return implode('', $res);
+ }
+ // Insert element into array
+
+
+ function ins2ary(&$ary, $element, $pos)
+ {
+ $ar1 = array_slice($ary, 0, $pos);
+ $ar1[] = $element;
+ $ary = array_merge($ar1, array_slice($ary, $pos));
+ }
}
-?>
\ No newline at end of file
+
+
+
+?>