LISTER DOSSIER AVEC UN ARBRE / TREE EN PHP / JAVASCRIPT

webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 - 7 août 2008 à 01:09
reynum Messages postés 7 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 12 juillet 2011 - 12 juil. 2011 à 15:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47527-lister-dossier-avec-un-arbre-tree-en-php-javascript

reynum Messages postés 7 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 12 juillet 2011
12 juil. 2011 à 15:29
Ce code ne fait pas exactement ce que je veux mais par contre il fonctionne bien et est facile à intégrer et surtout il constitue une bonne base modifiable pour mon utilisation finale.
Merci :-)
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
25 sept. 2008 à 14:07
Toi, tu dois pas savoir faire une recherche... Va jeter un oeil à mes sources... Tu verras ce que j'ai proposé pour parcourir des dossiers... C'est juste un peu plus élaboré (je ne parle pas de performances, juste d'originalité et de fonctionnalité).
Le seul truc, c'est que j'ai pas à faire ma pub sur les sources des autres, en prétendant que ce que j'ai fait est mieux : c'est pas dans mes habitudes d'être prétentieux à ce point. Mes publications sont librements consultables (encore faut-il faire l'effort d'aller les chercher), libre à chacun d'aller les voir (ou pas).

Sinon, tu dis : "ben propose un truc nikel"
Je critiquais la manière de faire, j'ai aussi indiqué comment il faut faire pour bien le faire. Pour ce qui est des explications (pourquoi c'est mieux comme ça), il suffit de lire la doc. Mais comme de nombreuses personnes ne lisent même pas la doc...
cs_doudoubreton Messages postés 1 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 25 septembre 2008
25 sept. 2008 à 12:13
pour neigedhiver... ben propose un truc nikel plutot que de critiquer sans faire avancer le problème...
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
8 août 2008 à 10:15
Salut,

Je vais juste ajouter ce que je dis à chaque fois sur une source de ce genre :
"Vous en avez pas marre d'utiliser opendir() et readdir() ?"

Sérieusement, TOUTES les sources qui font ce genre de choses le font de la même manière. En plus, toi, tu ne le fais même pas correctement :
while ($f = readdir($dir))
La bonne manière de faire est :while (false !($file readdir($handle))) {
C'est dans la doc PHP de la fonction readdir, exemple #1.

Désolé, mais les sources d'affichage de fichiers sont toutes quasiment les mêmes, et c'est pénible à force de voir toujours la même chose.
cyril6789 Messages postés 14 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 6 janvier 2016
7 août 2008 à 19:25
c'est de l'orienté objet ça non ?
et les feuilles seraient quoi ?
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
7 août 2008 à 14:10
Avec les classes, tu peux créer un arbre en créant les classes suivantes :

Tree, Branch et Leaf

Ou en français

Arbre, Branche et Feuille

Un Arbre est composée de Branches (ou de Feuilles aussi) qui elles sont composées de Branches et / ou de Feuilles.

++
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 août 2008 à 12:37
en php, pour faire un arbre, soit tu fais une classe, soit tu fais un array d'arrays.

array(
'dossier'=>array(
'sous_dossier'=>array()
)
)
cyril6789 Messages postés 14 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 6 janvier 2016
7 août 2008 à 09:33
oui c'est vrai que c'est a y penser !

N'empeche que j'avait fait une recherche un peu sur le net pour un arbre comme ça, et j'ai rien trouvé ! si ça se trouve je suis le seul :P
nan je pense pas, mais j'espere pouvoir en dépanner plus d'un !
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
7 août 2008 à 09:30
@Coucou747 : je n'ai pas dit que glob() était obligatoire. J'ai fait savoir que glob() était préféré dans la mesure où il simplifie énormément les parcours de dossier grâce aux filtres et au fait que la fonction retourne un tableau. Ainsi, on peut appliquer tous types de fonctions natives pour manipuler ce tableau : tri, fonction perso de callback...

Quant au or die(), il n'a pas raison d'exister quand le script est débuggué et prêt à passer en production. A la rigueur, l'assertion est une bonne alternative car on peut la désactiver / réactiver à tout moment contrairement au or die().

@cyril6789 : au temps pour moi concernant les fichiers. Néanmoins, il serait cool de pouvoir lire ce qu'il y'a dans chaque dossier. Ou bien si tu faisais une classe, de posséder une option pour dire si je dois afficher ou non le contenu des dossiers.

Je ne dis pas que tu dois utiliser des superglobales, loin de là. J'ai juste dit que les superglobales pouvaient être appelées dans les fonctions sans passer par le mot-clé "global". Ce qu'il fait que tu fasses, c'est augmenter le nombre de paramètres de ta fonction, pour lui refournir les paramètres en "global" au moment de la récursivité. Par exemple, plutôt que d'avoir ça :

function toto($a, $a) {
global $c;
$c += ($a+$b);
$a += 2;
$b *= 3;

if($c < 100) {
toto($a, $b);
}
}

Tu peux faire :

function toto($a, $b, $c=0) {
$c += ($a+$b);
$a += 2;
$b *= 3;

if($c < 100) {
toto($a, $b, $c); // Ici je passe explicitement le paramètre $c
}
}

C'est quand même plus propre que le global...

Bon courage pour la mise à jour du code. C'est un bon entraînement !

Hugo.
cyril6789 Messages postés 14 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 6 janvier 2016
7 août 2008 à 09:00
WEBDEB> Attention, ce script n'affiche pas les fichiers dans le menu ! il n'affiche QUE les dossiers. Sinon, pour afficher le contenu de chaque dossier à l'interieur de la page, ce n'est pas traité ici.

Pour les global, je n'aime pas trop utiliser de superglobales, car trop lourd je trouve, il faut impérativement être avant le HTML, il faut créer la sessions etc ... je préfère utiliser les simple global, ça mange pas de pain. Il est vrai que j'ai oublié de sécurisé la variable $_GET['path'], mais bon, un addslashes, ou un htmlentities fait l'affaire. Pour ce qui est de la différence entre $i = '0' et $i=0, il est vrai que le premier est une chaine, mais si j'incrémente, ç amarche quand meme ! bon, a corriger pk pas.
Pour filtrer le path, je me renseigne.

Enfait, je me suis pas enormément concentré sur le PHP qui liste les dossiers pn va dire, j'ai avant tout misé sur la mise en place, la gestions des [+] [-] avec ou sans continuité (pointillés vers le bas), ligne vertival, |- ou |_ ou vide, après, je me susi bien rendu compte que c'été pas super optimisé, mais bon, j'ai quand mm assez galéré, j'avait un peu peur de toucher à tout pour tout faire planter.

coucou747> Que veut tu dire par "structure de données plus marrante"?
pour le cookie, ça dépend entierement de l'utilisation que tu fait du menu. Dans mon cas par exemple, il n'est absoluement pas necessaire de sauvegarder le dossier ouvert.



Sinon, je pense de toute manière l'optimiser, mais j'ai pas trop envie d'utiliser les superglobal, c'est trop lourd à mon gout. je préfère le global simple. ce n'est qu'un menu après tout ! il n'est pas sensé y avoir 40000 sous dossiers !
Perso, je suis quand meme parti de rien ! je ne savait mm pas comment commencer ! je savait afficher l'aroborescence des dossiers sous forme de puce, mais pour la gestion des ptites images, je ne savait pas du tout ! je suis quand meme assez satisfait, bien qu'il mériterai une bonne petite cure d'optimisation !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 août 2008 à 02:26
glob n'a rien d'obligatoire... et le or die ne me choque pas, je trouve meme que c'est une tres bonne habitude en php4...

quand je vois ca :
$hierar--;
et l'utilisation de ta variable $texte, je me dis que tu devrais chercher a utiliser des structures de donnees plus marrantes (piles, arbres, etc...) parce-qu'alors, tu pourrais virer tes globales et ton html.

tu aurais alors un code "
- souple
- reutilisable
- propre
-sans globales
-sans html au milieu d'une fonction (enfin pas d'une fonction qui fait autre chose que de la mise en forme.)

bon, sinon, un conseil pour le javascript, beaucoup de gens (comme moi) aiment que l'etat des dossiers soit memorise (ouvert, ferme...) pour la prochaine visite (des cookies qui sauvent le onclick)

elmt.style.display = "";
ici, c'est pas une chaine vide qu'il faut mettre normalement (meme si ca n'influence rien, c'est pas propre) pour une liste, je crois que c'est block, mais j'en suis pas sur.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
7 août 2008 à 01:09
Salut,

Plusieurs choses ne semblent pas aller dans ton code. Je l'ai testé et j'ai constaté que ça ne marchait pas... Il m'affiche bien le dossier "images" mais ne m'affiche pas son contenu, pourtant composé d'images uniquement.

Voici les points défaillants :

1/ Il serait préférable d'encapsuler ton code dans une classe avec des méthodes pour traiter le path, récupérer les fichiers, générer la vue... plutôt que mélanger un peu tout. L'idéal serait de pouvoir avoir plusieurs classes "Décorateur" pour afficher la vue différemment : une pour générer un arbre, une autre qui génèrerait une liste UL, une autre un tableau HTML... à partir d'un tableau PHP représentant la structure du dossier à représenter visuellement. De plus, avec une classe tu pourais plus facilement proposer des features supplémentaires comme l'interdiction d'afficher tel ou tel type de fichier. Par exemple, si mon dossier "images" contient des fichiers PHP, j'aimerai que l'on ne puisse pas les voir au final.
2/ Tes fonctions devraient être déclarées avant tout envoi HTML pour plus de structuration du code
3/ L'existence de la variable $_GET['path'] n'est pas testée avant de l'affecter à $path, ce qui provoque une erreur Notice chez moi car j'affiche tous les erreurs en développement.
4/ Ta solution pour filtrer $path est beaucoup trop complexe. Regarde du côté de l'extension Filter() et des fonctions natives de traitement des fichiers.
5/ Tu ne connais pas la différence entre les types de variables $i='0' déclare une variable de type chaine et qui contient la chaine 0. En revanche pour agir sur des entiers, on déclare $i = 0;
6/ On évite les or die() en production. On préfèrera des assertions que l'on peut désactiver très simplement ou alors les exceptions dans le cadre de l'utilisation de classes et d'objets.
7/ On évite également les variables globales déclarée avec le mot-clé "global". Une fonction ne devrait agir que sur des variables internes ou des superglobales.
8/ Pour lister le contenu d'un répertoire, on préfère la fonction glob() qui permet d'appliquer des filtres et d'obtenir un tableau en sortie bien plus facile à manipuler avec toutes les fonctions natives de PHP.

IL y'aurait encore pas mal de choses à dire sur ton code. Il n'est pas si mal mais peut utilisable véritablement en production car pas suffisamment optimisé et découplé. Une API avec des classes et objets serait sûrement plus judicieuse. Néanmoins, je note le fait que tu as cherché à sécuriser un minimum les accès à des répertoires sensibles.
Rejoignez-nous