XMLDB/XMLDB.php

213 lines
6.1 KiB
PHP
Raw Normal View History

2010-10-07 17:57:56 +02:00
<?
class XMLDB{
// Path and name to the file
protected $_file;
// Primary key
protected $_primaryKey;
// XPATH
protected $_xpath;
// Content of the XML DB File
protected $_doc;
public function __construct($file, $pk = "id"){
ini_set("display_errors", "off");
ini_set("log_errors", "on");
ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/test/XMLDB/XMLDB.log');
$this->_primaryKey = $pk;
$this->_file = $file;
$this->_doc = new DOMDocument;
if(@$this->_doc->load($this->_file))
$this->_xpath = new DOMXpath($this->_doc);
else{
$this->_file = $file;
$this->_doc = null;
$this->xpath = null;
}
}
public function isLoaded(){
if($this->_doc != null)
return true;
else
return false;
}
public function setPrimaryKey($pk){
$this->_primaryKey = $pk;
}
public function getPrimaryKey(){
return $this->_primaryKey;
}
public function getXPath(){
return $this->_xpath;
}
/**
* Saving the DB file
*/
public function save(){
if($this->_doc != null && $this->_file != null){
$this->_doc->save($this->_file);
return true;
}else{
return false;
}
}
/**
* Allows you to get an array of the node you're looking for based on a "where" search thanks to child or attribute value
* @param $from string Name of the node you're looking for
* @param $id string value of the primary key
* @param $childs array name/value of the child node
* @param $attributes array name/value of the attribute
* @return array
*/
// TODO other format
public function selectNode($from, $id = null, $attributes = null, $childs = null, $format = 'array'){
if (!$from) {
throw new Exception('uhoh, no "where" statement?');
}
if($id != null){
$attribute .= '[@' . $this->_primaryKey . ' = "' . $id . '"]';
}
if($attributes != null){
foreach($attributes as $attributeName=>$attributeValue)
$attribute .= '[@' . $attributeName . ' = "' . $attributeValue . '"]';
}
if($childs != null){
foreach($childs as $childName=>$childValue)
$child .= '/' . $childName . '[.="' . $childValue . '"]';
}
$request = $this->_xpath->query('//'.$from.$attribute.$child);
$requestLength = $request->length;
if($format == "array"){
//$return = array('length'=>$requestLength, 'request'=>'//'.$from.$attribute.$child);
foreach($request as $element){
if($childName != null && $childValue != null)
$element = $element->parentNode;
$elementValue = $element->attributes->item(0)->value;
$return[$elementValue]['attributes'] = array();
$return[$elementValue]['childs'] = array();
//Retrieving Attributes
$attributes = $element->attributes;
$length = $attributes->length;
for ($i = 1; $i <= $length; $i++) {
$return[$elementValue]['attributes'][$attributes->item($i)->name] = $attributes->item($i)->value;
}
// Retrivieving childs
$nodes = $element->childNodes;
$length = $nodes->length;
for ($i = 1; $i <= $length; $i++) {
$return[$elementValue]['childs'][$nodes->item($i)->nodeName] = $nodes->item($i)->nodeValue;
}
}
}else if($format == "node"){
$return = $request;
}
return $return;
}
/**
* Allows you to insert a node into your DB thanks to an array
* @param $node array
* @param $where string in which node you want to put it. By default, the root of the xml file
* @param $position string 'before' or 'after'
* @return bool
*/
// TODO other $where and $position
public function insertNode($node, $where = null, $position = null){
if(!is_array($node) || !isset($node['name']))
return false;
// Creating the node from an array
$element = $this->_doc->createElement($node['name']);
if(isset($node['attributes'])){
foreach($node['attributes'] as $attributeName=>$attributeValue){
$element->setAttribute($attributeName, $attributeValue);
}
}
if(isset($node['childs'])){
foreach($node['childs'] as $childName=>$childValue){
$newElement = $this->_doc->createElement($childName, $childValue);
$element->appendChild($newElement);
}
}
// Inserting the node into the DB
if($where == null){
$this->_doc->firstChild->appendChild($element);
}
return $this->save();
}
/**
*
* @param $node string
* @param $oldAttribute string name of the attribute you want to change
* @param $newAttribute array name/value of the attribute you want to add
* @param $forceInsert bool
* @return bool
*/
public function updateNodeAttribute($node, $oldAttribute, $newAttribute, $forceInsert = false){
$request = $this->selectNode($node, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node');
if($request->length == 1){
if(!$forceInsert){
$request->item(0)->setAttribute($oldAttribute[0],$newAttribute[1]);
}else{
$request->item(0)->setAttribute($newAttribute[0],$newAttribute[1]);
}
return $this->save();
}
else
return false;
}
/**
*
* @param $node string
* @param $value string new value of the node
* @return bool
*/
public function updateNodeValue($node, $attribute = null, $child = null, $value){
$request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node');
//$request = $this->_xpath->query('//'.$node.'[@' . $attribute[0] . ' = "' . $attribute[1] . '"]');
if($request->length == 1){
$request = $request->item(0);
$newText = new DOMText($value);
$request->removeChild($request->firstChild);
$request->appendChild($newText);
return $this->save();
}
else
return false;
}
public function deleteNode($node, $id = null, $attributes = null){
if($id != null && $attributes != null)
return false;
if($id != null)
$request = $this->selectNode($node, $id, null, null, 'node')->item(0);
if($attributes != null)
$request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node')->item(0);
$request->parentNode->removeChild($request);
return $this->save();
}
}