<?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;
 
    }
 
}
 
?>
 
 |