PageRenderTime 39ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/engineer/code/trunk/administrator/components/com_engineer/helpers/xml.php

https://bitbucket.org/eddieajau/the-art-of-joomla-archive
PHP | 504 lines | 345 code | 78 blank | 81 comment | 56 complexity | a8c003389fddcd06236e59bd4a7ebfc0 MD5 | raw file
  1. <?php
  2. /**
  3. * @version $Id: xml.php 71 2009-05-30 10:16:47Z eddieajau $
  4. * @copyright Copyright (C) 2009 New Life in IT Pty Ltd. All rights reserved.
  5. * @license GNU General Public License <http://www.gnu.org/copyleft/gpl.html>
  6. * @link http://www.theartofjoomla.com
  7. */
  8. /**
  9. * XML File Handling
  10. *
  11. * @package TAOJ.Engineer
  12. * @subpackage com_engineer
  13. */
  14. class iFileXML
  15. {
  16. /**
  17. * @return array Common meta tags in an xml setup file
  18. */
  19. function getCommonTags()
  20. {
  21. return array('name', 'version', 'creationdate', 'author', 'authoremail', 'authorurl', 'copyright', 'license', 'description');
  22. }
  23. function isValidTag($tagName)
  24. {
  25. switch ($tagName)
  26. {
  27. case 'mosinstall':
  28. case 'install';
  29. return true;
  30. break;
  31. default:
  32. return false;
  33. }
  34. }
  35. /**
  36. * @param array
  37. * @param string The version for the mosinstall tag
  38. * @return DOMIT_Lite_Document
  39. */
  40. function &arrayToXML($vars, $version='')
  41. {
  42. varsStripSlashes($vars);
  43. if ($version == '') {
  44. global $_VERSION;
  45. $version = $_VERSION->RELEASE . '.' . $_VERSION->DEV_LEVEL;
  46. }
  47. require_once(JPATH_SITE.'/includes/domit/xml_domit_lite_include.php');
  48. $xmlDoc = new DOMIT_Lite_Document();
  49. $elem = new DOMIT_Lite_Element('install');
  50. $elem->setAttribute('version', $version);
  51. if ($client = JArrayHelper::getValue($vars, 'client')) {
  52. $elem->setAttribute('client', $client);
  53. }
  54. $xmlDoc->setDocumentElement($elem);
  55. $root =& $xmlDoc->documentElement;
  56. $strip = get_magic_quotes_gpc();
  57. // meta tags for the setup file
  58. // contained in $vars['meta']
  59. $meta = JArrayHelper::getValue($vars, 'meta', array());
  60. foreach (iFileXML::getCommonTags() as $elemName) {
  61. $e =& $xmlDoc->createElement($elemName);
  62. if (isset($meta[$elemName]))
  63. {
  64. $e->setText($meta[$elemName]);
  65. $root->appendChild($e);
  66. }
  67. }
  68. // site files
  69. // contained in $vars['siteFiles']
  70. $eFiles =& $xmlDoc->createElement('files');
  71. $site_files = JArrayHelper::getValue($vars, 'siteFiles', array());
  72. if (count($site_files)) {
  73. $module = JArrayHelper::getValue($vars, 'module', null);
  74. $mambot = JArrayHelper::getValue($vars, 'mambot', null);
  75. foreach ($site_files as $i => $file) {
  76. $e =& $xmlDoc->createElement('filename');
  77. if ($strip) {
  78. $site_files[$i] = stripslashes($site_files[$i]);
  79. }
  80. if ($site_files[$i] === $module) {
  81. $e->setAttribute('module', JFile::stripExt($site_files[$i]));
  82. }
  83. if ($site_files[$i] === $mambot) {
  84. $e->setAttribute('mambot', JFile::stripExt($site_files[$i]));
  85. }
  86. //$site_files[$i] = JPath::clean($site_files[$i], false, true);
  87. $e->setText($site_files[$i]);
  88. $eFiles->appendChild($e);
  89. }
  90. $root->appendChild($eFiles);
  91. }
  92. // administrator files
  93. // contained in $vars['adminFiles']
  94. $eAdmin =& $xmlDoc->createElement('administration');
  95. $eFiles =& $xmlDoc->createElement('files');
  96. $eFiles->setAttribute('folder', 'admin');
  97. $admin_files = JArrayHelper::getValue($vars, 'adminFiles', array());
  98. if (count($admin_files)) {
  99. foreach ($admin_files as $i => $file) {
  100. if ($strip) {
  101. $admin_files[$i] = stripslashes($admin_files[$i]);
  102. }
  103. //$admin_files[$i] = JPath::clean($admin_files[$i], false, true);
  104. $e =& $xmlDoc->createElement('filename');
  105. $e->setText($admin_files[$i]);
  106. $eFiles->appendChild($e);
  107. }
  108. $eAdmin->appendChild($eFiles);
  109. }
  110. // administrator menus
  111. // contained in $vars['adminMenus'] and $vars['adminSubMenus']
  112. $admin_menus = JArrayHelper::getValue($vars, 'adminMenus', array());
  113. foreach ($admin_menus as $k=>$v) {
  114. $menu =& $admin_menus[$k];
  115. if (isset($menu['id'])) {
  116. $e =& $xmlDoc->createElement('menu');
  117. $e->setText($menu['name']);
  118. if (isset($menu['admin_menu_link'])) {
  119. $menu['admin_menu_link'] = ampReplace($menu['admin_menu_link']);
  120. $e->setAttribute('link', $menu['admin_menu_link']);
  121. }
  122. $eAdmin->appendChild($e);
  123. }
  124. }
  125. $admin_menus = JArrayHelper::getValue($vars, 'adminSubMenus', array());
  126. foreach ($admin_menus as $k => $v) {
  127. $menu =& $admin_menus[$k];
  128. if (isset($menu['id'])) {
  129. $e =& $xmlDoc->createElement('submenu');
  130. $e->setText($menu['name']);
  131. if (isset($menu['admin_menu_link'])) {
  132. $menu['admin_menu_link'] = ampReplace($menu['admin_menu_link']);
  133. $e->setAttribute('link', $menu['admin_menu_link']);
  134. }
  135. $eAdmin->appendChild($e);
  136. }
  137. }
  138. // install/uninstall queries
  139. if (isset($vars['installQueries'])) {
  140. $eQueries =& $xmlDoc->createElement('queries');
  141. $i = 1;
  142. foreach ($vars['installQueries'] as $query) {
  143. if (isset($query['id'])) {
  144. $eQuery =& $xmlDoc->createElement('query');
  145. $eQuery->setAttribute('id', $i++);
  146. $eQuery->setAttribute('table', $query['table']);
  147. $eQuery->setText($query['query']);
  148. $eQueries->appendChild($eQuery);
  149. }
  150. }
  151. $eInstall =& $xmlDoc->createElement('install');
  152. $eInstall->appendChild($eQueries);
  153. $root->appendChild($eInstall);
  154. }
  155. if (isset($vars['uninstallQueries'])) {
  156. $eQueries =& $xmlDoc->createElement('queries');
  157. $i = 1;
  158. foreach ($vars['uninstallQueries'] as $query) {
  159. if (isset($query['id'])) {
  160. $eQuery =& $xmlDoc->createElement('query');
  161. $eQuery->setAttribute('id', $i++);
  162. $eQuery->setAttribute('table', $query['table']);
  163. $eQuery->setText($query['query']);
  164. $eQueries->appendChild($eQuery);
  165. }
  166. }
  167. $eInstall =& $xmlDoc->createElement('uninstall');
  168. $eInstall->appendChild($eQueries);
  169. $root->appendChild($eInstall);
  170. }
  171. // install/uninstall files
  172. $installFile = JArrayHelper::getValue($vars, 'installFile', '');
  173. if ($installFile) {
  174. $e =& $xmlDoc->createElement('installfile');
  175. $e->setText($installFile);
  176. $root->appendChild($e);
  177. }
  178. $uninstallFile = JArrayHelper::getValue($vars, 'uninstallFile', '');
  179. if ($uninstallFile) {
  180. $e =& $xmlDoc->createElement('uninstallfile');
  181. $e->setText($uninstallFile);
  182. $root->appendChild($e);
  183. }
  184. if ($eAdmin->hasChildNodes()) {
  185. $root->appendChild($eAdmin);
  186. }
  187. if (isset($vars['params']) && $vars['params']) {
  188. $temp = new DOMIT_Lite_Document();
  189. $temp->parseXML($vars['params']);
  190. $root->appendChild($temp->documentElement);
  191. } else {
  192. $e =& $xmlDoc->createElement('params');
  193. $root->appendChild($e);
  194. }
  195. return $xmlDoc;
  196. }
  197. /**
  198. * @param string The xml file to parse
  199. * @param string The setup file type to check for
  200. * @param array A complex array of file variables
  201. * @return boolean True on success
  202. */
  203. function read($path, $type, &$vars)
  204. {
  205. JPath::check($path);
  206. $dom = new DOMDocument;
  207. $dom->load($path);
  208. return $dom;
  209. $parser = JFactory::getXMLParser('Simple');
  210. if ($parser->loadFile($path))
  211. {
  212. if (isset($parser->document)) {
  213. $root =& $parser->document;
  214. } else {
  215. return JError::raiseWarning(500, 'No XML document');
  216. }
  217. }
  218. else {
  219. return JError::raiseWarning(500, 'Error loading file');
  220. }
  221. $rootTagName = $root->name();
  222. if (!iFileXML::isValidTag($rootTagName)) {
  223. return JError::raiseWarning(500, 'Not valid install file');
  224. }
  225. if ($root->attributes('type') != $type) {
  226. return false;
  227. }
  228. $vars = array(
  229. 'client' => $root->attributes('client'),
  230. 'meta' => array()
  231. );
  232. foreach (iFileXML::getCommonTags() as $elemName)
  233. {
  234. if ($e = &$root->getElementByPath($elemName))
  235. {
  236. $data = $e->data();
  237. if ($elemName=='authorurl' && strcasecmp(substr($data, 0, 4), 'http')) {
  238. $vars['meta'][$elemName] = 'http://' . $data;
  239. } else {
  240. $vars['meta'][$elemName] = $data;
  241. }
  242. }
  243. else {
  244. $vars['meta'][$elemName] = '';
  245. }
  246. }
  247. if ($type == 'mambot') {
  248. $vars['meta']['group'] = $root->attributes('group');
  249. }
  250. // site files
  251. if ($e = &$root->getElementByPath('files'))
  252. {
  253. $c = &$e->children();
  254. $n = count($c);
  255. for ($i = 0; $i < $n; $i++) {
  256. $e =& $c[$i];
  257. $file = array(
  258. 'file' => str_replace('\\', '/', $e->data())
  259. );
  260. if ($e->attributes('module')) {
  261. $file['special'] = 1;
  262. }
  263. if ($e->attributes('plugin') || $e->attributes('mambot')) {
  264. $file['special'] = 1;
  265. }
  266. $vars['siteFiles'][] = $file;
  267. }
  268. }
  269. // legacy support
  270. if ($e = &$root->getElementByPath('images'))
  271. {
  272. $c = &$e->children();
  273. $n = count($c);
  274. for ($i = 0; $i < $n; $i++) {
  275. $e =& $c[$i];
  276. $vars['siteFiles'][] = array(
  277. 'file' => $e->data()
  278. );
  279. }
  280. }
  281. // legacy support
  282. if ($e = &$root->getElementByPath('css'))
  283. {
  284. $c = &$e->children();
  285. $n = count($c);
  286. for ($i = 0; $i < $n; $i++) {
  287. $e =& $c[$i];
  288. $vars['siteFiles'][] = array(
  289. 'file' => $e->data()
  290. );
  291. }
  292. }
  293. // check admin section
  294. if ($e = &$root->getElementByPath('administration/files'))
  295. {
  296. $c = &$e->children();
  297. $n = count($c);
  298. for ($i = 0; $i < $n; $i++) {
  299. $e =& $c[$i];
  300. $vars['adminFiles'][] = array('file' => str_replace('\\', '/', $e->data()));
  301. }
  302. }
  303. // administrator menus
  304. /*
  305. $nodeList = &$root->getElementsByPath('administration/menu');
  306. $n = $nodeList->getLength();
  307. for ($i = 0; $i < $n; $i++) {
  308. $e =& $nodeList->item($i);
  309. $vars['adminMenus'][] = array(
  310. 'id' => $i,
  311. 'name' => $e->getText(),
  312. 'admin_menu_link' => $e->getAttribute('link')
  313. );
  314. }
  315. $nodeList = &$root->getElementsByPath('administration/submenu');
  316. $n = $nodeList->getLength();
  317. for ($i = 0; $i < $n; $i++) {
  318. $e =& $nodeList->item($i);
  319. $vars['adminSubMenus'][] = array(
  320. 'id' => $i,
  321. 'name' => $e->getText(),
  322. 'admin_menu_link' => $e->getAttribute('link')
  323. );
  324. }
  325. */
  326. // install queries
  327. if ($e = &$root->getElementByPath('install/queries'))
  328. {
  329. $c = &$e->children();
  330. $n = count($c);
  331. for ($i = 0; $i < $n; $i++) {
  332. $e =& $c[$i];
  333. $vars['installQueries'][] = array(
  334. 'id' => count(@$vars['installQueries']),
  335. 'query' => $e->data(),
  336. 'table' => $e->attributes('table')
  337. );
  338. }
  339. }
  340. // uninstall queries
  341. if ($e = &$root->getElementByPath('uninstall/queries'))
  342. {
  343. $c = &$e->children();
  344. $n = count($c);
  345. for ($i = 0; $i < $n; $i++) {
  346. $e =& $c[$i];
  347. $vars['uninstallQueries'][] = array(
  348. 'id' => count(@$vars['uninstallQueries']),
  349. 'query' => $e->data(),
  350. );
  351. }
  352. }
  353. // installer files
  354. if ($e = &$root->getElementByPath('installfile')) {
  355. $vars['installFile'] = $e->data();
  356. }
  357. if ($e = &$root->getElementByPath('uninstallfile')) {
  358. $vars['uninstallFile'] = $e->data();
  359. }
  360. // parameters
  361. if ($e = &$root->getElementByPath('params')) {
  362. $vars['params'] = $e->toString();
  363. } else {
  364. $vars['params'] = '<params/>';
  365. }
  366. unset($parser);
  367. return $vars;
  368. }
  369. /**
  370. * Saves the xml steup file
  371. * @param string The name of the element
  372. * @param array
  373. * @param string The path path to save in
  374. * @return boolean True if successful
  375. */
  376. function write($element, $vars, $filePath)
  377. {
  378. $xmlDoc =& iFileXML::arrayToXML($vars);
  379. $root =& $xmlDoc->documentElement;
  380. $root->setAttribute('type', $element);
  381. if ($element == 'mambot' && isset($vars['meta']['group'])) {
  382. $root->setAttribute('group', $vars['meta']['group']);
  383. }
  384. $xmlDoc->setXMLDeclaration('<?xml version="1.0" encoding="iso-8859-1"?>');
  385. JPath::check($filePath);
  386. //echo $xmlDoc->toNormalizedString(1);die;
  387. $ret = $xmlDoc->saveXML($filePath, true);
  388. unset($xmlDoc);
  389. return $ret;
  390. }
  391. }
  392. /**
  393. * A function to strip slashes in critical string elements
  394. * @param array The vars array
  395. */
  396. function varsStripSlashes(&$vars)
  397. {
  398. if (!get_magic_quotes_gpc()) {
  399. return;
  400. }
  401. if (isset($vars['installQueries'])) {
  402. foreach ($vars['installQueries'] as $k => $v) {
  403. $v['query'] = stripslashes($v['query']);
  404. $vars['installQueries'][$k] = $v;
  405. }
  406. }
  407. if (isset($vars['uninstallQueries'])) {
  408. foreach ($vars['uninstallQueries'] as $k => $v) {
  409. $v['query'] = stripslashes($v['query']);
  410. $vars['uninstallQueries'][$k] = $v;
  411. }
  412. }
  413. if (isset($vars['params'])) {
  414. $vars['params'] = stripslashes($vars['params']);
  415. }
  416. }