Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/* vim: set expandtab tabstop=4 shiftwidth=4: */// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2003 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available at through the world-wide-web at |// | http://www.php.net/license/2_02.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Authors: Wolfram Kriesing <wolfram@kriesing.de> |// +----------------------------------------------------------------------+//// $Id: XML.php,v 1.11.2.1 2009/03/12 17:19:49 dufuz Exp $require_once 'XML/Parser.php';/*** the XML interface for the tree class** @package Tree* @author* @version* @access public*/class Tree_Memory_XML extends XML_Parser{/*** @var array the first element has to be empty, so we can use* the parentId=0 as "no parent"*/var $data = array(0 => null);/*** @var integer $level*/var $level = 0;/*** @var array $parentIdOnLevel*/var $parentIdOnLevel = array();/*** @var boolean set case folding for the XML_Parser to false*/var $folding = false; // turn off case folding/*** @var boolean if true it converts all attributes and tag names etc* to lower case this is default, since i dont see no way* of case insensitive comparison in the tree class, since* you can access the internal data directly or you get* them returned I know this is not 100% proper OOP but that's* how it is right now.*/var $_toLower = true;// {{{ Tree_Memory_XML()/***** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function Tree_Memory_XML($dsn, $options){$handle = $dsn;$this->XML_Parser();if (@is_resource($handle)) {$this->setInput($handle);} elseif ($handle != '') {$this->setInputFile($handle);} else {return $this->raiseError('No filename passed.');}}// }}}// {{{ startHandler()/***** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function startHandler($parser, $element, $attribs){$elementBeforeId = sizeof($this->data) - 1;$curId = sizeof($this->data);$this->data[$curId]['id'] = $curId;$this->data[$curId]['name'] = $this->_toLower?strtolower($element):$element;$this->data[$curId]['level'] = $this->level;$this->data[$curId]['attributes'] = $attribs;if ($this->_toLower) {$this->data[$curId]['attributes'] = array();foreach($attribs as $key => $value) {$this->data[$curId]['attributes'][strtolower($key)] = $value;}}// is that a new child, or just a 'next' of a child?if (isset($this->data[$elementBeforeId]['level']) &&$this->level == $this->data[$elementBeforeId]['level']) {$this->data[$curId]['parentId'] =$this->data[$elementBeforeId]['parentId'];} else {// set stuff for the first child !!!// the root has no parentif ($this->level > 0) {$parentId = $this->parentIdOnLevel[$this->level-1];$this->data[$curId]['parentId'] = $parentId;} else {$this->data[$curId]['parentId'] = 0;}}$this->parentIdOnLevel[$this->level] = $curId;$this->level++;}// }}}// {{{ endHandler()/***** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function endHandler($parser, $element){$this->level--;}// }}}// {{{ cdataHandler()/***** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function cdataHandler($parser, $cdata){# QUESTION: why is this method called multiple times for one element?# is every space a cdata ???# ANSWER: if you call xml_parse($parser, "foo ", false) and then# xml_parse($parser, "bar", true), callbacks are done once# for each xml_parse() call.if (!isset($this->data[ sizeof($this->data)-1 ]['cdata'])) {$this->data[ sizeof($this->data)-1 ]['cdata'] = '';}#print "cdata = '$cdata'\r\n";$this->data[ sizeof($this->data)-1 ]['cdata'].= $cdata;}// }}}// {{{ defaultHandler()/***** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function defaultHandler($parser, $cdata){// $this->data[ sizeof($this->data)-1 ]['cdata'] = $cdata;// not in use yet :-( is that ok??}// }}}// {{{ setup()/*** read the data from the xml file and prepare them so the tree* class can work with it, the preparation is mainly done in startHandler** @version 2002/01/17* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function setup(){$this->parse();return $this->data;}// }}}// {{{ setupByRawData()/*** read the data from an xml string and prepare them so the tree* class can work with it, the preparation is mainly done in startHandler** @version 2002/02/05* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @return boolean true on success*/function setupByRawData($xmlString){$this->parseString($xmlString, true);return $this->data;}// }}}// {{{ add()/*** TO BE IMPLEMNTED* adds _one_ new element in the tree under the given parent* the values' keys given have to match the db-columns, because the* value gets inserted in the db directly* to add an entire node containing children and so on see 'addNode()'** @see addNode()* @version 2001/10/09* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @param array this array contains the values that shall be* inserted in the db-table* @return mixed either boolean false on failure or the id* of the inserted row*//* function add($newValues){// add the data in the internal structure $this->data$this->data[sizeof($this->data)] = $newValues;# i am thinking if it might be a good solution to walk the data-array# and write each line singlely until the one to add comes, write it and# keep on writing the data-array# but that means writing the entire file every time any method that# changes the xml-file's structure the entire file is written,# can that not be done somehow better ???# // and regenerate the xml file# $this->_writeFile();}*/// }}}// {{{ remove()/*** TO BE IMPLEMNTED* removes the given node** @version 2001/10/09* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @param mixed $id the id of the node to be removed* @return boolean true on success*//* function remove($id){// remove the data from this->dataunset($this->data[$id]);# see comment in "add"-method}*/// }}}// {{{ move()/*** TO BE IMPLEMNTED* move an entry under a given parent or behind a given entry** @version 2001/10/10* @access public* @author Wolfram Kriesing <wolfram@kriesing.de>* @param integer if prevId is given the element with the id idToMove shall be moved _behind_ element with id=prevId* before would be easier, but then no element could be inserted at the end :-/* @return boolean true for success*//* function move($idToMove, $newParentId, $prevId=0){$this->data[$idToMove]['parentId'] = $newParentId;$this->data[$idToMove]['prevId'] = $prevId;# see comment in "add"-method}*/}