Lister dossier avec un arbre / tree en php / javascript

Soyez le premier à donner votre avis sur cette source.

Vue 20 612 fois - Téléchargée 1 919 fois

Description

Code complet permettant de lister sous forme de menu l'arborescence d'un dossier FTP.

Chaque dossier peut être ouvert ou fermé grâce à des boutons [+] et [-]. Si le dossier est vide, il n'affiche ni le [+], ni le [-] mais une ligne verticale.

Chaque titre de dossier est un lien passant en paramètre le chemin du dossier en question, ainsi, le dossier passé en paramètre est directement ouvert au chargement de la page.

Le path est sécurisé, on ne peut remonter les dossier en faisant ../

Le seul bémol est qu'il y a un éspace entre chaque ligne , ce qui sépare les petites images (pointillés).

Source / Exemple :


<style type="text/css">
		.lien:hover
		{
		     cursor: pointer;
		}
		</style>
		<script language="javascript">
			function toggle(id, img, fin)
			{
				var elmt = document.getElementById(id);
				if(fin == 1)
				{
					if(elmt.style.display == "none")
					{
						elmt.style.display = "";
						img.setAttribute("src", "./images/moinspetit.png");
					}
					else
					{
						elmt.style.display = "none";
						img.setAttribute("src", "./images/pluspetit.png");
					}
				}
				else
				{
					if(elmt.style.display == "none")
					{
						elmt.style.display = "";
						img.setAttribute("src", "./images/moins.png");
					}
					else
					{
						elmt.style.display = "none";
						img.setAttribute("src", "./images/plus.png");
					}
				}
			}
		</script>
		<?php
		$path = $_GET['path'];
		$path = preg_replace('#((\.+\/+)*)#', '', $path); // on enleve les ./ ../ ..// .../ ...// .../// etc
		//$path = preg_replace('#(\.+)#', '', $path); //on vire les . .. ... ..... etc
		$path = preg_replace('#(\/*)$#', '/', $path); //on remplace / // /// /// (à la fin ) etc ... par /
		$path = preg_replace('#(\/+)#', '/', $path); //on remplace / // /// /// etc ... par /
		$path = preg_replace('#^(\/)#', '', $path); // on supprimer le / du début
		$path = preg_replace('#^(\.+\/+)#', '', $path); //on supprimer les ./ ../ etc du début
		$path = preg_replace('#(\.+)$#', '', $path); //on vire les . .. ... ..... etc de la fin
		$path = preg_replace('#^(\.+)#', '', $path); //on vire les . .. ... ..... etc du début
		$path = './'.$path;
		$folders = explode("/", $path);
		$i = '-1';
		$hierar = '0';
		$texte = '';
		$vide = '';
		function compte($chemin)
		{
			$i = '0';
			$dir = opendir($chemin) or die("erreur");
			while ($f = readdir($dir)) 
			{
				if($f != '.' && $f != '..')
					if(is_dir($chemin.$f))
						$i++;
			}
			
			return $i;
		}
		function parcour($chemin, $videok)
		{
			$nombre = 0;
			global $folders;
			global $hierar;
			global $vide;
			$hierar++;
			global $texte;
			global $i;
			$dir = opendir($chemin) or die("erreur");
			while ($f = readdir($dir)) 
			{
				if($f != '.' && $f != '..')
				{
					if(is_dir($chemin.$f))
					{	
						$nombre++;
						$nombrefolder = compte($chemin.'/');
						$nombresusfolder = compte($chemin.$f.'/');
						if($nombrefolder == $nombre)
							$vide[$hierar] = 1;
						else
							$vide[$hierar] = 0;
						$i++;
						if($hierar > '1')
						{
							for($nb=1; $nb < $hierar; $nb++)
								if($videok[$nb] == '1')
									$texte .= '<img src="./images/vide.png" alt="" />';
								else
									$texte .= '<img src="./images/verti.png" alt="" />';
						}
						if($nombresusfolder == '0')
						{
							if($nombrefolder == $nombre)
								$texte .= '<img src="./images/simplepetit.png" />';
							else
								$texte .= '<img src="./images/simple.png" />';
						}
						else
						{
							$texte .= '<img class="lien" onclick="javascript:toggle(\'dossier'.$i.'\', this, '.$vide[$hierar].');"';
							
							if($nombrefolder == $nombre)
							{
								if($folders[$hierar] != $f)
									$texte .= ' src="./images/pluspetit.png" alt="[+]" />';
								else
									$texte .= ' src="./images/moinspetit.png" alt="[-]" />';
							}
							else
							{
								if($folders[$hierar] != $f)
									$texte .= ' src="./images/plus.png" alt="[+]" />';
								else
									$texte .= ' src="./images/moins.png" alt="[-]" />';
							}
						}
						//AFFICHAGE DE LA LIGNE
						$texte .= ' <img src="./images/mini_folder.png" /> <a href="./tree.php?path='.$chemin.$f.'">'.$f.'</a><br />';
						//FIN AFFICHAGE DE LA LIGNE
						$texte .= '<div id="dossier'.$i.'"';
						if($folders[$hierar] != $f)
							$texte .= ' style="display: none;"';
						else
							$texte .= ' alt="[+]" ';
						$texte .= ' />';
						parcour($chemin.$f.'/', $vide);
						
						$texte .= '</div>';
						
					}
				}
			}
			closedir($dir);
			$hierar--;
			return $texte;
		}
		
		echo parcour("./", $vide);
		?>

Conclusion :


ben, amusez-vous bien ! ;-)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
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 ?
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.