begin process at 2010 03 16 11:21:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Menu & Co

 > TREEVIEW TAFELTREE

TREEVIEW TAFELTREE


 Information sur la source

Note :
9,62 / 10 - par 21 personnes
9,62 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Menu & Co Classé sous :arbre, treeview, ajax, tree, menu Niveau :Initié Date de création :21/08/2006 Date de mise à jour :20/01/2007 01:01:35 Vu / téléchargé :31 208 / 3 570

Auteur : rekam

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

 Description

Cliquez pour voir la capture en taille normale
Après moult recherches sur le web, je n'ai pas trouvé de treeview opensource et gratuit pouvant faire tout ce dont j'avais envie. J'ai donc développé ce petit arbre bien sympa, avec une bonne grosse poignée d'options diverses et variées, comme le drag&drop, les checkbox, les événements, etc.

Il est basé sur la librairie de Script Aculous (http://script.aculo.us). C'est une superbe librairie JS avec moults effets, drag&drop et j'en passe.

Voici une petite liste non-exhaustive des possibilités (pour tout voir, il vaut mieux aller sur le site : http://tafel.developpez.com/

- gestion complète du clavier (ctrl+x et compagnie, navigation, etc)
- RTL mode (affichage de droite à gauche)
- création de l'arbre avec JSON ou avec des simples UL - LI
- plusieurs arbres sur la même page
- drag&drop (dans l'arbre ou entre plusieurs arbres)
- checkboxes (à 2 ou 3 états)
- édition du texte
- ouverture d'une seule branche à la fois
- possibilité de mettre ses propres paramètres pour les branches
- gestion des événements (onclick, ondblclick, onmouseover, onmouseout, onload, onedit, et j'en passe)
- drag&drop ajax (voir la doc pour plus d'info)
- copy-drag
- insertion de branches où on veut dans l'arbre avec insertBefore(), insertAfter(), insertIntoFirst() et insertIntoLast()
- multi-ligne
- branche "HTMLisable" à souhait
- et encore bien d'autres choses

Pour voir toute la doc, allez faire un tour sur le site :

http://tafel.developpez.com/

Source

  • <script type="text/javascript">
  • // Cette fonction est automatiquement appelée au chargement de la page
  • function TafelTreeInit() {
  • // L'item dont l'id vaut "specialOpen" n'a pas d'enfants. Au moment de cliquer dessus,
  • // c'est le serveur qui donnera les informations concernant les enfants
  • var struct = [
  • {
  • 'id':'root1',
  • 'txt':'Element racine',
  • 'img':'page.gif', // Image s'il n'a pas d'enfants
  • 'imgopen':'folderopen.gif', // Image s'il a des enfants et qu'il est ouvert
  • 'imgclose':'folder.gif', // Image s'il a des enfants et qu'il est fermé
  • 'items':[
  • {
  • 'id':'child1',
  • 'txt':'Un enfant',
  • 'img':'page.gif',
  • 'tooltip':'Un petit tooltip sympa',
  • },
  • {
  • 'id':'specialOpen',
  • 'txt':'Les enfants sont sur le serveur',
  • 'img':'page.gif',
  • 'imgopen':'folderopen.gif',
  • 'imgclose':'folder.gif',
  • 'canhavechildren':true,
  • 'onopenpopulate':function(branch, response){ return true;},
  • 'openlink':'scripts/open.php'
  • }
  • ]
  • }
  • ];
  • var tree = new TafelTree('test2', struct, {
  • 'generate' : true,
  • 'imgBase' : 'tree/imgs/',
  • 'width' : '100%',
  • 'height' : 'auto',
  • 'defaultImg' : 'page.gif',
  • 'defaultImgOpen' : 'folderopen.gif',
  • 'defaultImgClose' : 'folder.gif'
  • });
  • }
  • </script>
  • <div id="test2"></div>
<script type="text/javascript">
	// Cette fonction est automatiquement appelée au chargement de la page
	function TafelTreeInit() {
		// L'item dont l'id vaut "specialOpen" n'a pas d'enfants. Au moment de cliquer dessus,
		// c'est le serveur qui donnera les informations concernant les enfants
		var struct = [
		{
			'id':'root1',
			'txt':'Element racine',
			'img':'page.gif', // Image s'il n'a pas d'enfants
			'imgopen':'folderopen.gif', // Image s'il a des enfants et qu'il est ouvert
			'imgclose':'folder.gif', // Image s'il a des enfants et qu'il est fermé
			'items':[
				{
				'id':'child1',
				'txt':'Un enfant',
				'img':'page.gif',
				'tooltip':'Un petit tooltip sympa',
				},
				{
				'id':'specialOpen',
				'txt':'Les enfants sont sur le serveur',
				'img':'page.gif',
				'imgopen':'folderopen.gif',
				'imgclose':'folder.gif',
				'canhavechildren':true,
				'onopenpopulate':function(branch, response){ return true;},
				'openlink':'scripts/open.php'
				}
			]
			}
		];
		var tree = new TafelTree('test2', struct, {
			'generate' : true,
			'imgBase' : 'tree/imgs/',
			'width' : '100%',
			'height' : 'auto',
			'defaultImg' : 'page.gif',
			'defaultImgOpen' : 'folderopen.gif',
			'defaultImgClose' : 'folder.gif'
		});
	}
</script>
<div id="test2"></div>

 Conclusion

A disposition, il y a de la documentation en français et en anglais. Le site comporte également des exemples et un forum, pour celles et ceusses qui auraient des questions.

L'arbre est compatible IE, firefox (pc, mac, linux), Safari, Opera et Konqueror.

Pour plus de doc, allez voir l'adresse :
http://tafel.developpez.com/

 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

21 août 2006 13:43:50 :
J'ai oublié de spécifier que, bien entendu, l'arbre est compatible IE, firefox (pc, mac, linux), Safari.
21 août 2006 13:52:38 :
Il est compatible Opera, aussi, j'ai oublié de le dire
22 août 2006 10:07:43 :
Précision des sources. Et c'est compatible Konqueror !
26 août 2006 17:59:06 :
Ajout de la fonctionnalité "last" et y'avait un bug avec Toncheck et Tonbeforecheck lors de la création ul-li
28 août 2006 14:38:07 :
Corrections de bugs, ajout de quelques tests unitaires
30 août 2006 09:23:20 :
Ajout de la fonctionnalité " onopenpopulate " et de ses dérivés (setOnOpenPopulate, openlink et canhavechildren)
31 août 2006 14:12:19 :
Ajout des méthodes monTree.serialize() et maBranche.serialize() qui retourne une string JSON parsable ensuite en PHP, par exemple. Correction d'un bug concernant les icônes des racines
01 septembre 2006 14:08:54 :
Ajout de la fonctionnalité " tooltip ". De plus, j'ai rajouté branch.getText(), getIcon(), getOpenIcon(), getCloseIcon(), getCurrentIcon, setIcons(), setText() et getChildren()
01 septembre 2006 17:31:20 :
Corrections de bugs
08 septembre 2006 11:53:52 :
Ajout de plusieurs fonctions (getLevel(), removeChildren(), changeId(), setOnEditAjax(), etc.) Corrections de bugs (cookies)
25 septembre 2006 11:33:21 :
On peut maintenant faire des drag&drop "as sibling", ajout de la fonction moveBefore() et gestion du paramètre "option" dans le constructeur
23 octobre 2006 13:19:03 :
Gestion du clavier, copydrag, gestion d'erreurs ajax, corrections de bugs
27 novembre 2006 10:23:32 :
Mise à jour du site, documentation en anglais, corrections de bug. http://tafel.developpez.com/
11 décembre 2006 10:34:09 :
RTL mode, onmousedown et up, images transparentes
03 janvier 2007 09:40:30 :
fonctions getParent(), getParents(), getAncestor(), isVisible() et corrections de bugs
20 janvier 2007 01:01:36 :
Corrections de bug, désactivation de checkboxes, switchWith() et replace(), modif de clone(), optimisation de getBranchById()

 Sources du même auteur

Source avec Zip Source avec une capture AUTRE MAP RPG AVEC UNE APPROCHE DIFFÉRENTE

 Sources de la même categorie

Source avec Zip Source avec une capture MENU VERTICALE GAUCHE ET DROIT DEROULANT par kazma
Source avec Zip Source avec une capture MENU VERTICALE EN TRANSPARENCE par dlvains
Source avec Zip Source avec une capture MENU DÉROULANT EN IMAGES par dlvains
Source avec Zip TBFRAME: TAB BROWSING FRAME par triumphs
Source avec Zip Source avec une capture MENU PRINCIPAL par ali1987

 Sources en rapport avec celle ci

Source avec Zip PLUGIN JQUERY ARTE: AJOUTER DU TEMPS REEL SUR VOS PAGES WEB par arthurobriot
Source avec Zip Source avec une capture MENU DÉROULANT EN IMAGES par dlvains
Source avec Zip Source avec une capture MOTEUR DE RECHERCHE SANS PHP par jdmcreator
Source avec Zip MENU CONTEXTUEL GRÂCE AU CLICK DROIT DE LA SOURIS AVEC DES M... par OB1_12
Source avec Zip Source avec une capture FICHIER XP par hadrien01

Commentaires et avis

Commentaire de Kimjoa le 27/08/2006 03:44:24

Ouaou c tros cool ton arbre c pile poil ce qui me fallait, en plus moi qui suit debutant en javascript tu y explique tout les détaille pour l'installer correctement.je te mais 10/10 meme si je comprend rien au code , c vraiment tros beau mieux que windows!! merci!

Commentaire de iubito le 28/08/2006 06:39:35

Excellent ! (je ne vois pas quoi dire d'autre !)

et je confirme que ça marche avec Opera 9.01 (Windows) !

Commentaire de rekam le 28/08/2006 10:13:51

Yop!
Merci bien pour ces commentaires. Si jamais vous avez des idées de comportements à ajouter, n'hésitez pas. Là, je planche sur un multi-drag&drop, mais c'est pas évident. Je vais peut-être ajouter d'autres choses entre-temps ;)

Bref, merci et a+
rekam

Commentaire de vduffaut le 28/08/2006 10:26:50

Très propre ! Bravo pour ce code qui me donne d'organisation des idées pour mon site. J'ai mis 10. En revanche sur le site Web cité, le ZIP est invalide alors que l'explication est bien faite.

Bonne continuation.

Commentaire de rekam le 28/08/2006 11:13:58

Salut! Qu'entends-tu par invalide ? J'arrive à le télécharger et le Tree.js qui est dedans fonctionne aussi. Ce qui est possible, c'est que tu aies tenté de télécharger le ZIP juste au moment où je mettais à jour (vers 10h15, par là).

Commentaire de vduffaut le 28/08/2006 11:56:13

Effectiement le ZIP est correct. Sans doute le problème d'heure est le bon.
Merci

Commentaire de jmecodol le 28/08/2006 17:14:51


salut,
c'est étonnant tout ce qu'on ( que tu )
peut faire avec javascript .

je me demandais un truc quand même,
le nouveau TreeView ( modifié par le client ),
est ce qu'il est possible de le récupérer
après l'avoir édité :

par exemple avec un bouton "envoyer" .
et on récupèrerai dans une classe php par exemple .

en tout cas c'est SUPER !!!

je me souviens quand j'était en 1ère année de fac (Ya 4 ans),
le javascript faisait pas 1/10ème de ce qu'on trouve aujourd'hui .

aller a ciao,
bonne continuation .

Commentaire de rekam le 28/08/2006 18:02:30

Hello, la sérialisation est possible. Elle existe déjà plus ou moins (méthode toString). Cependant, ce que tu dis là est complètement envisageable, moyennant un peu de prog. Je vais m'y atteler bientôt, mais je vais d'abords terminer une fonctionnalité très utile que je suis entrain de développer. Je vous tiens tous au courant! A+

Commentaire de rekam le 30/08/2006 09:26:53

Voilà voilà !

J'ai rajouté une fonction bien utile, qui est " monTree.setOnOpenPopulate(func, link) " et qui sert à loader les enfants lorsqu'on ouvre la branche. En gros, c'est simple, il suffit de dire que la branche peut avoir des enfants avec la propriété " canhavechildren ", et ensuite spécifier la méthode javascript et le lien vers la page serveur. Et le tour est joué !

Pour des infos plus détaillées, comme d'hab, c'est sur le site :

http://membres.lycos.fr/tafelmak/arbre.php

Commentaire de iubito le 30/08/2006 09:42:54

C'est une bonne idée ça !

Bon je garde ce code sous le coude, ça me servira sûrement pour le boulot ;) mais pas pour tout de suite.

Commentaire de testtree le 31/08/2006 00:40:53

Bonjour,
très beau travail !

Est-il possible de faire du drag & drap entre 2 arbres différents ? Si oui comment mettre ça en place ?

Merci !

Commentaire de rekam le 31/08/2006 09:21:25

Salut,

oui, c'est possible ! Il y a un problème d'affichage. L'élément draggé est caché lorsqu'on sort du DIV. C'est évitable en mettant overflow: visible dans tafel.css.

Sinon, c'est la méthode bind() qui permet de faire ça :

var t1 = new TafelTree('div1', struct1);
var t2 = new TafelTree('div2', struct2);

t1.bind(t2);

Et voilà, ensuite le drag&drop devient possible entre les deux arbres.

a+!

Commentaire de rekam le 31/08/2006 09:22:58

oups, c'est pas tafel.css, mais tree.css, mais vous l'aurez remarqué, bien évidemment ;)

Commentaire de rekam le 31/08/2006 14:15:15

ET VOILA, cher (ou chère...) jmecodol, on peut dorénavent obtenir la structure courante de l'arbre en appelant la méthode " serialize() " (applicable autant à l'arbre tout entier qu'à une branche en particulier).

Cette string est la représentation JSON de la structure, donc par exemple, s'il y a juste une racine avec une branche, on aura :

[{'id':'root','txt':'Root','items':[{'id':'branche','txt':'Branche'}]}]

A+!

Commentaire de jmecodol le 31/08/2006 14:34:34

super,

c'est une structure hyper utile,
bravo aux deV et génial cS .

Commentaire de rekam le 01/09/2006 14:10:30

Et encore des nouveautés, pour les interessés :

Ajout de la fonctionnalité " tooltip ". De plus, j'ai rajouté branch.getText(), getIcon(), getOpenIcon(), getCloseIcon(), getCurrentIcon, setIcons(), setText() et getChildren().

Pour les tooltip, c'est très simple : lorsqu'on paramètre la branche, on fait "tooltip" : "Mon toolTip" et voilà !

au plaisir

Commentaire de rekam le 01/09/2006 17:41:44

Et si jamais, j'ai mis dans le zip le script de l'arbre légèrement optimisé. C'est à dire qu'il n'y a plus de commentaires ni de retours de ligne. J'ai fait ça en utilisant un petit objet que j'ai fait en PHP, disponible dans _notes/epure.php (dans le zip).

enjoy!
rekam

Commentaire de voisinpi le 01/09/2006 20:58:50

Très bon boulot ! Ça tombe à pic, je cherchais justement un composant de ce type, efficace et complet, et je venais de découvrir prototype et aculous en me disant que j'allais essayer de le mettre en oeuvre... :)

Merci beaucoup !

Commentaire de grodolphe le 07/09/2006 17:41:56

classe! Bien joué et merci!

Commentaire de chalutvous le 21/09/2006 14:16:19

Cet outil à tout pour plaire !!!
Mais il lui manque encore une chose, je trouve : pouvoir drag'n dropper les items pour les ordonner entre eux (car jusque là le drag'n drop se fait pour entrer ou sortir un noeud dans un un autre noeud).

Voilà ma petite contribution ergonomique.

Merci et Bravo !!!

Commentaire de rekam le 22/09/2006 10:51:27

Hello,

la prochaine mise à jour aura un "drag&drop" pour les ordonner entre eux (en maintenant ALT appuyé lors du drop...)

Je vais tâcher de mettre tout ça en ligne ce we, si j'arrive à capter internet chez moi....

a+

Commentaire de FREMYCOMPANY le 22/09/2006 19:38:18

Salut,

Le travail est tout simplement magnifique, quoique légèrement trop complexe... il serait intéressant d'avoir une version light ;)

je trouverais aussi intéressant d'ajouter un service "session"...
En soit ca parait rébarbatif et pas facile à faire, mais le principe est simple : - dsl pour les notations, je part d'un code perso JS made in FremyCompany ;) -

function Tree(args) {
   var This=this;
   // ...
   this.name=name;
   this.saveOnExit=saveOnExit;
   window.OnUnLoad.addHandler(function() {
      if (This.saveOnExit && This.name) {
          document.cookie=escape(This.name)+"="+escape(This.getHTML())
      }
   })
   // ...
}

Tree.LoadFromSession(name) {
   var This=new Tree(args)
   try {
       This.parseHTML(getCookieValue(name));
   } finanlly {
       return This;
   }
}

Tree.prototype.parseHTML=function(HTML) {
   var divContent=document.createElement("div");
   divContent.innerHTML=HTML;
   //
   // L'étape la plus complexe à mettre en oeuvre
   // Analyse du contenu
   //
}

// Utilisation : page1
var t=new Tree(args, /*name*/"Tree1", /*saveOnExit*/ true);

// Utilisation : page2
var t=Tree.LoadFromSession("Tree1")

Commentaire de rekam le 23/09/2006 22:21:47

Salut,
l'utilisation des cookies existe déjà. Enfait, à chaque fois que tu ouvres ou fermes une branche, ça sauve l'état dans un cookie. Ensuite, dans que le cookie est actif, l'état de l'arbre persiste (donc après une fermeture de l'arbre également). Mais effectivement, ça ne persiste pas pendant des jours. En tous les cas, tu peux recharger la page (ou la fermer, pour autant que je sache) et t'auras toujours le dernier état de l'arbre.

Est-ce bien là où tu voulais en venir ? a+

Commentaire de FREMYCOMPANY le 24/09/2006 19:48:03

En effet, je n'avais pas vu que tu avais prévu cette option aussi...

Dans ce cas, je n'ai rien dit ;)

Commentaire de rekam le 25/09/2006 15:41:34

Voilà, j'ai mis une nouvelle release en ligne (toujours plus d'infos sur http://membres.lycos.fr/tafelmak/arbre.php)

Maintenant, on peut faire du "drop as sibling" en maintenant ALT appuyé pendant le drop. Il y a aussi un système d'options rajouté au constructeur. Exemple :

#         var tree = new TafelTree('test2', struct, 'tree/imgs/', '100%', 'auto', {
#             'generate' : true,
#             'defaultImg' : 'page.gif',
#             'defaultImgOpen' : 'folderopen.gif',
#             'defaultImgClose' : 'folder.gif'
#         });

En fait, toutes les fonctions à faire avant le generate() peuvent maintenant s'écrire comme ci-dessus (toujours plus d'infos sur mon site).

a+
rekam

Commentaire de darhackiem le 02/10/2006 16:55:34

Bonjour !
Super boulot, y'a pas à dire !

Dans le cas d'un drag'n drop, est-il (ou sera-t-il) de fonctionner en mode clône ? c'est à dire qu'il n'y ait pas un déplacement, mais plutôt une copie de l'élément ?

Commentaire de rekam le 02/10/2006 17:17:32

Salut et merci,

oui c'est prévu. Le drag-clone, le multi-drag, le scroll-drag. Tout ça est prévu. La copie viendra plus vite que les autres, soit dit en passant :P

a+
rekam

Commentaire de digit_al le 06/10/2006 22:33:48

Salut Rekam,

Bravo pour ce travail, je vais de ce pas essayer de mettre ton code oeuvre.
Si tu cherches un espace d'hebergement de meilleure qualite que lycos, contacte-moi.

Merci pour ta contribution.

PS: j'attend le drag&copy avec impatience (de preference avec un modificateur comme la touche Ctrl)

Commentaire de rekam le 23/10/2006 13:21:13

Et voilà, la version 1.6 est sortie ! Au menu, la gestion du clavier (modifiable et extensible à souhait), la gestion des erreurs ajax et la possibilité de faire du copy-drag&drop.

a+!
rekam

Commentaire de denolfj le 24/11/2006 16:27:00

Magnifique , joli et stable !! Et en plus il y a de la doc !!!

Bravo !!

Nous avons développer un framework AJAX basé sur prototype.js : http://sourceforge.net/projects/salto-framework/

Je pense intégrer ta treeview si tu n'y vois pas d'inconvénient ;-)

Sinon, question subsidiaire, as-tu une doc en Anglais ?

Jerome

Commentaire de rekam le 27/11/2006 10:26:02

Bonjour !

Alors voilà, nouvelle mouture de site, et surtout : doc en anglais ! (mais pourquoi "surtout"...?) Enfin bref, plein de monde me demandaient une doc en anglais. Ainsi fut dzi, ainsi fut fait.

Mais rassurez-vous, la doc en français existe toujours et existera toujours!  Vive Molière! A+

Commentaire de rekam le 27/11/2006 10:31:01

Oui, j'ai oublié de dire que l'adresse du site a changé. Maintenant c'est :

http://tafel.developpez.com/

Commentaire de rekam le 11/12/2006 10:37:38

Et hop, une petite MAJ. Y'avait des images qui n'étaient pas transparentes (pas cool). Donc maintenant c'est fait.

J'ai également intégré un mode RTL (droite à gauche), histoire que l'arbre s'affiche à droite plutôt qu'à gauche.

a+
rekam

Commentaire de Abalam2 le 28/12/2006 15:41:28

Comme ajouté sur le forum de smarty ici :
http://www.phpinsider.com/smarty-forum/viewtopic.php?p=37934#37934

Voici le code source de mon plug in smarty pour tafelTree :

<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/


/**
* Smarty {tafelTree} function plugin
*
* Type:     function
* Name:     tafelTree
* Purpose:  make a tafelTree from PHP array structure
* Version:     0.1
* @link http://tafel.developpez.com/
* @author Yann-Gaël GAUTHERON <abalam -at- aewd -dot- net>
* Example:

       Note that values are javascript code or strings, if it's strings you must add a JS quote inside de PHP quote like
      $struct = array(
         array(
            "id" => "'root0'"
            ,"txt" => "'root 0'"
         )
         ,array(
            'id' => "'root1'"
            ,'txt' => "'TafelTree JS'"
            ,'img' => "'base.gif'"
            ,'items' => array(
               array(
                  'id' => "'child1'"
                  ,'txt' => "'L\'objet en question'"
                  ,'items' => array(
                     array(
                        'id' => "'child2'"
                        ,'txt' => "'<span>Ses méthodes</span>'"
                     )
                     ,array(
                        'id' => "'3'"
                        ,'txt' => "'Ses propriétés'"
                     )
                     ,array(
                        'id' => "'child4'"
                        ,'txt' => "'Ses functions utilisateur (genre onclick)'"
                        ,'onclick' => 'function(branch){alert("le texte de ce noeud est le suivant  =>  \n" + branch.struct.txt);}'
                        ,'items'  =>  array(
                           array(
                              'id'  =>  "'blu'"
                              ,'txt'  =>  "'hop'"
                              ,'check' => 1
                              ,'tooltip'  =>  "'Mon joli tooltip'"
                           )
                        )
                     )
                  )
               )
            )
         )
      );

* @param array
* @param Smarty
* @return string
*/
function smarty_function_tafelTree($params, &$smarty)
{
   /* Initialize */
   $attributes = array(
      'generate'=>"true",
      'imgBase' => "'js/tafelTree/imgs/'",
      'openAtLoad'=>"true",
      'cookies'=>"true",
      'multiline'=>"true",
      'defaultImg'=>"'page.gif'",
      'defaultImgSelected'=>"'globe.gif'",
      'defaultImgOpen'=>"'folderopen.gif'",
      'defaultImgClose'=>"'folder.gif'",
      'defaultImgCloseSelected'=>"'unlock.gif'",
      'defaultImgOpenSelected'=>"'imgfolder.gif'",
      'rtlMode'=>"false",
      'dropALT'=>"false",
      'checkboxesThreeState'=>"true",
      'behaviourDrop'=>"'sibling'",
   );

    foreach ($params as $_key=>$_value) {
        switch ($_key) {            
            case 'struct':
         case 'id':
            $$_key = $_value;
                break;
            
         case 'generate':
         case 'imgBase':
         case 'openAtLoad':
         case 'cookies':
         case 'ondrop':
         case 'multiline':
         case 'defaultImg':
         case 'defaultImgSelected':
         case 'defaultImgOpen':
         case 'defaultImgClose':
         case 'defaultImgCloseSelected':
         case 'defaultImgOpenSelected':
         case 'rtlMode':
         case 'dropALT':
         case 'checkboxesThreeState':
         case 'behaviourDrop':
         case 'onclick':
            $attributes[$_key] = (string)$_value;
                break;
            
            default:
                $smarty->trigger_error("[tafelTree] parametre inconnu $_key", E_USER_WARNING);
        }
    }

    if (empty($id) || empty($struct)) {
        $smarty->trigger_error("[tafelTree] attribut 'id' et 'struct' requis");
        return false;
    }

   $html .= '<div id="'.$id.'"></div>';
   $html .= '<script type="text/javascript">/*<![CDATA[*/';
  
   function to_json($array) {
      foreach ($array as $k => $i) {
         if (is_array($i)) {
            $i = to_json($i);
         }
         if ($array[0]) { /* Index numériques */
            $data[] = $i;
         } else { /* Index associatifs */
            $data[] = "'".$k."':".$i;
         }
      }
      $s = implode(",",$data);
      if ($array[0]) { /* Index numériques */
         return "[".$s."]";
      } else { /* Index associatifs */
         return "{".$s."}";
      }
   }

   $html .= 'new TafelTree("'.$id.'", '.to_json($struct).', '.to_json($attributes).");";  
   $html .= '/*]]>*/</script>';
  
   return $html;
}
?>

Commentaire de rekam le 03/01/2007 10:34:24

Et voilà, encore une petite mise à jour, avec plein de trucs chouette (allez sur le site, ça sera plus clair)!

et si jamais, y'a un forum sur le site pour les éventuels (et bien évidemment rares) problèmes.

a+!
rekam

Commentaire de rekam le 20/01/2007 01:05:21

Et hop, encore une mise à jour! Avec pas mal d'optimisation et surtout l'ajout de switchWith() et replace() pour les branches

Commentaire de Gwinyam le 23/04/2007 15:04:23

Salut,

Sincèrement, c'est un très bon script, il répond justement à un problème que je me posais pour un projet que je développe.

Contrairement aux autres commentaires, j'ai quelques remarques "négatives" sur ce script:
- Pourquoi ne pas avoir mis le drag&cibling de façon naturelle puis le drag&drop avec l'aide la touche ALT?
- bug: quand tu prends une branche que tu la mets au dessus de la branche principale avec la touche alt appuyée, automatiquement elle sort et là c'est fini elle est bloquée, j'ai essayé avec toutes les branches, après le menu est totalement bloqué, c'est pas cool...

Pour le drag&cibling, j'ai peut-être raté un truc dans la configuration, donc n'hésitez pas à me dire comme inverser ;)

Dans tous les cas merci pour ce superbe treeview de très haute qualité :)

Commentaire de rekam le 23/04/2007 23:35:05

Tout à fait juste lorsqu'on drop une branche en position de root, elle se coïnce, car pour l'instant, je rencontre des problèmes de redrag&drop sur ce niveau...

Sinon, effectivement, j'ai fait bizarrement le "par défaut". Dans la prochaine version, ça va tout changer (je rassure les utilisateurs, il n'y aura pas de problèmes de compatibilité)

a+
rekam

Commentaire de Gwinyam le 24/04/2007 22:29:10

Ok, bah merci pour cette réponse aussi prompte et bravo encore pour l'efficacité de ce script, même si j'ai eu du mal avec mes traitements php à l'intégrer correctement, mais cela me concerne et non le développeur de l'arbre originel ;)

Commentaire de Gwinyam le 24/04/2007 23:14:22

En fait j'ai un problème par contre avec la serialisation, je n'arrive pas à l'effecteur tout simplement...

Je me mets mon bout de code en espérant que vous y verrez la solution:
<script type="text/javascript">
// Structure de base représentant une racine avec deux sous-branches
var struct=[
{
'id' : 'tete',
'txt' : 'Site',
'check' : 0,
'items' : [
{
'id' : '1',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Accueil</td></tr></table>',
'check' : 0

},{
'id' : '2',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Partenariat</td></tr></table>',
'check' : 0

},{
'id' : '3',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>News</td></tr></table>',
'check' : 0
,'items' : [
{
'id' : '4',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Mon article 2</td></tr></table>',
'check' : 0
,'items' : [
{
'id' : '5',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Détail article 2 A</td></tr></table>',
'check' : 0
,'items' : [
{
'id' : '6',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Sous détail</td></tr></table>',
'check' : 0
}]},{
'id' : '7',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Détail article 2 B</td></tr></table>',
'check' : 0
}]},{
'id' : '8',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Mon article 1</td></tr></table>',
'check' : 0
}]},{
'id' : '9',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Références</td></tr></table>',
'check' : 0
,'items' : [
{
'id' : '10',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Sites internet</td></tr></table>',
'check' : 0

},{
'id' : '11',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Logiciels</td></tr></table>',
'check' : 0
}]},{
'id' : '12',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Contact1</td></tr></table>',
'check' : 0

},{
'id' : '13',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Contact2</td></tr></table>',
'check' : 0

},{
'id' : '14',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><td><a href="test.php"><img src="imgs/lock.gif" border="0" alt="D&eacute;sctiver"></a></td><td>Evenements</td></tr></table>',
'check' : 0

} ]
}
];


// On déclare le tree à l'extérieur de la fonction. Ainsi, il sera accessible de manière globale.
var tree = null;
// Function de drop
function funcDrop1 (move, drop, finished)
{
if (!finished)
{
return true;
}
}
function funcDrop3 (move, drop, response, finished)
{
if (!finished)
{
var obj = eval(response);
}
return true;
}
// Initialisation de l'arbre. Cette fonction est appelée automatiquement à la fin du load de la page.
function TafelTreeInit ()
{
tree = new TafelTree('myTree', struct, {
'generate' : true,
'imgBase' : 'imgs/',
'defaultImg' : 'page.gif',
'defaultImgOpen' : 'folderopen.gif',
'defaultImgClose' : 'folder.gif',
'behaviourDrop' : 'cibling',
'dropALT' : true,
'dropCTRL' : true,
'checkboxes' : true,
'onDrop' : funcDrop1,
'showSelectedBranch' : false,
'cookies' : false,
'openAtLoad' : true,
'onDropAjax' : [funcDrop3, 'op/op.vide.php']
});
}

var div = document.getElementById('container');

var handleSuccess = function(o)
{
if(o.responseText !== undefined)
{
alert("Sauvegarde Réussie\n"+o.responseText);
}
};

var handleFailure = function(o)
{
if(o.responseText !== undefined)
{
div.innerHTML = "<li>Transaction id: " + o.tId + "</li>";
div.innerHTML += "<li>HTTP status: " + o.status + "</li>";
div.innerHTML += "<li>Status code message: " + o.statusText + "</li>";
}
};

var callback =
{
  success:handleSuccess,
  failure:handleFailure,
  argument:['foo','bar']
};

var sUrl = "op/op.ordre.enreg.php";
var branch = tree.getBranchById("tete");
var postData = "arbre="+branch.serialize(true);

function makeRequest(){
var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
}
</script>
<div id="myTree" style="position: absolute; top: 120px;"></div>

Et il me retourne:
'tree' a la valeur Null ou n'est pas un objet.
Pour la ligne:
var branch = tree.getBranchById("tete");

J'avoue que je suis un peu embêté...si jamais vous trouvez, merci d'avance

Commentaire de rekam le 25/04/2007 08:50:08

re,

c'est normal, à ce moment l'arbre n'est pas encore créé. La fonction TafelTreeInit() est appelée lorsque la page à fini de loader (onload event). Or ton "var branch = tree.getBranchById("tete");" est situé dans le flux normal de l'exécution du script :

function TafelTreeInit() {
tree = new TafelTree(...);
...
}
var branch = tree.getBranchById("tete");

Autrement dit, ce n'est pas parce que le "var branch=" est sous la fonction qu'il sera exécuté après.

Pour que ça marche, soit tu mets ça sous la création de l'arbre, mais toujours dans la fonction TafelTreeInit(), soit tu fais, par exemple, un onclick où tu exécutes ton "var branch=", comme ça, tu peux attendre patiemment le chargement de la page avant de le lancer.

a+
rekam

Commentaire de Gwinyam le 25/04/2007 09:47:48

Euh...ça marche pas pour autant en fait...

Je te mets mon nouveau code:
<script type="text/javascript">
// Structure de base représentant une racine avec deux sous-branches
var struct=[
{
'id' : 'tete',
'txt' : 'Site',
'items' : [
{
'id' : '1',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(9); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Accueil</td></tr></table>'

},{
'id' : '2',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(10); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Partenariat</td></tr></table>'

},{
'id' : '3',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(11); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>News</td></tr></table>'
,'items' : [
{
'id' : '4',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(13); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Mon article 2</td></tr></table>'
,'items' : [
{
'id' : '5',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(17); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Détail article 2 A</td></tr></table>'
,'items' : [
{
'id' : '6',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(18); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Sous détail</td></tr></table>'
}]},{
'id' : '7',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(19); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Détail article 2 B</td></tr></table>'
}]},{
'id' : '8',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(12); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Mon article 1</td></tr></table>'
}]},{
'id' : '9',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(14); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Références</td></tr></table>'
,'items' : [
{
'id' : '10',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(15); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Sites internet</td></tr></table>'

},{
'id' : '11',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(16); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Logiciels</td></tr></table>'
}]},{
'id' : '12',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(20); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Contact1</td></tr></table>'

},{
'id' : '13',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(21); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Contact2</td></tr></table>'

},{
'id' : '14',
'txt' : '<table border="0" cellpadding="0" cellspacing="0"><tr><form action="" method="" onsubmit="desactiver(22); return false;"><td><input type="image" src="imgs/lock.gif" /></td></form><td>Evenements</td></tr></table>'

} ]
}
];


// On déclare le tree à l'extérieur de la fonction. Ainsi, il sera accessible de manière globale.
var tree = null;
// Function de drop
function funcDrop1 (move, drop, finished)
{
if (!finished)
{
return true;
}
}
function funcDrop3 (move, drop, response, finished)
{
if (!finished)
{
var obj = eval(response);
}
return true;
}
// Initialisation de l'arbre. Cette fonction est appelée automatiquement à la fin du load de la page.
function TafelTreeInit ()
{
var tree = new TafelTree('myTree', struct, {
'generate' : true,
'imgBase' : 'imgs/',
'defaultImg' : 'page.gif',
'defaultImgOpen' : 'folderopen.gif',
'defaultImgClose' : 'folder.gif',
'behaviourDrop' : 'cibling',
'dropALT' : true,
'dropCTRL' : true,
'onDrop' : funcDrop1,
'showSelectedBranch' : false,
'cookies' : false,
'openAtLoad' : true,
'onDropAjax' : [funcDrop3, 'op/op.vide.php']
});
}

var handleSuccess = function(o)
{
if(o.responseText !== undefined)
{
alert(o.responseText);
}
};

var handleFailure = function(o)
{
if(o.responseText !== undefined)
{
chTXT = "Transaction id: " + o.tId + "\n";
chTXT += "HTTP status: " + o.status + "\n";
chTXT += "Status code message: " + o.statusText;
alert(chTXT);
}
};

var callback =
{
  success:handleSuccess,
  failure:handleFailure,
  argument:['foo','bar']
};

var sUrl = "";
var postData = "";

function sauvegarder()
{
var sUrl = "op/op.ordre.enreg.php";
var branch = tree.getBranchById("tete");
var postData = "arbre="+branch.serialize(true);
makeRequest(sUrl, postData);
return true;
}

function activer(id)
{
var sUrl = "op/op.art.activ.php";
var postData = "id="+id;
makeRequest(sUrl, postData);
return true;
}

function desactiver(id)
{
var sUrl = "op/op.art.desactiv.php";
var postData = "id="+id;
makeRequest(sUrl, postData);
return true;
}

function makeRequest(sUrl, postData)
{
var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
}
</script>
<div id="myTree" style="position: absolute; top: 120px;"></div>
<input type="button" onclick="sauvegarder();" value="test" style="position: absolute; top: 420px;">

Il me retourne toujours la même erreur...

Commentaire de rekam le 25/04/2007 12:21:12

certes, car il subsiste une erreur ;-)

en l'occurrence, tu redéfinis ta variable "tree" dans la fonction TafelTreeInit(). Toi tu fais :

var tree = new TafelTree(..)

or tu dois faire :

tree = new TafelTree(...)

Le fait de ne pas mettre le "var" signifie que tu récupères la variable globale (je résume, mais en gros, c'est ce qui va se passer). Donc en ne mettant pas le "var", tu vas créer l'arbre dans le "tree" défini en amont. Là, ce que tu fais, c'est que tu définis une variable juste pour cette fonction, qui s'appelle "tree", certes, mais qui n'a rien à voir avec la variable globale.

Voilà, a+
rekam

Commentaire de Gwinyam le 25/04/2007 15:08:12

En effet, bien vu.

Je te remercie!!!
Gwinyam

Commentaire de coyote le 23/05/2007 22:41:55

Superbe en effet ...

Une question:
j'ai pris le script exemple. J'ai ajouté un bouton dans le body de la page qui ajoute un item au noeud selectionné:

var selected  = tree.getSelectedBranches();
for (var i = 0; i < selected.length; i++)
{
var item = {
"id" : "branch2"+i,
"txt" : "child last",
}

selected[i].insertIntoLast(item);
}

Mais ca ne marche pas. L'arbre me dit qu'il n'a pas de noeud selectionné. J'ai l'impression que le clic sur le bouton fait "perdre" le focus de l'item. Il reste coloré en bleu mais ne semble pas se considérer comme selectionné...

Quelqu'un a t il une réponse ?

Commentaire de gen76 le 09/06/2007 02:15:14

super !

SVP pouvez vous m'aider a le transformer (si possible) : je veus utiliser le tree comme menu dans un cadre ( frame ) ?

merci

Commentaire de rekam le 10/06/2007 22:15:35

>> coyote

salut, pourrais-tu poster ce problème dans le forum (http://tafel.developpez.com) avec de plus amples informations, genre tout ton code où ce qu'il te semble le plus pertinent ? si c'est un bug, c'est inquiétant.


>> gen76

salut aussi, le transformer, c'est-à-dire ? L'utiliser comme menu ? tu devrais pouvoir t'en sortir en utilisant la structure <ul><li>, du style :

<ul id="menu">
<li tid="b1"><a href="lien1.html">Lien 1</a></li>
...etc...
</ul>

a+
rekam

Commentaire de gen76 le 11/06/2007 11:24:53

>> REKAM

rebonjour , le transformer : l'adapter : garder l'aspet visuell en l'utilisant comme menu

[+]--{dossier}
   |
   |
  [+]----{sous dossier}
     |
     |-----{ element 1 }

dynamique , visuell : l'ouverture des menu et sous menu par clic

Commentaire de ThoMiNou le 31/07/2007 11:31:07

Excellent, exactement ce qu'il me fallait, ca va m'éviter des heures de boulot.. Il ne me reste plus qu'a me plonger dans le code.

Merci Merci!!

Commentaire de ThoMiNou le 03/08/2007 15:54:53

Est-ce qu'il serait possible d'avoir un exemple de l'utilisation de la méthode onOpenPopulate un peu plus concret que dans la documentation?

Merci :)

Commentaire de awnp1 le 03/10/2007 10:31:46 10/10

10/10 !

Commentaire de coubi64 le 28/11/2007 09:45:28 7/10

Bonjour,

Déjà bravo pour ce travail formidable, c'est bluffant!

Je travaille avec des jsp et j'aimerais afficher l'arborescence côté serveur pour y faire des manipulations sur les fichiers.

Votre script correspond à ce que je veux afficher mais je voudrais savoir si cela est faisable et comment, j'ai un peu de mal à relier votre script aux échanges avec le serveur.

Merci.

Commentaire de batoule80 le 02/12/2007 22:51:13

bonjour
bravo pour le big boulot vraiment impréssionnat
voilà je voudrais créer deux arbres l'un en dessous de l'autre  
j'ai éssayé avec ce code mais il ne m'ffiche rien  :(

svp aidez moi à y remédier car je galère là :s

<html>
<head>

<link rel="stylesheet" type="text/css" href="C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/css/tree.css" />

<script type="text/javascript" src="C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/js/prototype.js"></script>

<script type="text/javascript" src="C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/js/scriptaculous.js"></script>

<script type="text/javascript" src="C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/Tree.js"></script>

</head>
<body>



<div id="myTree"></div>

<script type="text/javascript">

// Structure de base représentant une racine avec deux

// sous-branches

var struct = [

{

'id' : 'root_1',

'txt' : 'Admin',

'items' : [

{

'id' : 'branch_1',

'txt' : 'Utilisateur'

},{

'id' : 'branch_2',

'txt' : 'Types requètes '

}

]

}

];

</script>

<script type="text/javascript">

// On déclare le tree à l'extérieur de la fonction.

// Ainsi, il sera accessible de manière globale.

var tree = null;

// Initialisation de l'arbre. Cette fonction est appelée

// automatiquement à la fin du load de la page

function TafelTreeInit () {

tree = new TafelTree('myTree', struct, {

'generate' : true,

'imgBase' : 'C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/imgs/',

'width' : '100%', // valeur par défaut : 100%

'height' : '150px', // valeur par défaut : auto

'openAtLoad' : true,

'cookies' : false

});









}

</script>


     <script type="text/javascript">
     // Cette fonction est automatiquement appelée au chargement de la page
     function TafelTreeInit() {
     // L'item dont l'id vaut "specialOpen" n'a pas d'enfants. Au moment de cliquer dessus,
     // c'est le serveur qui donnera les informations concernant les enfants
     var struct = [
     {
    'id':'root1',
     'txt':'Element racine',
    'img':'page.gif', // Image s'il n'a pas d'enfants
     'imgopen':'folderopen.gif', // Image s'il a des enfants et qu'il est ouvert
     'imgclose':'folder.gif', // Image s'il a des enfants et qu'il est fermé
     'items':[
     {
     'id':'child1',
     'txt':'Un enfant',
     'img':'page.gif',
     'tooltip':'Un petit tooltip sympa',
     },
     {
     'id':'specialOpen',
     'txt':'Les enfants sont sur le serveur',
     'img':'page.gif',
     'imgopen':'folderopen.gif',
     'imgclose':'folder.gif',
     'canhavechildren':true,
     'onopenpopulate':function(branch, response){ return true;},
     'openlink':'scripts/open.php'
     }
     ]
     }
     ];
     var tree = new TafelTree('test2', struct, {
     'generate' : true,
     'imgBase' : 'tree/imgs/',
     'width' : '100%',
    'height' : 'auto',
    'defaultImg' : 'page.gif',
    'defaultImgOpen' : 'folderopen.gif',
    'defaultImgClose' : 'folder.gif'
    });

    
    
   </script>
  <div id="test2"></div>  

// deuxième arbre

<div id="myTreee"></div>

<script type="text/javascript">

// Structure de base représentant une racine avec deux

// sous-branches

var struct = [

{

'id' : 'root_2',

'txt' : 'User',

'items' : [

{

'id' : 'branch_3',

'txt' : 'Créer'

},{

'id' : 'branch_4',

'txt' : 'Supprimer '

}

]

}

];

</script>
<script type="text/javascript">

// On déclare le tree à l'extérieur de la fonction.

// Ainsi, il sera accessible de manière globale.

var treee = null;

// Initialisation de l'arbre. Cette fonction est appelée

// automatiquement à la fin du load de la page

function TafelTreeInit () {

treee = new TafelTree('myTreee', structt, {

'generate' : true,

'imgBase' : 'C:/Mes Sites/Helpdesk/HELPDESK_WEB/tafelTree_1_9_1/tafelTree/imgs/',

'width' : '100%', // valeur par défaut : 100%

'height' : '150px', // valeur par défaut : auto

'openAtLoad' : true,

'cookies' : false

});


}

</script>

<script type="text/javascript">
     // Cette fonction est automatiquement appelée au chargement de la page
     function TafelTreeInit() {
     // L'item dont l'id vaut "specialOpen" n'a pas d'enfants. Au moment de cliquer dessus,
     // c'est le serveur qui donnera les informations concernant les enfants
     var structt = [
     {
    'id':'root2',
     'txt':'Element racine',
    'img':'page.gif', // Image s'il n'a pas d'enfants
     'imgopen':'folderopen.gif', // Image s'il a des enfants et qu'il est ouvert
     'imgclose':'folder.gif', // Image s'il a des enfants et qu'il est fermé
     'items':[
     {
     'id':'child2',
     'txt':'Un enfant',
     'img':'page.gif',
     'tooltip':'Un petit tooltip sympa',
     },
     {
     'id':'specialOpen',
     'txt':'Les enfants sont sur le serveur',
     'img':'page.gif',
     'imgopen':'folderopen.gif',
     'imgclose':'folder.gif',
     'canhavechildren':true,
     'onopenpopulate':function(branch, response){ return true;},
     'openlink':'scripts/open.php'
     }
     ]
     }
     ];
     var treee = new TafelTree('test3', structt, {
     'generate' : true,
     'imgBase' : 'tree/imgs/',
     'width' : '100%',
    'height' : 'auto',
    'defaultImg' : 'page.gif',
    'defaultImgOpen' : 'folderopen.gif',
    'defaultImgClose' : 'folder.gif'
    });

    
    
   </script>
  <div id="test3"></div>  

</body>

</html>

bonne continuation

Commentaire de kubiac88 le 03/12/2007 11:07:19 10/10

Vraiment nickel, 10/10.

Commentaire de batoule80 le 06/12/2007 10:23:45

bonjour

j'ai pu régler mon poblème grace à rekam ;)  merci encore

a +

Commentaire de DanaX le 29/12/2007 22:10:02 10/10

Tout d'abord je tiens à te remercier pour ce magnifique exemple de code propre et proposant des fonctionnalitées incroyables que je n'ai pu retrouver ailleurs. Cependant, le temps d'affichage est assez long pour environ 200 noeuds, l'affichage prend 7-8 secondes ce qui est génant en comparaison du treeview tigra treemenu.
Existe t'il une solution permettant d'optimiser le temps d'affichage(hormis l'utilisation du fichier js optimiser)? A moins qu'il y est une erreur de mon côté mais tous s'affiche parfaitement sans erreur de js.

Merci encore pour ce magnifique travail.

Commentaire de rekam le 30/12/2007 17:03:55

Salut,

alors non, pas vraiment, en fait. Il faut que je fasse une refonte complète de la structure de l'arbre. Cela dit, tu peux regardere du coté de "onOpenPopulate", qui te permet de charger les noeuds petit-à-petit. Regarde sur le forum du site (tafel.developpez.com).

a+!
rekam

Commentaire de DanaX le 30/12/2007 21:00:05

Merci pour ta réponse rapide, j'avoue avoir pensé à cette solution mais je ne peux accéder aux forums => affichage d'un message 'Ah ben pas de bol, vous êtes considéré comme spam. Pour utiliser le forum, il vous faut passer par le site officiel : par ici' et j'ai beau essayé de créer un compte ou autre ca affiche ce message.

Parcontre, il est vrai que si tu arrives à afficher l'arbre aussi rapidement que dans tigramenu ca serait génial. Mais je ne vois pas trop la différence avec tigra treemenu sur le format final d'affichage de l'arbre.

Cordialement,
Daniel

Commentaire de wxcvbn9 le 16/05/2008 01:06:01 10/10

Félicitations !
Quel superbe composant et surtout avec une doc comme je n'en ai jamais vue !

Commentaire de Noizet le 21/05/2008 21:10:21

En tout cas, superbe code!
Par contre, j'ai un soucis, il met impossible d'aller sur ton forum, car il me prend tout le temps pour un spam :-(

Alors je pose ma question ici. J'ai fait un formulaire pour qu'on puisse ajouter le nom qu'on veut a une branche et je l'insère avec la fonction branch.insertIntoLast(item); prévu à cet effet. Il m'ajout la branche une fois que j'ai cliqué sur mon bouton et 1 sec après elle disparaît quand ma page se recharge. Peux-tu me dire comment faire pour qu'elle reste?

Commentaire de rekam le 22/05/2008 23:05:41

Salut à toutes z'et à tous,

Je n'ai pas encore mis à jour le site, mais je vais malheureusement laisser tomber le dev de cet arbre. Ce n'est pas par flemme, loin de là ;-). Mais je l'avais conçu au départ parce que rien de similaire n'existait à l'époque. Depuis un peu plus d'une année, une librairie excellente a vu le jour, du nom de Ext JS (http://www.extjs.com). Je précise que ce n'est pas de la pub gratuite. C'est vraiment une alternative SUPERBE à mon arbre. Cette librairie est énorme (non mais franchement, ils ont fait du très très bon boulot) et elle contient plein de choses, dont un arbre qui est ultra performant. Je l'utilise maintenant en lieu et place du mien et j'arrive à faire tout ce que je faisais avec le mien. Son utilisation est évidemment différente, mais une fois qu'on l'a en main, c'est de la vrai bombe!

quelques exemples:
drag&drop pour gérer l'ordre des éléments: http://www.extjs.com/deploy/dev/examples/tree/reorder.html
"tree-table" superbe : http://www.extjs.com/deploy/dev/examples/tree/column-tree.html
drag&drop entre arbres : http://www.extjs.com/deploy/dev/examples/tree/two-trees.html

Pour voir comment c'est fait, ils proposent le fichier js en download. Il y a besoin que de 3 include pour faire marcher le binz:
1) ext-all.css
2) ext-base.js
3) ext-all.js

A noter un truc essentiel: Ext a plusieurs "adapteurs", c'est à dire que vous pouvez dire que tout le framework se base sur Prototype.js, Yahoo-utiils ou un truc Ext-made. Donc si vous utilisez déjà Prototype, ben y'a pas de soucis, vous pouvez continuer à l'utiliser. Bref, c'est énorme.

Voilà encore quelques autres liens:
introduction: http://extjs.com/learn/Tutorial:Introduction_to_Ext_2.0
faq: http://extjs.com/learn/Ext_FAQ

Cette librairie est bien entendu gratuite, sous licence LGPL (quoiqu'ils sont entrain de passer en GPL). Plus d'info ici: http://www.extjs.com/products/license.php

Par ailleurs, Ext est maintenu par une foule de développeurs pro, contrairement au mien où je suis seul dessus (et pour dire franchement, ça fait bientôt 6 mois que je n'y ai plus retouché du tout...)
Bref, pour toutes ces raisons, j'ai stoppé le dev de mon arbre, parce qu'à terme, il ne fonctionnera plus. En terme de pérennité, Ext est un choix nettement meilleur, sincérement. Je profite maintenant du boulot des autres. ça fait du bien, de temps en temps :-)!

Aller, encore désolé, mais bonne chance pour la suite!

Commentaire de norgong le 04/11/2008 17:02:44 9/10

Bonjour, j'essai de generer une stucture en passant par ajax (en m'inspirant de json ^^) mais rien ne s'affiche voilà mon code pour recupérer la structure

function file(fichier)
{
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.open("GET", fichier, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) return(xhr_object.responseText);
else return(false);
}
var struct = [ file('/admin/arborescence_list.php') ];

ma page php appelé
<?php
/*
* Programme: arborescence_liste.php
* Description: page qui va récupérer l'arbo dans la bdd
*/

$selectTarget = <<<eod
select * from TARGET
eod;
$stmt = $database->execute($selectTarget);

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" );
header("Cache-Control: no-cache, must-revalidate" );
header("Pragma: no-cache" );
header("Content-type: text/x-json");
$json = "";
//$json .= "[";
$rc = false;
//récupération des objectifs
while ($row = $database->next_array($stmt))
{
if($rc) $json .= ", ";
$json .= <<<eod
{\n
'id' : '$row[ID_TARGET]',\n
'txt' : '$row[TARGET_NAME]'
eod;
//récupération des compéténces associées à l'objectif
$selectCompetence = <<<eod

eod;
$stmtComp = $database->execute($selectCompetence);
if($database->return_row($stmtComp) >= 1) $json .= " ,items : [\n";
$rc2 = false;
while ($rowComp = $database->next_array($stmtComp))
{
if($rc2) $json .= ",";
$json .= <<<eod
{
'id' : '$rowComp[ID_COMPETENCE]',
'txt' : '$rowComp[COMPETENCE_NAME]'
eod;
// récupération des activités associées
$selectActivities = <<<eod

eod;
$stmtAct = $database->execute($selectActivities);
if($database->return_row($stmtAct) >= 1) $json .= ", items : [\n";
$rc3 = false;
while($rowAct = $database->next_array($stmtAct))
{
if($rc3) $json .= ", ";
$json .= <<<eod
{
'id' : '$rowAct[ID_ACTIVITY]',
'txt' : '$rowAct[ACTIVITY_TITLE]'
}
eod;
$rc3 = true;
}
if ($rc3) $json .= "]\n";
$json .= "}\n";
$rc2 = true;
}
if($rc2) $json .= "]\n";
$json .= "}\n";
$rc = true;
}
//$json .= "]";
echo $json;
?>

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Menu "tree" sans frame (tres important: menu reste ouvert et highkighté ou en gras apres avoir cliqué sur un lien) [ par simriv123 ] Bonjour, le titre est asser long, mais il dit ce qu'il dit.j'ai cherché un peu sur le site mais je n'ai pas trouvé ce que je cherchais.Ce que je désir Ajax et Send [ par syndrael ] Bonjour, J'ai un souci avec Ajax et IE. Mon code fonctionne tr&#232;s bien sous Firefox. Voila le probl&#232;me: J'ai un menu d&#233;roulant qui fait tree menu listant le contenu d'un dossier [ par tony27 ] Hello ! Est-il possible de creer une arborescence d'un dossier qui se trouvent sur un hdd, mais de pouvoir l'inclure dans une page html donc pour un ExtJs et menu contextuel [ par Carboo ] Bonjour,Voila j'aimerai créer un menu contextuel avec le frameworks Extjs que je souhaite integrer a un Tree (source du tree : http://extjs.com/deploy Ajax, un défit entre javascript et php ? [ par abcdiscussion ] Bonjour, j'ai un petit soucis, puisque je n'arrive pas à créer une partie de mon formulaire, sûrement toute bête en AJAX, je m'explique : Le but de ce menu horizontal/vertical sous ajax/php/mysql [ par thibill ] Salut à tous et toutes, Est-ce qu'il y a qq'un qui a déjà fabriqué un menu horizontal 3 niveaux permettant de tirer les données du menu directement d Menu Déroulant Ajax [ par Catalarem ] Alors ben tout d'abord un grand merci à cette fabuleuse communauté qui je le sens (depuis que je me suis enfin convaincu moi même que le bon vieux HTM menu déroulant [ par metaleurop ] Bonjour à tous.J'ai un petit problème avec le menu déroulant suivant:&lt;html&gt; &lt;title&gt;liste déroulante dynamique&lt;/title&gt; &lt;head&gt; & Menu ouvrable et réductible [ par infoplus22 ] Bonjour,Je suis entrein d'adapter un code que j'ai trouvé sur codes-sources pour faire un menu qui convient à ce que je veux. Le code que j'ai trouvé menu vertical [ par chlock ] Boncjour, je crée un site web et j'ai créé un menu vertical avec tout le tra la la (include pied de page, entete, et quand je selectionne dans mon men


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
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,780 sec (3)

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