Page 1 sur 1

aide sur une navigation dans une arborescence

Posté : 21 juin 2007, 09:08
par béka
Bonjour tout le monde, désolé d'attaquer de si bon matin....

Voilà j'explique mon problème, je voudrais que l'utilisateur (un superadmin) puisse naviguer dans une arborescence en cliquant simplement sur le nom du dossier (un peu genre l'arbo de windows). Puis lorsqu'il est dans le répertoire qu'il souhaite, il peut soit créer un répertoire soit en supprimer un.

Voici pour l'instant mon code :
<?
//on vérifie que l'utilisateur s'est bien identifié
//s'il s'agit d'un administrateur admin ou sadmin
if ((isset($_SESSION['admin'])) or (isset($_SESSION['sadmin'])))
{

  //on récupère tous les fichiers, qui sont dans le répertoire directory, 
  //on les stocke dans un tableau et on les affiche à l'écran
  if( (!isset($_POST['dirname_add'])) && (!isset($_POST['dirname_delete'])) )
  {
    //on définit la variable path
    $path = getcwd();
    //on appelle la fonction
    list_dir($path);
  }


  //création d'un répertoire
  if(isset($_POST['dirname_add']))
  {
    $path = getcwd();
    $dirname = $_POST['dirname_add'];
    //on supprime les accents
    $dirname = strtr($dirname,
      'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
      'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
    mkdir_recursive($path.'/'.$dirname);
    list_dir($path);
  }
  
  //suppression d'un répertoire
  elseif(isset($_POST['dirname_delete']))
  {
    $path = getcwd();
    $dirname = $_POST['dirname_delete'];
    //on supprime les accents
    $dirname = strtr($dirname,
      'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
      'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');    
    full_rmdir($path.'/'.$dirname);
    list_dir($path);
  }  
  ?>
  
  
  <!-- formulaire de création d'un répertoire-->
  <form method="post" action="directory.php">
  <fieldset>
    <legend><? echo DIRECTORY_FORM_CREATE; ?></legend>
    <p><label for="dirname_add"><? echo DIRECTORY_NAME_CREATE; ?></label><input type="text" name="dirname_add" /></p>
    <p><input type="submit" name="valider" value="Créer le répertoire" /></p>
  </fieldset>
  </form>
  <!-- fin de formulaire de création de répertoire-->
  
<br />

  <!-- formulaire de suppression d'un répertoire-->
  <form name="suppr" method="post" action="directory.php" onSubmit="return confirmation();">
  <fieldset>
    <legend><? echo DIRECTORY_FORM_DELETE ?></legend>
    <p><label for="dirname_delete"><? echo DIRECTORY_NAME_DELETE; ?></label><input type="text" name="dirname_delete" /></p>
    <p><input type="submit" name="valider" value="Supprimer le répertoire" /></p>
  </fieldset>
  </form>
  <!-- fin de formulaire de suppression de répertoire-->
  
<br /><br />

  <!-- formulaire pour retourner à l'accueil de l'admin-->
  <form method="post" action="../home.php">
  <legend><? echo DIRECTORY_RETURN_FORM; ?></legend>
  <p><input type="submit" name="retour" value="Retourner au menu d'administration"></p>
  </form> 
  <!-- fin du formulaire de retour-->
  

<?
//si la personne n'a pas le droit d'accéder à cette page
}
else
{
  header("Location: ../index.php"); //on l'a renvoi sur la page d'accueil
  exit();
}
Ce code ne marche que lorsqu'on est à la racine, il n'y a pas de navigation. Comment faire ? Pouvez-vous m'aider à élaborer ce petit truc car je n'ai pas trouvé de réponse à mon problème sur ce forum.

Posté : 21 juin 2007, 09:57
par Ryle
Il n'y a pas de liens dans ton code.. c'est peut être pour cela que tu ne peux pas descendre dans ton arbo en cliquant sur un dossier ? ;)

Bon on va supposer que c'est list_dir qui t'affiche les éléments du dossier et les liens qui vont bien. Le problème viendrait alors du fait que ton $path corresponde au dossier de travail courrant, c'est à dire celui ou se trouve le script php et que tu ne lui passes pas l'arbo des sous dossiers. Si tu veux te ballader dans l'arborescence, il te faut descendre dans les différents dossiers à partir de ta racine... En gros :
$path = getcwd() . $arboDesSousDossiersDescendu . $dossierACreer;
Avec $arboDesSousDossiersDescendu de la forme "/dossier1/.../dossierN/" qui correspondrait aux dossiers ouverts dans ton arborescence :)

Posté : 21 juin 2007, 10:09
par jpaul
Bonjour,

Il y a un bon moment, j'avais fait un script similaire à ce que tu souhaites faire. Je l'ai retrouvé dans une des branches orphelines de mon site.
Ca date la première version était en php2 et j'avais modifié pour que cela fonctionne en php3...
Je l'ai abandonné car free ne permet plus de supprimer les répertoires avec php...

Si tu ne trouves pas de solution, tu peux peut être t'en inspirer voici le lien :
http://jpnce.free.fr/altern/livraison/g ... index.php3

Posté : 21 juin 2007, 10:10
par Invité
Oui c'est bien cette fonction list_dir() qui permet d'affichier l'arbo. Voici la fonction pour mieux comprendre :
<?
function list_dir($path) {
if ($dir = opendir($path)) {
  echo "<ul>";
  while($file = readdir($dir)) {
    echo "<li>".$file."<br /></li>";
    if( (is_dir($path."/".$file))  && (!in_array($file, array('.', '..'))) ) {
    list_dir($path."/".$file); 
    }
  }
  echo "</ul>";
  closedir($dir);
}
}
?>
Normal, qu'il n'y ai pas de lien, je ne vois pas comment faire.
En tout cas, j'ai compris ce que tu veux dire, mais comment déclarer $arboDesSousDossiersDescendu et que lui "mettre dedans" ?

Posté : 21 juin 2007, 10:12
par béka
merci jpaul, mais j'aimerais essayer de dév moi même, si vraiment je galère je me servirais de ton script.

EDIT : c'est moi le post précédent, ma session s'est déco c'est tout

re-EDIT : jpaul, j'ai regardé ton code et peux tu me dire à quoi corresponde les variables Aide, New_Rep, DD, D, A et comment les initialiser ?

Posté : 21 juin 2007, 11:01
par Ryle
Le plus simple, c'est de passer le chemin complet dans une variable de l'url. Imaginons structure suivante :

Code : Tout sélectionner

Racine Dossier1 Dossier1.1 Dossier1.1.1 Dossier1.2 Dossier2
Tu vas dans un premier temps proposer le listing racine à l'utilisateur donc :
- Dossier1 (avec un lien contenant une variable du genre : ?path=/Dossier1)
- Dossier2 (avec un lien contenant une variable du genre : ?path=/Dossier2)

S'il clique sur le Dossier1, tu vas pouvoir récupérer cette valeur et construire la liste des sous dossier ainsi :
- Dossier1.1 (avec un lien contenant une variable du genre : ?path=/Dossier1/Dossier1.1)
- Dossier1.2 (avec un lien contenant une variable du genre : ?path=/Dossier1/Dossier1.2)

donc de manière dynamique : ?path=<?php echo $_GET['path']?>/Dossier1.1

ET ainsi de suite, s'il clique sur le Dossier1.1, tu vas pouvoir récupérer la valeur et lui proposer la nouvelle liste.

Au niveau de ton formulaire, il te suffit donc de stocker cette valeur dans un champ caché, pour que lorsque l'utilisateur demande à créer un nouveau dossier, tu puisses construire le chemin (racine+arbo parcouru+nouveau dossier) :
$chemin = getcwd() . $_POST['path'] . $nomDuNouveauDossier
HTH :)

Posté : 21 juin 2007, 12:31
par béka
et comment mettre en application ce que tu dis ryle. Car je vois pas trop comment le faire. J'ai cherché là mais le néant.

Et après en faisant comme tu dis Ryle, on pourra supprimer ou ajouter des repertoires à l'endroit où on a navigué dans l'arborescence ? (ce qui est au début de mon code mais qui n'est valable que pour le répertoire courant) ?

Posté : 21 juin 2007, 14:43
par Invité
j'ai réfléchi, j'ai modifié mon code, je suis presque reparti d'une feuille vierge.

Voilà ce que j'obtiens :
<?PHP
//initialisation de la session
session_start(session_name('administration'));

//fichier qui permet la connexion au serveur et l'accès aux fonctions
include('../includes/config.php');


// initialisation
$niveau=0;
$Noeud[0]=".";
$Liste[0]="*";

do {
  // lecture du contenu du dossier courant, niveau= $niveau
  // correspodant au noeud de nom $Noeud[$niveau]
  // résultat > dossiers dans $Doss (de 0 à $ndoss) et fichiers dans $Fich (de 0 à $nfich)
  $chemin="";
  for ($i=0;$i<=$niveau;$i++){
    $chemin=$chemin.$Noeud[$i]."/";
  }
  if ($niveau==0)$chemin=".";
  $dp=opendir($chemin);
  $ndoss=-1;
  $nfich=-1;
  while (!is_bool($file=readdir($dp))){
    if ($file!="." and $file!=".."){
      if (is_dir("$chemin/$file"))$Doss[++$ndoss]=$file;
      if (is_file("$chemin/$file"))$Fich[++$nfich]=$file;
    }
  }
  closedir($dp);
// y a t-il un dossier qui n'a pas été exploré ?
  $new="";
  for ($i=0;$i<=$ndoss;$i++){
    if (!strstr($Liste[$niveau],"*".$Doss[$i]."*")){
      $new=$Doss[$i];
      break;
    }
  }
// si oui on descend dans ce dossier $new
// sinon on traite les fichiers puis on remonte
  if ($new!=""){
    // on descend  dans ce dossier $new
    $Liste[$niveau]=$Liste[$niveau].$new."*";
    $niveau++;
    $Noeud[$niveau]=$new;
    $Liste[$niveau]="*";
  }
  else{
    // on est en bout de branche ou plus de dossier inexploré
    //
    //Ici doit être inséré le traitement des fichiers:
    // chemin du répertoire= $chemin
    // liste des fichiers= tableau $Fich[]

/**************** sorties "HTML" pour test de ce module ***********************/
print "<SPAN>-------------</SPAN><BR>\n";
print "<B style=color:red>dossier:</B> $chemin<BR>\n";
print "<SPAN style=color:navy>fichiers:</SPAN><BR>\n";
if ($nfich<0){
  print "<I>aucun</I><BR>\n";
}
else{
  for ($i=0;$i<=$nfich;$i++){
    print "$Fich[$i]<BR>\n";
    //require ("directory.php");
  }
}
/************* fin de la sortie "HTML"" pour test *****************************/

    // après traitement, on remonte au niveau supérieur
    $niveau--;
  }
}
while ($niveau>=0);

// fin du module PHP
?>
Donc là on a un affichage de chaque dossier et j'aimerais que pour chaque dossier je puisse en rajouter à l'intérieur ou en supprimer avec des fonctions que j'ai dans un fchie functions.php.
Mais là comment faire, comment appelé ces fonctions dans le code ci-dessus.

Posté : 22 juin 2007, 09:19
par béka
Voilà, après de longues recherches et de longs essais hier, j'ai réussi à faire mon code pour naviguer dans une arborescence.
Voici le code (ça peut toujours servir, et peut être verrez-vous des choses et des points qui peuvent être optimisés).
<!--script explorer.php-->
<head>
<script LANGUAGE="JavaScript">
parametres="toolbar=0,location=0,directories=0,menuBar=0,scrollbars=1,width=700,height=600,left=150,top=50";
function OuvrirFenetre(lien) {
   f=window.open(lien,"fenetre",parametres);
   f.focus();
}
</script></head>

<?
include ('../includes/config.php');
// url du script exécuté
$self=$_SERVER['PHP_SELF'];
// dirname() extrait le chemin de l'url
$chemin=dirname($self);
// getcwd() donne le chemin réel sur le système de fichier hôte
$rep=getcwd();
// pour récupérer les valeurs des paramètres éventuellement transmis par formulaire
if (isset($_POST['rep'])) {
 $rep=$_POST['rep'];
 $chemin=$_POST['ch'];
}
echo "<h4>$chemin</h4>";
$compt=0;
// $rep doit être un chemin de rép. réel sur le système : ne pas l'afficher
if( $dir = opendir($rep) ) {
  while( FALSE !== ($fich = readdir($dir)) ) {
  /* $fich est toujours un nom sans chemin d'accès !
   * il désigne un fichier ou un s-rép ou les pseudo-rép '.' ou '..'
   */
   // pour bloquer la remontée au dessus de la racine du site web
   if (($fich == "..") && ($chemin !="/$self/") ){
	 // $rep contient le chemin réel vers le rép. courant
	 chdir($rep);
	 // pour se déplacer au rép. parent
	 chdir("..");
	 // pour récupérer ainsi le nouveau chemin
	 $newrep=getcwd();
	 // calculer le nouveau chemin WEB en éliminant le dernier rép.
	 if (preg_match("#(\S+)/\S+$#",$chemin))
   {
	   $newchemin=preg_replace("#(\S+)/\S+$#", '$1', $chemin); 
     }
	 else
	   $newchemin = "/";
     // transmission de $rep et $chemin par champs cachés de formulaire
     echo "<form action='$self' method='post' >
	   <input type='hidden' name='rep' value='$newrep'>
	   <input type='hidden' name='ch' value='$newchemin'>
	   </form>";
     // activer le lien provoque le rechargement du script
     //echo dirname($_SERVER['PHP_SELF']);
     if ( dirname($_SERVER['PHP_SELF']) != $chemin)
     {
        echo "<a href='#' onclick='document.forms[0].submit();'>
  	   <img src='../images/style_dotdot.jpg' width='20' height='20' border='0' ><b>..</b></a>
  	   <br>";
     }
   }
   elseif ($fich != ".") {
     if (is_dir($rep."/".$fich)) {
     // pour compter les formulaires associés
     $compt++;
	 chdir($rep."/".$fich);
	 $newrep=getcwd();
	 $newchemin= $chemin."/".$fich;
     echo "<form action='$self' method='post' >
	   <input type='hidden' name='rep' value='".$newrep."'>
	   <input type='hidden' name='ch' value='".$newchemin."'>
	   </form>";
     echo "<a href='#' onclick='document.forms[$compt].submit();'>
	   <img src='../images/style_directory.jpg' width=20 height=20 border=0>$compt-$fich</a>
	   <br>";
	 }
   else {
     $url = $chemin."/".$fich;
 	 echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"javascript: OuvrirFenetre('$url');\">
     <img src='../images/style_file.jpg' width=20 height=20 border=0>$fich</a><br>";
   }
  }
 }
}
?>
Par contre, comment pour chaque répertoire appliquer le code ci-dessous lorsque l'utilisateur clique sur un lien, "gérer ce répertoire"
<?php
//initialisation de la session
session_start(session_name('administration'));

//fichier qui permet la connexion au serveur et l'accès aux fonctions
include('../includes/config.php');

//fichier de langue
require ('../includes/language/french/directory.php');

//début langage html
include ('../includes/header.php');

//on vérifie que l'utilisateur s'est bien identifié
//s'il s'agit d'un administrateur admin ou sadmin
if ((isset($_SESSION['admin'])) or (isset($_SESSION['sadmin'])))
{

  //on récupère tous les fichiers, qui sont dans le répertoire directory, 
  //on les stocke dans un tableau et on les affiche à l'écran
  if( (!isset($_POST['dirname_add'])) && (!isset($_POST['dirname_delete'])) )
  {
    //on définit la variable path
    $path = getcwd();
    //on appelle la fonction
    //list_dir($path);
  }


  //création d'un répertoire
  if(isset($_POST['dirname_add']))
  {
    $path = getcwd();
    $dirname = $_POST['dirname_add'];
    //on supprime les accents
    $dirname = strtr($dirname, "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ", "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy");
    mkdir_recursive($path.'/'.$dirname);
    //list_dir($path);
  }
  
  //suppression d'un répertoire
  elseif(isset($_POST['dirname_delete']))
  {
    $path = getcwd();
    $dirname = $_POST['dirname_delete'];
    //on supprime les accents
    $dirname = strtr($dirname, "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ", "AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy");    
    full_rmdir($path.'/'.$dirname);
    //list_dir($path);
  }  
?>
  
  
  <!-- formulaire de création d'un répertoire-->
  <form method="post" action="directory.php">
  <fieldset>
    <legend><? echo DIRECTORY_FORM_CREATE; ?></legend>
    <p><label for="dirname_add"><? echo DIRECTORY_NAME_CREATE; ?></label><input type="text" name="dirname_add" /></p>
    <p><input type="submit" name="valider" value="Créer le répertoire" /></p>
  </fieldset>
  </form>
  <!-- fin de formulaire de création de répertoire-->
  
<br />

  <!-- formulaire de suppression d'un répertoire-->
  <form name="suppr" method="post" action="directory.php" onSubmit="return confirmation();">
  <fieldset>
    <legend><? echo DIRECTORY_FORM_DELETE ?></legend>
    <p><label for="dirname_delete"><? echo DIRECTORY_NAME_DELETE; ?></label><input type="text" name="dirname_delete" /></p>
    <p><input type="submit" name="valider" value="Supprimer le répertoire" /></p>
  </fieldset>
  </form>
  <!-- fin de formulaire de suppression de répertoire-->
  
<br /><br />
  
<!-- formulaire pour retourner à l'accueil de l'admin-->
  <form method="post" action="../home.php">
  <fieldset>
  <legend><? echo DIRECTORY_RETURN_FORM; ?></legend>
  <p><input type="submit" name="retour" value="Retourner au menu d'administration" /></p>
  </fieldset>
  </form> 
  <!-- fin du formulaire de retour-->
<?	
}

//si la personne n'a pas le droit d'accéder à cette page
/*}
else
{
  header("Location: ../index.php"); //on l'a renvoi sur la page d'accueil
  exit();
}*/

//footer
include ("../includes/footer.php");
?>