Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[Résolu]Balise utilisateur avec fonction récursive
#1
Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS : 1.7.0
#~ Version du MLE si existante : Nope
#~ Informations Système :
#~ ----------------------------------------------
#~ Cms Version: 1.7
#~ Installed Modules:
#~ * CMSMailer: 1.73.14
#~ * FileManager: 1.0.2
#~ * MenuManager: 1.6.2
#~ * ModuleManager: 1.3.3
#~ * News: 2.10.4
#~ * nuSOAP: 1.0.1
#~ * Printing: 1.0.4
#~ * Search: 1.6.2
#~ * ThemeManager: 1.1.1
#~ * TinyMCE: 2.6.5
#~ * FrontEndUsers: 1.8.2
#~ * CustomContent: 1.5.3
#~ * CGExtensions: 1.18.3
#~ * CGCalendar: 1.5.2
#~ * GCS: 0.0.1
#~ Config Information:
#~ * php_memory_limit:
#~ * process_whole_template: false
#~ * max_upload_size: 48000000
#~ * default_upload_permission: 664
#~ * assume_mod_rewrite: true
#~ * page_extension: /
#~ * internal_pretty_urls: false
#~ * use_hierarchy: true
#~ Php Information:
#~ * phpversion: 5.2.11
#~ * md5_function: On (Vrai)
#~ * gd_version: 2
#~ * tempnam_function: On (Vrai)
#~ * magic_quotes_runtime: Off (Faux)
#~ * E_STRICT: 0
#~ * memory_limit: 64M
#~ * max_execution_time: 10
#~ * safe_mode: Off (Faux)
#~ * session_save_path: Aucune vérification à cause de la restriction spécifiée par PHP open_basedir
#~ * session_use_cookies: On (Vrai)
#~ Server Information:
#~ * Server Api: apache2handler
#~ * Server Db Type: MySQL (mysql)
#~ * Server Db Version: 5.0.84
#~ ----------------------------------------------
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
Bonjour,

J'essaie d'avoir une balise qui me permet d'afficher tous les fichiers et sous dossiers d'un répertoire donné.
J'ai essayé avec ce code, que j'ai testé et qui fonctionne:

$path = $params['repertoire'];

$dir_handle = @opendir($path) or die("Unable to open $path");

list_dir($dir_handle,$path);

function list_dir($dir_handle,$path){
echo "<ul>";

while (false !== ($file = readdir($dir_handle))) {
$dir =$path.'/'.$file;
if(is_dir($dir) && $file != '.' && $file !='..' )
{
$handle = @opendir($dir) or die("undable to open file $file");
echo "<li><a href='$file'>$file</a></li>";
list_dir($handle, $dir);
}elseif($file != '.' && $file !='..')
{
echo "<li><a href='$file'>$file</a></li>";
}
}
echo "</ul>";
closedir($dir_handle);

}

Je ne comprends pas, avec cette balise, j'obtiens l'erreur :
Fatal error: Call to undefined function list_dir()
On ne peut pas avoir de fonction récursive dans une balise ? Je m'excuse d'avance au cas où j'ai manqué une évidence, mais je suis pas bien doué en php...
En fait, il me faut rien de très compliqué, mais je me dis que c'est quand même plus robuste avec une fonction récursive.

Merci !
#2
Il y a un plugin pour ça : http://dev.cmsmadesimple.org/projects/filelist
Il y en a peut-être encore d'autres.
Sinon, tu peux te baser sur ce code qui liste les images d'un répertoire :
Code :
global $gCms;
$dir = $gCms->config['root_path'] . DIRECTORY_SEPARATOR .'uploads/images/';
$url = './uploads/images/';
echo '<ul>';
// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
                     if ('file' == filetype($dir . $file)) {
echo "<li><a href=".$url.$file.'" rel="lightbox"><img src="'.$url.'thumb_'.$file.'" /></a>'."</li>\n";    
                    }
       }
       closedir($dh);
   }
}
echo '</ul>';
(il vient du wiki)

while($file = readdir($dh)) {
me paraît nettement plus propre que
while (($file = readdir($dh)) !== false) {

idem pour while (false !== ($file = readdir($dir_handle))) {
meilleur : while ($file = readdir($dir_handle)) {
#3
déclare ta fonction AVANT de l'appeler

Code :
function list_dir($dir_handle,$path){
    echo "<ul>";

    while (false !== ($file = readdir($dir_handle))) {
        $dir =$path.'/'.$file;
        if(is_dir($dir) && $file != '.' && $file !='..' )
        {
            $handle = @opendir($dir) or die("undable to open file $file");
            echo "<li><a href='$file'>$file</a></li>";
            list_dir($handle, $dir);
        }elseif($file != '.' && $file !='..')
        {
               echo "<li><a href='$file'>$file</a></li>";
        }
    }
    echo "</ul>";
    closedir($dir_handle);
  
}



$path = $params['repertoire'];
$dir_handle = @opendir($path) or die("Unable to open $path");
list_dir($dir_handle,$path);
#4
je cite



Citation :Contrairement à de nombreux autres langages, PHP nécessite que l'on définisse une fonction avant que celle-ci puisse être utilisée, car pour l'appeler dans le corps du programme il faut que l'interpréteur la connaisse, soit qu'il connaisse son nom, ses arguments et les instructions qu'elle contient.
#5
Merci ! j'ai mis la journée (ou presque) pour faire un code comme je voulais. Il fait une liste des fichiers et des dossiers depuis un point donné, avec les fichiers triés alphabétiquement.

Je vous le mets, au cas où. Si vous avez des remarques par rapport à la syntaxe, elles sont les bienvenues :

$dir = "./uploads/";
$depth = 0;

function iterate($dir, $depth) {
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
if ($handle = opendir($dir)) {
$arrayfile = array();
$arraydir = array();
while ($file = readdir($handle)) {
if ($file != '.' && $file !='..') {
$fullpath = $dir.'/'.$file;
if(is_dir($fullpath))
$arraydir[] = $file;
else
$arrayfile[] = $file;
}
}

if($arrayfile || $arraydir) {
echo '<ul class="file_list'.$depth.'">';
$depth=$depth+1;

if($arrayfile){
sort($arrayfile);
foreach ($arrayfile as $value) {
echo '<li class="file'.$depth.'"><a href="'.$dir.'/'.$value.'" target="_blank">'.$value.'</a></li>';
}
}
if($arraydir){
sort($arraydir);
foreach ($arraydir as $value) {
echo '<li class="directory'.$depth.'">'.$value.'</li>';
iterate($dir.'/'.$value, $depth);
}
}
}
echo '</ul>';
$depth=$depth-1;
}
}
}
}

iterate($dir, $depth);
#6
Un plus complet Wink
http://cyberzoide.developpez.com/php4/file/
résultat : http://cyberzoide.developpez.com/php4/file/test9.php3

Tu aurais aussi pu reprendre le code du gestionnaire de fichiers cmsms, quand j'y pense :lol:


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)