<?php
class abstractxmlmenu {
/**
* protected (object) doc
* DOMDocument object
*/
protected $doc = null;
/**
* protected (object::node) root
* DOMDocument root node
*/
protected $root = null;
/**
* protected (array) aTypes
* XML to HTML XSLT types
*/
protected $aTypes = array ();
/**
* protected (string) sHtml
* HTML menu string
*/
protected $sHtml = '';
/**
* protected (string) sXml
* XML menu string
*/
protected $sXml = '';
/**
* public function __construct
* constructor
* @Param (string) sVersion : xml version
* @Param (string) sEncoding : xml encoding
*/
public function __construct ($sVersion = null, $sEncoding= null) {
$aTypes = scandir ('xsl');
foreach ($aTypes as $type) {
$this -> aTypes[$type] = strtoupper (substr ($type, 0, -4));
}
}
/**
* public function defineNode
* method defining a node
* @Param (string) sText : text of the node
* @Param (array) aAttr : array of attributes for the node
* @Param (int) iId : id of the parent node
* @Return (int) new node's id
*/
public function defineNode ($sText, $aAttr = array (), $iId=0) {
$newElem = $this -> doc -> createElement ('node', $sText);
$dump = $this -> root -> getElementsByTagName('node');
$iNewId = $dump -> length + 1;
if($iId===0){
$newElem = $this -> root -> appendChild ($newElem);
}
else {
$parent = $this -> doc -> getElementById($iId);
$newElem = $parent -> appendChild ($newElem);
}
$newElem -> setAttribute ('xml:id', $iNewId);
if (!empty ($aAttr) && is_array ($aAttr)) {
$this -> defineAttributes ($aAttr, $iNewId);
}
return $iNewId;
}
/**
* public function defineLink
* method defining a link on a given node
* @Param (string) sLink : url of the link
* @Param (int) iId : id of the node
*/
public function defineLink ($sLink, $iId) {
$elem = $this -> doc -> getElementById($iId);
$elem -> setAttribute ('link', $sLink);
}
/**
* public function defineAttributes
* method defining attributes for a given node
* @Param (array) aAttr : array of attributes
* @Param (int) iId : id of the node
*/
public function defineAttributes ($aAttr, $iId) {
$elem = $this -> doc -> getElementById($iId);
foreach ($aAttr as $attrName => $attrValue) {
$elem -> setAttribute ($attrName, $attrValue);
}
}
/**
* public function __toString
* method to return the XML of a menu
* @return (string) iId : XML string
*/
public function __toString () {
return htmlentities ($this -> doc -> saveXML ());
}
/**
* public function xmlToFile
* method to save the xml to a file
* @Param (string) sFileName :filename
*/
public function xmlToFile ($sFileName) {
$this -> doc -> save ('xml/'.$sFileName.'.xml');
}
/**
* public function fileToXml
* method to load an xml from a file
* @Param (string) sFileName :filename
*/
public function fileToXml ($sFileName) {
$this -> doc -> load ('xml/'.$sFileName.'.xml');
}
/**
* public function htmlToFile
* method to save the html to a file.
* cannot be done if XSLTProcessor is not enabled (see comments in the xmlmenu::toHTML () method to learn how to save the HTML file)
* @Param (string) sFileName :filename
*/
public function htmlToFile ($sFileName) {
if (empty ($this -> sHtml)) {
return false;
}
$fp = fopen ('html/'.$sFileName.'.html', 'w+');
fwrite ($fp, $this -> sHtml);
fclose ($fp);
return true;
}
/**
* public function toHTML
* method to transform the xml to html
* @Param (string) sType : XSL file to be used
* @Return (string) sHtml : transformed HTML string
*/
public function toHTML ($sType) {
if (false === ( $type = array_search($sType, $this -> aTypes))) {
return false;
}
$xsl = new XSLTProcessor ();
$xsl -> importStyleSheet (DOMDocument::load ('xsl/'.$type));
$this -> sHtml = $xsl -> transformToXML ($this -> doc);
return $this -> sHtml;
}
}
?>
|