[RESOLU] Afficher seulement les répertoires et sous répertoires d'une arborescence en PHP

Mammouth du PHP | 1967 Messages

15 janv. 2016, 15:57

Cela ça dépend de la configuration du serveur. mais je compterais pas trop la dessus, c'est assez changeant d'un hébergeur à l'autre et beaucoup trouvent que cela se rapproche plus d'une faille de sécurité que d'un comportement désirable.

A ta place, si ce n'est pas un affichage de TOUS les dossiers et sous-dossiers que tu recherche, je ferais plutôt un paramètre _GET pour ta variable $dossier (avec . comme valeur par défaut si c'est vide). Et construire les liens en conséquence
<style>
   <?php
      include 'css/style.css';
      include 'css/jqueryFileTree.css';
   ?>
</style>

<div id="explorateur">
   <header id="header">
      <input type="checkbox" name="toutCocher"/>
      <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/>
   </header>
   <div id="container_id">
      <?php
      //Nom du dossier à scanner
      $dossier = (empty($_GET['dossier'])) ? '.' : $_GET['dossier'];
      //scandir — Liste les fichiers et dossiers dans un dossier
      $tableau = scandir($dossier);
      //On boucle
      foreach($tableau as $valeur)
      {
         echo '<a href="NOM DU FICHIER?dossier='.$dossier.'/'.$valeur.'">'.$valeur.'</a><br/>';
      }   
      ?>
   </div>
</div>
Remplace bien NOM DU FICHIER par le nom du fichier dans lequel est ton script avec extension
Et je te garanti pas que ça marche mais tente le.
Il y aurait bien quelque garde fou encore à placer
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 161 Messages

15 janv. 2016, 16:32

Je vais essayé comme tu as fais mais si tu veux je viens d'essayer comme suivant et ça ne fonctionne pas (enfin disons que je n'ai que la case à cocher et le echo "Droits du fichier", sinon la boucle ne fonctionne pas :(

Code : Tout sélectionner

<style> <?php include 'css/style.css'; include 'css/jqueryFileTree.css'; ?> </style> <div id="explorateur"> <header id="header"> <input type="checkbox" name="toutCocher"/> <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/> </header> <div id="container_id"> <?php $dossier = '.'; $tableau = scandir($dossier); natcasesort($tableau); if(count($tableau)>2) { echo ' <table id="tableExplorer">'; echo ' <tr> <td> <input type="checkbox" name="checkbox"/> </td> <td> <ul class=\"jqueryFileTree\" style=\"display: none;\">'; foreach($tableau as $valeur) { if(file_exists($dossier . $valeur) && $valeur != '.' && $valeur != '..' && is_dir($dossier . $valeur)) { echo "<li class=\"directory collapsed\"><a href=\"#\" rel=\"" . htmlentities($valeur) . "/\">" . htmlentities($valeur) . "</a></li>"; } } foreach($tableau as $valeur){ if(file_exists($dossier . $valeur) && $dossier != '.' && $valeur != '..' && !is_dir($dossier . $valeur)){ $ext = preg_replace('/^.*\./', '', $valeur); echo "<li class=\"file ext_$ext\"><a href=\"#\" rel=\"" . htmlentities($valeur) . "\">" . htmlentities($valeur) . "</a></li>"; } } echo ' </ul> </td> <td> Droits fichier </td> </tr> </table>'; } ?> </div> </div>

Eléphant du PHP | 161 Messages

15 janv. 2016, 16:38

J'ai essayé avec que tu as ça n'a rien changé :/

Avatar du membre
Mammouth du PHP | 1609 Messages

15 janv. 2016, 17:19

Salut, quand tu génères le chemin du fichier pour tester si il existe, il faudrait peut être ajouter un / entre le . et le nom du fichier.
Dans file_exists($dossier . $valeur) avec $dossier = '.' et $valeur = 'nom_du_fichier' ça fait un file_exists('.nom_du_fichier') alors que tu veux faire un file_exists('./nom_du_fichier').
Développeur web depuis + de 20 ans

Eléphant du PHP | 161 Messages

16 janv. 2016, 23:45

Bonsoir à toutes et à tous, me revoilà avec mon problème !

Cette fois, j'ai réussi à intégrer dans mon code une boucle récursive mais le problème est que je n'arrive pas à ne lire que les fichiers, j'ai tenté pleins de trucs mais dès que je déplace un tout petit bout de la fonction ça ne va plus ! Donc c'est tout j'aurai voulu savoir comment faire pour y remédier et, savoir pourquoi j'ai également des checkboxs qui se placent n'importe comment.

Bonne soirée à tous !

Voici mon code :

Code : Tout sélectionner

<style> <?php include 'css/style.css'; include 'css/jqueryFileTree.css'; ?> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script> <script> <?php include 'js/checkall.js'; ?> </script> <div id="explorateur"> <header id="header"> <input type="checkbox" name="toutCocher" id="checkall"/> <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/> </header> <div id="container_id"> <?php function mkmap($dir){ echo ' <table id="tableExplorer"> '; $folder = opendir ($dir); while ($file = readdir ($folder)) { if ($file != "." && $file != "..") { $pathfile = $dir.'/'.$file; echo " <tr> <td> <input type=\"checkbox\" name=\"checkbox\"/> </td>"; echo " <td> <ul> <li> <a href=$pathfile>$file</a> </li>"; if(filetype($pathfile) == 'dir'){ mkmap($pathfile); } } echo " </ul> </td> "; } closedir ($folder); echo "</tr></table>"; } ?> <?php mkmap('.'); ?> </div> </div>

Avatar du membre
Mammouth du PHP | 1609 Messages

17 janv. 2016, 14:24

Répertoire ou fichier :
if(is_dir($pathfile))
  // répertoire
else
  // fichier
Sinon il y a un problème entre la récursivité de la fonction et le balisage html (un table qui vient se placer sous un li sans fermeture du ul). Peut être qu'en fermant le li après ces lignes (plutôt qu'avant) ça ira mieux :
if(filetype($pathfile) == 'dir'){               
  mkmap($pathfile);               
}
Développeur web depuis + de 20 ans

Eléphant du PHP | 161 Messages

18 janv. 2016, 10:58

Un ami est venu m'aider et j'ai corrigé.

Code : Tout sélectionner

<style> <?php include 'css/style.css'; include 'css/jqueryFileTree.css'; ?> </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script> <script> <?php include 'js/checkall.js'; ?> </script> <div id="explorateur"> <header id="header"> <input type="checkbox" name="toutCocher" id="checkall"/> <input type="button" name="valider" id="boutonValider" value="Mettre à jour"/> </header> <div id="container_id"> <?php getDirectory('../'); echo '<table id="tableExplorer">'; function getDirectory( $path = '../', $level = 0 ) { // Répertoires à ignorer $ignore = array( '.', '..' ); // Répertoire à ouvrir $dh = @opendir( $path ); // Boucler dans le répertoire : while( false !== ( $file = readdir( $dh ) ) ) { //Si ce fichier ne doit pas être ignoré alors... if( !in_array( $file, $ignore ) ) { // On effectue un espace pour une meilleure vue... $spaces = str_repeat('&nbsp;', ($level * 5 )); // Et on ne montre que les sous-répertoires ! if(is_dir( "$path/$file" ) ) { //On place dans une variable les droits de chaque répertoires que l'on appelera à chaque fois $perms = substr(sprintf('%o', fileperms($path)), -3); // On appelle à nouveau cette fonction dans les nouveaux répertoires de façon à ce que ce soit récursif. echo"<tr><td><ul><li id=\"arborescence\">$spaces<input type=\"checkbox\" name=\"checkbox\"/><a href=$path/$file><img src=\"/wordpress2/wp-content/plugins/DWPSecurity/icons/directory.png\" height=\"20\"/> $file</a><p>($perms)</p></li>"; getDirectory("$path/$file", ($level+1)); } } echo"</ul></td>"; } // Close the directory handle closedir( $dh ); echo "</tr>"; } echo '</table>'; ?> </div>