begin process at 2012 05 27 17:59:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Xml

 > [PHP5] XML MENU

[PHP5] XML MENU


 Information sur la source

Note :
9 / 10 - par 4 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Xml Classé sous :xml, xsl, menu, xhtml, dom Niveau :Initié Date de création :26/05/2006 Date de mise à jour :06/06/2006 12:43:31 Vu / téléchargé :13 431 / 999

Auteur : malalam

Ecrire un message privé
Site perso
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

NECESSITE : PHP 5.
DOMDocument et XSLTProcessor sont préférables, mais non obligatoires.

Une petite classe qui va permettre de générer un flux XML, et de le transofmer en un menu.
Ce n'est qu'une première approche, et demande à être personnalisé. Mais c'est un bon entrainement pour qui veut voir un peu comment peuvent interagir PHP et le XML.

La classe XML Menu permet donc de générer un type de flux XML. Evidemment, ce flux peut aussi être créé à la main, très facilement.
Ensuite, cette classe utilise des fichiers XSL pour transformer ce flux XML en un menu HTML. J'ai créé 2 types de fichiers, et on peut en créer autant que l'on veut (il suffit de les placer dans le répertoire 'xsl' pour qu'ils soient gérés).
Les flux XML généréré peuvent être sauvegardés (répertoire 'xml'), de même que les menus html générés (répertoire 'html'). On peut aussi charger un flux xml à partir d'un fichier (si, par exemple, on a créé le flux XML à la main).

Voir le fichier class/xmlmenu.cls.php pour plus d'informations sur les différentes méthodes utilisables.

Source

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

 Conclusion

Decouverte d'un bug dans la version sans DOM. Bon, on s'en fout, DOM fait partie du core de php...mais quand même!! Bref, problème d'imbrication lorsqu'un noeud a plusieurs noeuds enfants...je travaille à la correction.

Nouvel ajout : DOMDocument n'est plus non plus obligatoire.
Et l'appel à la classe a changé.
On instancie désormais par :
$menu = xmlmenu::getInstance ($sVersion, $sEncoding);
(voir index.php)
L'instanciation correcte est alors appelée, en fonction des extensions activées ou non. Aucun appel aux méthodes ne change de toutes façons :-) Même s'il y a désormais 3 classes différentes.

Si on a pas DOMDocument, le parsing se fait comme un par parsing de chaîne, et c'est assez efficace :-)

Bon, cette fois, XSLTProcessor n'est plus nécessaire. Mais je vais expliquer ici comment j'ai contourné... :
Si XSLTProcessor n'est pas activé, le code le détecte seul (j'ai ajouté la détection de DOMDocument aussi, car je vais aussi faire en sorte que ce code fonctionne même dans DOMDocument).
Dans ce cas, lors de l'application du XSL, voici ce que fait la classe :
- elle prend le XML généré, et le parse pour lui ajouter un lien vers le XSL désiré (<?xml-stylesheet type="text/xsl" href="..." ?>)
- elle réécrit ce XML et le sauvegarde dans un répertoire tmp_xml.
- au lieu de renvoyer, comme c'est le cas si XSLTProcessor est activé, le html généré, elle renvoie un lien vers le fichier XML nouvellement enregistré.
- ce lien va afficher correctement le XML sous forme d'une page HTML...sauf que si on mate la source, on voit toujours du XML (mais l'output est bien du HTML).
- pour récupérer le vrai fichier HTML, il faut, avec son client web (testé avec IE et FF), faire "enregistrer sous...) et l'enregistrer quelque part (on se fiche de l'extension, mais par défaut ce sera un .html).
- si on regarde la source du fichier ainsi enregistré, on verra bien du HTML. Si on le lance, ce sera aussi du html : plus trace du XML :-) ).

C'est un peu compliqué, mais je n'ai pas trouvé, pour l'instant, d'autre moyen.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

29 mai 2006 14:19:09 :
Modifications mineures + ajout de la possibilité de générer les menus même si XSLTProcessor n'est pas activé.
30 mai 2006 13:20:57 :
Modification très grosse pour permettre à la classe de fonctionner sans DOMDocument. Rien ne change, mêmes méthodes, mêmes appels sauf pour l'instanciation qui se fait via : $menu = xmlmenu::getInstance (optionnel : version, optionnel : encoding);
05 juin 2006 12:01:18 :
Ajout d'une classe abstraite :-)Rien ne change à part ça, sauf qu'il faut faire un require_once sur la classe abstraite en plus de la classe d'usinage (voir index.php)/
05 juin 2006 12:03:06 :
Rajout d'une note explicative sur un bug que je viens de trouver.
06 juin 2006 12:43:31 :
Suppression du bug d'imbrication si la classe fonctionne sans DOM. Tout est parfait maintenant :-)

 Sources du même auteur

Source avec Zip ASTUCES/HACK PHP
SQUELETTE DE GESTION DES DROITS
[PHP 5.1] CLASS STRING : NOUVEL EXEMPLE SUR LA SPL
Source avec Zip Source avec une capture [PHP 5.1] PHOTOPHOP (PHPDRAW 2)
Source avec Zip Source avec une capture [PHP5.1] O-LOC : CLASSE ET BACKOFFICE D'INTERNATIONALISATION

 Sources de la même categorie

Source avec Zip JEU FRISE CHRONOLOGIQUE EN XML par mldvb
OBTENIR LES TAUX DE CHANGE DU JOUR EN EUROS par oallais
Source avec Zip AFFICHER LES FILM EN SALLE par slhuilli
Source avec Zip Source avec une capture MINI-PROCESSEUR XPROC (PIPELINE XML) par ordiman85
Source avec Zip Source avec une capture XML MAPPING TO CLASS OBJECTS / CHARGEMENT / PARSING / MODIFI... par aKheNathOn

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture VOIR QUI VISITE VOTRE SITE par Dariumis
Source avec Zip Source avec une capture FORMULAIRE DE CHOIX MULTI-CONTACT VALIDE XHTML 1.0 TRANSITIO... par aventurier19
Source avec Zip Source avec une capture [POO] MENU XHTML HORIZONTAL EXTENSIBLE (MENUEXTENSIBLEX.PHP) par Dariumis
Source avec Zip MOTEUR DE TEMPLATE XSL UTILISANT LA CLASSE XSLTPROCESSOR ET ... par codefalse
Source avec Zip [PHP5] LIMÉA XSLT TEMPLATE ENGINE par lumesh

Commentaires et avis

Commentaire de Teclis01 le 26/05/2006 19:06:49

et moi qui pensait le faire -_-'
ce dont vous revez, malalam vous l'apporte
(ca marche aussi avec la poste ^^)
Bon je testerais et j laisserais un tite note promis !

Commentaire de malalam le 26/05/2006 21:04:14 administrateur CS

Oki lol,mais je dois avouer que TU m'as donné l'idée. Pruve en est,le nom de la méthode principale : defineNode () ;-)

Ton bin's m'a fait penser que ce pourrait être bien une classe permettant de de générer des menus à parir de fichiers xml :-)

mais c'est loin d'être fini.

En attendant, bonne soirée :-) Moi, c'est ciné (XMen 3) et boîte ce soir :-)

Bisous

Commentaire de Teclis01 le 26/05/2006 23:09:21

Yop yop ^^
alors euh sauf erreur de ma part j obtient ceci ..
Fatal error: Class 'XSLTProcessor' not found in C:\wamp\www\classe\menu_xml\class\xmlmenu.cls.php on line 144
et en effet j ai pas trouver de class XSLTProcessor donc un oublie peut etre ou je sais pas snifff
En tout cas pour les resultats deja present dans la sources ils sont tres sympatoches ^^
Bravo a toi malalam!
Gros bisous grand fouuuu^^

Commentaire de malalam le 27/05/2006 08:38:48 administrateur CS

Bah vi j'ai précisé dans le descriptif que XSLTProcessor était nécessaire.
Ben c'est l'extension XSL, dans la doc, et l'objet s'appelle XSLTProcessor. Donc la dll xsl_php.dll je pense.

Commentaire de TheSin le 27/05/2006 09:26:06

pas mal du tout ce code :-)
il serait même intéressant de gérer si XSLT et DOM sont chargés, et si ils sont présents pour les charger au cas où, via le constructeur non ??
enfin, c'est une suggestion de légère amélioration ;-)
(ça peut servir je pense dans le genre de configuration de Teclis01 ;-))

Commentaire de malalam le 27/05/2006 09:39:35 administrateur CS

Ouais, y a plein de choses à gérer. C'est juste un départ, là :-) Je voulais juste montrer un exemple d'utilisation conjointe de PHP, XML et XSLT.
Mais je posterai ici les amélioratons, je pense.
Une gestion du XSLTProcessor est plus complexe, car cela veut dire qu'on ne peut pas utiliser cet objet et appliquer dynamiquement une XSL au flux XML. Il faut donc contourner (à vrai dire ce n'est pas très complexe : il suffit de créer le lien entre le flux et le xsl, directement dans le flux).
Mais ça perd de son intérêt ;-) C'est moins éducatif, quoi.

Il faut aussi gérer les erreurs (là, je n'ai implémenté aucune gestion des erreurs). Je ferai ça cette semaine.

Enfin, il FAUT de nouvelles XSL...! Parce que celles-là font pitié ;-)

Merci à vous deux en tous cas.

Commentaire de wizad le 27/05/2006 11:06:47

sympa comme idée... moi je cherche pour l'instant à faire un plugin de la class de template tynibutstrong pour pouvoir générer les block a partir d'un flux xml (pour faire des menu par exemple... ^^).

Commentaire de johann1 le 27/05/2006 11:13:13

Ouups ! Là je m'aperçois que j'ai encore plein de choses qui m'échappe! Très intéressant ton menu Malalam !

Commentaire de J_G le 27/05/2006 13:48:07

Salut malalam,

Ton code est élégant. C'est très didactique. Bravo!
Des p'tites remarques quand même (sinon c'est pas drôle)


Pourquoi ne pas utiliser :
$newElem = $this->doc->createElement('node', $sText);

Au lieu de :
$newElem = $this->doc->createElement( 'node' );
$sTexte = $this->doc->createTextNode( $sText );
$newElem->appendChild( $sTexte );



"Il faut donc contourner (à vrai dire ce n'est pas très complexe : il suffit de créer le lien entre le flux et le xsl, directement dans le flux)"
Tu pourrais m'expliquer ça STP... Car j'en ai marre de trouver des serveurs sans XSL...



$aTypes = scandir ('xsl');
foreach ($aTypes as $type) {
$this -> aTypes[] = strtoupper (substr ($type, 0,  -4));
}
strtoupper ... Attention à Linux où les noms de fichiers sont senssibles à la casse! D'ailleur, ton script m'a généré une erreur par accès au système de fichiers. La cause : Les noms de fichier (LISTE ou liste, TABLE ou table) ou les droits en écriture dans les répertoires. Ca fera certainement partie de ta gestion des erreurs ;)


Dans xmlmenu::defineAttributes
$elem -> setAttribute ($attrName, $attrValue);
Attention... Les documents DOM ne mangent que du UTF8 ! Je proposerai au minimum :
$elem -> setAttribute ($attrName, utf8_encode($attrValue) );


Continu bien... A+

Commentaire de Teclis01 le 27/05/2006 15:26:49

Ca fonctionne nikel ^^
par contre j ai un tit truc a te montrer ca te donnera une nouvelle interface possible et qui je pense est pas mal ^^

Commentaire de sjon le 27/05/2006 18:44:20

Encore une tres bonne sources provenant de Malalam ... Cela devient énervant ^^

Comment allez vous au fait ? ...

Commentaire de malalam le 28/05/2006 09:26:05 administrateur CS

Merci à tous :-)

Teclis => tu me montreras ça lundi : je pense effectivement ajouter à terme une interface user friendly.

Sjon => Très bien merci, et toi ?? Ca faisait un moment!

J_G =>
- "Pourquoi ne pas utiliser :
$newElem = $this->doc->createElement('node', $sText);"
Les premiers exemples que j'ai utilisé fonctionnaient, pour le côté pédagogique, avec ces 2 fonctions. Du coup, j'ai pris cette habitude inutile en effet...lol. Je corigerai.

- "Attention à Linux où les noms de fichiers sont senssibles à la casse"
Je sais j'y ai pensé ce we, il faut que je corrige ça. J'au tendance à préférer les chaînes en majuscules, pour ce qui est des définitions de paramètres. Mais ce n'est pas compatible dans ce cas là, effectivement...

- "Tu pourrais m'expliquer ça STP... Car j'en ai marre de trouver des serveurs sans XSL..."
Ca reste à tester, je ferai ça lundi. Mon idée est que les XSL agissent comme les CSS. On peut lier une XSL directement à un flux XML comme on le fait d'une CSS pour un document HTML.
Donc, en réécrivant le flux XML à la volée, en lui assignant la XSL désirée (<xml link... />), et en incluant le flux transformée dans le document XHTML de départ (la page web), ça devrait fonctionner.

Bon, bnon dimanche à tous, et à lundi :-)

Commentaire de malalam le 29/05/2006 14:21:48 administrateur CS

Bon!

J'ai effectué quelques modifications (soulevées, essentiellement, par J_G) :
- plus de problème de nom de fichier sous un environnement linux/unix. Et les appels à la classe n'ont pas été modifiés, on utilise toujours LISTE, TABLE, ou tout nom de fichier xsl créé, mis en majuscule.
- j'ai viré le createTextNode ().

- Et la plus grosse modif : XSLTProcessor n'est plus nécessaire (voir mes commentaires dans le descriptif, et/ou en anglais dans la classe xmlmenu).

Commentaire de J_G le 29/05/2006 19:19:00

Salut,

C'est bon ! Ca devient très bon même

Juste, pour la génération d'un nom de fichier XML temporaire (xmlmenu::toHtml()) je propose un

do{ $iCpt = uniqid(''); } while( file_exists('tmp_xml/tmp_xmllfile_'.$iCpt.'.xml') );

Et y'a toujours le strtoupper dans xmlmenu::__construct()

Commentaire de malalam le 30/05/2006 08:15:26 administrateur CS

Hello,

marci...je m'attaque aujourd'hui à se passer de DOMDocument...on verra ;-)
Uniqid, bonne idée, jamais utilisé ce truc, c'est l'occasion d'essayer!
Et oui, y a tjrs strtoupper, mais je stocke aussi ne nom du fichier "normal", lol...du coup, on appelle la méthode avec des majusciules, comme j'aime bien, et ça appelle le fichier correspondant, écrit normalement, lui ;-)

Commentaire de malalam le 30/05/2006 13:28:13 administrateur CS

Et voilà, nouvelle modif :
cette fois, ça fonctionne aussi sans DOMDocument.

J'ai modifié en profondeur...
On a une classe "d'usinage" xmlmenu qui se lance via getInstance, et qui va instancier l'une des 3 classes, selon les cas :
- on a DOMDocument et XSLTProcessor
- on a DOMDocument mais pas XSLTProcessor
- on a ni l'un ni l'autre.

Les méthodes ne changent pas.

Commentaire de FhX le 04/06/2006 22:03:08

Bon, j'ai regardé (enfin !) et y'a des ptits trucs (à la con :p) qui m'interpelle.

Tu as fait 3 classes quasiment identiques. Jusque la tout va bien. Mais pourquoi ne pas en avoir fait une classe abstraite pour mieux gérer l'extension futur de tes classes ? Genre :

abstract abs_xmlmenu {

protected $aTypes = array ();
protected $sHtml = '';
protected $sXml = '';

public function __construct($sVersion = null, $sEncoding = null) {

   $aTypes = scandir ('xsl');
foreach ($aTypes as $type) {
$this -> aTypes[$type] = strtoupper (substr ($type, 0,  -4));
}

}

abstract public function defineNode ($sText, $aAttr = array (), $iId=0);
abstract public function defineLink ($sLink, $iId);

// etc...

}

Et comme ca, tu récupères tout déja de pré-fait, surtout au niveau du constructeur dont je t'ai donné en exemple ! Tu peux faire tes classes par la suite comme ca :

class xmlmenuhasboth extends abs_xmlmenu {

public function __construct($sVersion = null, $sEncoding = null) {

// Ce que tu veux comme modif
// Puis :
parent::__construct($sVersion, $sEncoding);

}

Et zoup, comme ca tout est unifié et c'est plus pratique :)

Ca t'évite de devoir re-écrire par exemple les méthodes genre defineLink() quand t'as le DOM, ou si t'as pas le dom tu surcharges la méthode :)

Voila voila pour le moment :)

Commentaire de malalam le 05/06/2006 06:50:37 administrateur CS

T'as complètement raioson pour la classe abstraite. J'étais parti pour à vrai dire, et puis j'ai pas eu le temps, alors je me suis concentré sur faire marcher la source...lol. Et j'ai oublié...au final. Donc oui, je vais remettre de l'ordre là-dedans.
Merci :-) (à vrai dire, j'étais même parti sur une interface...avec).

Commentaire de FhX le 05/06/2006 13:05:30

"Ajout d'une classe abstraite :-)Rien ne change à part ça, sauf qu'il faut faire un require_once sur la classe abstraite en plus de la classe d'usinage (voir index.php)/"
Bouhh.... l'autoload(), ca marche aussi avec les classes abstraites :p

Alors, c'est pas mieux à coder un truc comme ca ? =)
Enfin moi, je trouve ca plus joli =)

Ah si, y'a une erreur :p :p
Dans ta classe abstraite, tu mets par defaut les méthodes si XLST est activé par défaut ! Surtout pas ! Tu va surcharger tes méthodes pour rien. Je pense surtout à toHtml() !
Tu aurais du écrire ca dans ta classe abstraite :

public function toHtml($sType) {
if (false === ( $type = array_search($sType, $this -> aTypes))) {
return false;
}
}

Et le reste dans tes classes spécialisées comme suit : (ex avec DOM et XLST)
public function toHtml($sType) {
parent::__construct($sType);
// Suite du code propre à chaque classe
}

Ca c'est mieux :) Comme tu fais un array_search() dans toutes tes classes filles, autant la définir dans la classe abstraite :)

Voila voila :p

Commentaire de malalam le 05/06/2006 13:50:45 administrateur CS

"Bouhh.... l'autoload(), ca marche aussi avec les classes abstraites :p"
=> l'autoload n'apprécie pas les tests dans la classe xmlmenu, détectant quelles classes sont activées. Pour XSLT notamment, si je le désactive, il cherche à le charger dans le répertoire class/ (je suppose que c'est le get_class () qui fait ça). C'est pour ça que je ne l'ai pas mis.

Pour toHtml, et les autres, en fait ouais, j'ai pris le parti de les surcharger uniquement pour XSLT vu que c'est la classe qui change le plus. En fait je voulais tester, faire un bench, pour voir si c'est plus rapide de ne surcharger que pour XSLT, etr de laisser les autres méthodes définies pour DOM chargé, ou de ne mettre vraiment dans ma classe abstraite que ce qu'il y a de commun, et de mettre la suite (le spécifique) dans le reste de la méthode, après appel à la méthode de la classe abstraite. Bref, j'avais peur que ça alourdisse, non pas le code, mais le travail de php.
Mais bon faut voir...

Commentaire de FhX le 05/06/2006 14:17:40

L'autoload marche très bien chez moi et j'avais fait une classe un peu dans le même style que toi. C'est parce que tu dois faire un parsing dans l'autoload pour que ca fonctionne, parce qu'habituellement ca marche très bien ! Bizarre...

Ouaip, sinon essaye de tester différentes méthodes pour voir laquelle est la plus rentable.
Moi j'en ai aucune idée et j'ai rien sur moi pour le savoir.

Commentaire de malalam le 05/06/2006 14:33:59 administrateur CS

nan, je parle de get_class (). Je pense que cette fonction essaye d'instancier la classe qu'on lui passe en paramètre. Si elle ne la trouve pas dans les classes de base, je suppose qu'elle se réfère alors (ou elle s'y réfère de toutes manières, ptête), à l'autoload(). Et l'autoload génère une erreur sur XSLTProcessor car il ne la trouve pas dans mon répertoire de classe. Je suppose. Faudrait que j'intercepte, je suppose, kje vais voir...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

probleme fatal error call undefined function [ par ad102 ] Bonjour Voila mon probleme : lorsque je fais l'appel d'une fonction dans mon programme celle-ci n'est pas reconnue alors que je pense&nbsp;l'avoir bie pb domxml [ par djcal007 ] salut, j'ai un probl&#232;me pour ajouter,gr&#226;ce &#224; domxml, de nouveaux noeuds : voila mon fichier xml: &lt;?xml version="1.0"?&gt; &lt;root& XML == MySQL ? [ par Teclis01 ] Bonjour, Je me suis lanc&#233; il y a peu dans la classe DOM XML mais il y a quelqques chose qui me parait vraiment etrange ...J'ai entendu dire et me Problème génération tableau après avoir parsé mon XML [ par Akita95 ] Bonjour à tous,Je sollicite votre aide car je suis dans une impasse et j'ai un problème :( Après avoir longtemps cherché, sur le net et sur ce site, j php/xml probleme affichage menu flash [ par 27 ] Salut,j'ai un probleme avec un document xml générer par du php.Voila, je génère un document xml qui est pointé par un menu en flash. Le probleme est q [DOM xml PHP5] entités html [ par the_mouette ] Bonjour tout le monde, Je suis en train de coder mon moteur de template (pas très original tout ca...) basé sur du XML. Jusque là ca marche. Seulemen [DOM] CDATA indésirable [ par the_mouette ] Bonjour, Je viens de changer de serveur (serveur dédié sous debian, paquets PHP 5.2.0 dotdeb), et depuis le générateur XML pose problème. Je crée ma p Dom XML [ par syndrael ] Bonjour Puis faire du DOM XML sous Linux ? Mon code sera-t-il 100% compatible avec celui de mon site ki tourne sous Windows ? Merci de me rassurer. S problème xml [ par JCpp ] Bonjour,Je suis novice en php, et je ne comprends pas encore tout.Je voudrais afficher "ok, je ne fait plus de bruit" quand $world = "silence" impossible de sauvegarder les données (php et XML) [ par vacknov ] Bonjour;J'ai le message d'erreur Fatal error: Call to a member function appendChild() on a non-object in C:\wamp\www\newsxml.php on line 30lorsque Je


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,733 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales