<?php
/**
* xmlmenuhasnone
* DOMDocument and XSLTProcessor are disabled
*
* @author: johan <barbier_johan@hotmail.com>
*/
class xmlmenuhasnone extends abstractxmlmenu {
/**
* public function __construct
* constructor
* @Param (string) sVersion : xml version
* @Param (string) sEncoding : xml encoding
*/
public function __construct ($sVersion = null, $sEncoding= null) {
$sVersion = (is_null ($sVersion)?'1.0':$sVersion);
$sEncoding = (is_null ($sEncoding)?'iso-8859-1':$sEncoding);
$this -> sXml .= '<?xml version="'.$sVersion.'" encoding="'.$sEncoding.'"?>';
$this -> sXml .= '<menu></menu>';
parent::__construct ($sVersion, $sEncoding);
}
/**
* 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) {
$iNewId = substr_count ($this -> sXml, 'xml:id') + 1;
$sAttr = '';
if (!empty ($aAttr) && is_array ($aAttr)) {
foreach ($aAttr as $attrName => $attrValue) {
$sAttr .= $attrName.'="'.$attrValue.'" ';
}
}
$sTempXml = '<node xml:id="'.$iNewId.'" '.$sAttr.'>'.$sText.'</node>';
if ($iId === 0) {
$iLastPos = strpos ($this -> sXml, '</menu>');
$this -> sXml = substr_replace ($this -> sXml, $sTempXml, $iLastPos, 0);
} else {
$iIdPos = strpos ($this -> sXml, 'xml:id="'.$iId.'"');
preg_match_all ('@(\<node|node>)+@im', $this -> sXml, $aNodes, PREG_OFFSET_CAPTURE, $iIdPos);
$iOpened = 1;
$iClosed = 0;
foreach ($aNodes[0] as $clef => $val) {
if ($val[0] === '<node') {
$iOpened ++;
} else {
$iClosed ++;
$iTmpPos = $val[1];
}
if ($iOpened === $iClosed) {
$iLastPos = $iTmpPos;
break;
}
}
$this -> sXml = substr_replace ($this -> sXml, $sTempXml, $iLastPos - 2, 0);
}
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) {
$iTempPos = strpos ($this -> sXml, 'xml:id="'.$iId.'"');
$iLastPos = strpos ($this -> sXml, '>', $iTempPos);
$sString = 'link="'.$sLink.'"';
$this -> sXml = substr_replace ($this -> sXml, $sString, $iLastPos, 0);
}
/**
* 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) {
$iTempPos = strpos ($this -> sXml, 'xml:id="'.$iId.'"');
$iLastPos = strpos ($this -> sXml, '>', $iTempPos);
$sAttr = '';
foreach ($aAttr as $attrName => $attrValue) {
$sAttr .= $attrName.'="'.$attrValue.'" ';
}
$this -> sXml = substr_replace ($this -> sXml, $sAttr, $iLastPos, 0);
}
/**
* public function __toString
* method to return the XML of a menu
* @return (string) iId : XML string
*/
public function __toString () {
return htmlentities ($this -> sXml);
}
/**
* public function xmlToFile
* method to save the xml to a file
* @Param (string) sFileName :filename
*/
public function xmlToFile ($sFileName) {
$fp = fopen ('xml/'.$sFileName.'.xml', 'w+');
fwrite ($fp, $this -> sXml);
fclose ($fp);
}
/**
* public function fileToXml
* method to load an xml from a file
* @Param (string) sFileName :filename
*/
public function fileToXml ($sFileName) {
$this -> sXml = file_get_contents ('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) {
return false;
}
/**
* 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;
}
/**
* Difficult bit here that needs a bit of explanation
* We do not have XSLTProcessor availaible.
* So, we cannot use it to apply the stylesheet.
* What we do is :
* we take the generated xml.
* We add a stylesheet import by parsing the text.
* we save it to a temporary folder
* we return only a link to the newly created file.
* now, to have the html version of the xml , user will need to save it via his web browser...
*/
$sXsl = '<?xml-stylesheet type="text/xsl" href="../xsl/'.$type.'"?>';
$this -> sHtml = $this -> sXml;
$iPos = strpos ($this -> sHtml, '?>');
$this -> sHtml = substr_replace ($this -> sHtml, $sXsl, $iPos + 2, 0);
$iCpt = count (scandir ('tmp_xml'));
$fp = fopen ('tmp_xml/tmp_xmllfile_'.$iCpt.'.xml', 'w+');
fwrite ($fp, $this -> sHtml);
fclose ($fp);
$this -> sHtml = '<a href="tmp_xml/tmp_xmllfile_'.$iCpt.'.xml" title="Cliquer pour voir le html généré" target="_blank">Cliquer pour voir le html généré</a>';
return $this -> sHtml;
}
}
?>
|