repertoire sous repertoire fichiers et sommaire

Eléphant du PHP | 123 Messages

31 mai 2010, 14:53

bonjour voila a partir d'un existant en php qui recupere des fichiers d'un dossier un sommaire est elaboré avec les liens des fichiers

la fonction qui nous interesse ici lis le dossier et prepare l ecriture du sommaire ( le table of contents)

mon but est de modifier la fonction pour qu elle puisse prendre les fichiers qui sont dans des sous dossiers mais je n y arrives pas pour le moment

voici donc la fonction en question:
function PrepareTOCData ($source, $types){//$type sont les types de fichier selectionnés ça marche et $source le chemin d acces du dossier

	global $docsTOC; //this array will contain the data for the html table of contents
	
	if (is_dir($source)){
		$dh = opendir($source);
		$n = 0;
		while($file = readdir($dh)){
			$info = pathinfo("$source/$file");
			if (!isset($info['extension']))
			
			{
			//echo"\n";echo 'ce repertoire ne contient pas que des fichiers ';
			
			$temp=$source;
			$source=$source.'/'.$file;
			echo "a";
			//echo var_dump($info['extension']);
			$n++;
			PrepareTOCData ($source, $types);
			
			
			}
			
			else
		{
			echo "b";
			$ext = $info['extension'];
			if (is_file("$source/$file") && in_array($ext, $types)){
				$docsTOC[$n] = array(	'Label' => $file, 
										'ObjectType' => 'Document',
										'LIBELLE' => $file, 
										'FILENAME' => $file, 
										'REF' => '-', 
										'INDMAJ' => '',
										'INDMIN' => '', 
										'DATEVERSION' => date("d/m/Y", filemtime("$source/$file")));
										}
				$n++;
			} // if
		} // while
		return true;
	}
	else
		return false;
	
	
} // function PrepareTOCData


j ai modifié la fonction d origine ici en rajoutant tout le if!isset et j ai ensuite ouvert un else et fermé avant le $n++ a la fin
sans succes alors que je croyais cela simple

Mammouth du PHP | 672 Messages

31 mai 2010, 15:10

Bonjour.

Tu as jeté un oeil sur la fonction glob ?

Dans les commentaires, tu trouveras des exemples de fonctions pour lister les fichiers des sous-répertoires...

Eléphant du PHP | 123 Messages

31 mai 2010, 15:15

je vais voir si je peux m en sortir avec ça et ce que j ai deja le but etant de ne pas refaire entierement l existant mais en lisant mon code voit tu de grosses erreurs ?

Eléphant du PHP | 123 Messages

31 mai 2010, 15:36

excusez moi mais en regardant soit je ne comprends pas soit je ne vois presque pas le rapport avec la question ( les types sont deja selectionnés) quelqu'un peut il m eclairer sur le sujet?

Mammouth du PHP | 672 Messages

31 mai 2010, 16:03

je vais voir si je peux m en sortir avec ça et ce que j ai deja le but etant de ne pas refaire entierement l existant mais en lisant mon code voit tu de grosses erreurs ?
La première erreur - à mon avis - c'est de te baser sur la présence (ou pas) d'une extension pour déterminer si tu as affaire à un dossier...
Pour ça, il y a is_dir().

La deuxième, c'est que tu modifies la valeur de $source en cours de route.
                     $temp=$source;
                        $source=$source.'/'.$file;
                        echo "a";
                        //echo var_dump($info['extension']);
                        $n++;
                        PrepareTOCData ($source, $types);
quand tu reprends ta boucle, la valeur de $source a changé...

Concernant glob() :
Ce commentaire a l'air de correspondre à ta demande.

Et tu peux trouver un commentaire qui parle des RecursiveDirectoryIterator.
Là encore, le premier commentaire te donne une réponse...

Eléphant du PHP | 123 Messages

01 juin 2010, 10:49

merci je penses utiliser recursive directory iterator j ai quelques sosucis pour trouver l equivalence de ceci
if (is_file("$source/$file") && in_array($ext, $types)){
				$docsTOC[$n] = array(	'Label' => $file, 
										'ObjectType' => 'Document',
										'LIBELLE' => $file, 
										'FILENAME' => $file, 
										'REF' => '-', 
										'INDMAJ' => '',
										'INDMIN' => '', 
										'DATEVERSION' => date("d/m/Y", filemtime("$source/$file")));
en iterateur par ce que j en manipule tres peu mais je sais que ça existe le tout est de garder un tableau de ce nom parce que c est une variable globale utilisée dans le "main" un peu partout donc en gros je dois trouver l equivalent de ça avec les recursive directory et là je me base sur le deuxieme code http://fr.php.net/manual/en/class.recur ... AAAFtHDQA= pour le parcours qui marche tres bien

Mammouth du PHP | 672 Messages

01 juin 2010, 12:13

1. Attention avec les itérateurs, ils ne sont disponibles que pour les dernières versions de PHP (>=5.1.3), et comme il n'y a pas de filtre sur le type de fichier, ça peut vite être gourmand...

2. En considérant que $source est le répertoire racine et $types un array contenant les extensions à chercher :

Code : Tout sélectionner

/* On crée un objet qui contiendra tous les fichiers contenus $source Par défaut il ne liste que les fichiers... Ca tombe bien ;-) */ $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source)); foreach ($iterator as $file) { /* Comme $file est forcément un fichier on n'a pas besoin de le tester on se contente de tester si l'extension de ce fichier est dans le tableau des extensions autorisées.  */     if (in_array ( pathinfo($file, PATHINFO_EXTENSION), $types) ) { // On construit $docsTOC "normalement"         $docsTOC[] = array(             'Label' => $file->getFilename(),             'ObjectType' => 'Document',             'LIBELLE' => $file->getBasename(),             'FILENAME' => $file->getBasename(),             'REF' => '-',             'INDMAJ' => '',             'INDMIN' => '',             'DATEVERSION' => date("d/m/Y", $file->getMTime() )         );     } }   

Eléphant du PHP | 123 Messages

01 juin 2010, 15:13

oki merci ça marche pas mal c est juste que pour filename il fallait utiliser getPathname ^^ et apres j aimerais si possible afficher le nom des dossiers sans faire forcement un lien mais c est optionnel mais si qqun sait le faire je ne suis pas contre

Eléphant du PHP | 123 Messages

02 juin 2010, 08:49

alors les gens j'ai bidouillé un peu la solution et j'ai trouvé donc ça donnes ça j ai peut etre compliqué pour rien il faut me le dire si c est le cas mais c est fonctionnel :
function PrepareTOCData ($source, $types){

	global $docsTOC;
	
	
	//$iterator2 = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source));
	$iterator = new RecursiveDirectoryIterator($source);
foreach ($iterator as $file ) {
	if (is_dir($file))
		{
		$docsTOC[] = array(
            'Label' => $file->getFilename(),
            'ObjectType' => 'Document',
            'LIBELLE' => $file->getBasename(),
            'FILENAME' => $file->getPathname(),
            'REF' => '-',
            'INDMAJ' => '',
            'INDMIN' => '',
            'DATEVERSION' => date("d/m/Y", $file->getMTime() )
        );
		
		$iterator2 = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($file));
			foreach ( $iterator2 as $file2 ) {
/* Comme $file est forcément un fichier on n'a pas besoin de le tester
on se contente de tester si l'extension de ce fichier est dans le tableau des extensions autorisées. 
*/
    if (in_array ( pathinfo($file2, PATHINFO_EXTENSION), $types) ) {
// On construit $docsTOC "normalement"
        $docsTOC[] = array(
            'Label' => $file2->getFilename(),
            'ObjectType' => 'Document',
            'LIBELLE' => $file2->getBasename(),
            'FILENAME' => $file2->getPathname(),
            'REF' => '-',
            'INDMAJ' => '',
            'INDMIN' => '',
            'DATEVERSION' => date("d/m/Y", $file2->getMTime() )
        );
    }
}
    }
	else
	{
	if (in_array ( pathinfo($file, PATHINFO_EXTENSION), $types) ) {
// On construit $docsTOC "normalement"
        $docsTOC[] = array(
            'Label' => $file->getFilename(),
            'ObjectType' => 'Document',
            'LIBELLE' => $file->getBasename(),
            'FILENAME' => $file->getPathname(),
            'REF' => '-',
            'INDMAJ' => '',
            'INDMIN' => '',
            'DATEVERSION' => date("d/m/Y", $file->getMTime() )
        );
	}
	}
	}
	// foreach ( $iterator2 as $file2 ) {
/* Comme $file est forcément un fichier on n'a pas besoin de le tester
on se contente de tester si l'extension de ce fichier est dans le tableau des extensions autorisées. 
*/
    // if (in_array ( pathinfo($file2, PATHINFO_EXTENSION), $types) ) {
// On construit $docsTOC "normalement"
        // $docsTOC[] = array(
            // 'Label' => $file2->getFilename(),
            // 'ObjectType' => 'Document',
            // 'LIBELLE' => $file2->getBasename(),
            // 'FILENAME' => $file2->getPathname(),
            // 'REF' => '-',
            // 'INDMAJ' => '',
            // 'INDMIN' => '',
            // 'DATEVERSION' => date("d/m/Y", $file2->getMTime() )
        // );
    // }
// }   
	
return true;	
}

ps a 9h44 c est pas si fonctionnel que ça parce que ce n est pas recursif si j ai un dossier qui contient des fichiers et un dossier qui contient a son tour des fichier et des dossiers il n affiche que les premiers dossiers j essai de changer ça mais je galere en fait quelqu un peut m aider :agenouille:

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 10:04

c'est
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($source), RecursiveIteratorIterator::SELF_FIRST);

Eléphant du PHP | 123 Messages

02 juin 2010, 10:09

peut tu m expliquer son fonctionnement parce qu ici en remplacant simplement la ligne j ai une erreur un peu bizarre
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Passed variable is not an array or object, using empty array instead' in C:\Program Files\EasyPHP-5.3.1\www\DataPackManager\actions\GenerateDataPack.php:212 Stack trace: #0 C:\Program Files\EasyPHP-5.3.1\www\DataPackManager\actions\GenerateDataPack.php(212): ArrayIterator->__construct('Z:\Users\Bastie...') #1 C:\Program Files\EasyPHP-5.3.1\www\DataPackManager\actions\GenerateDataPack.php(61): PrepareTOCData('Z:\Users\Bastie...', Array) #2 {main} thrown in C:\Program Files\EasyPHP-5.3.1\www\DataPackManager\actions\GenerateDataPack.php on line 212

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 10:19

ca va allé chercher tout les fichiers et tout les dossiers récursivement, le SELF_FIRST c'est pour allé dans les dossiers qu'il trouve

Eléphant du PHP | 123 Messages

02 juin 2010, 10:28

chez moi d'apres ce que j ai compris ça donne alors clairement ça mais je ne vois pas pourquoi j 'ai l'erreur bizarre en prenant en compte tout les cas
function PrepareTOCData ($source, $types){

	global $docsTOC;
	
	
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($source), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
if (is_dir($file))
{
/* Comme $file n'est pas  forcément un fichier on a  besoin de le tester
si s'en est un on se contente de tester si l'extension de ce fichier est dans le tableau des extensions autorisées. 
*/
    if (in_array ( pathinfo($file, PATHINFO_EXTENSION), $types) ) {
// On construit $docsTOC "normalement"
        $docsTOC[] = array(
            'Label' => $file->getFilename(),
            'ObjectType' => 'Document',
            'LIBELLE' => $file->getBasename(),
            'FILENAME' => $file->getPathname(),
            'REF' => '-',
            'INDMAJ' => '',
            'INDMIN' => '',
            'DATEVERSION' => date("d/m/Y", $file->getMTime() )
        );
    }
	}
	else
	{
	//on rentre le dossier dans le tableau aussi en enlevant quelques infos
	$docsTOC[] = array(
            'Label' => $file->getFilename(),
            'ObjectType' => 'Dossier',
            'LIBELLE' => $file->getBasename(),
            'FILENAME' => '',
            'REF' => '-',
            'INDMAJ' => '',
            'INDMIN' => '',
            'DATEVERSION' => date("d/m/Y", $file->getMTime() )
        );
	}
}   
	
return true;	
}

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 10:35

ton is_dir n'est pas bon, tu test si c'est un dossier mais tu mets le bloque pour le fichier,
fais :
$file->isFile()

ViPHP
ViPHP | 5462 Messages

02 juin 2010, 10:40

essayes comme ca
function PrepareTOCData($source, $types)
{
    global $docsTOC;
    
    $iterator     = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);
    
    foreach($iterator as $file)
    {
        $temp    = array('Label' => $file->getFilename(),
                        'ObjectType' => null,                    
                        'LIBELLE' => $file->getBasename(),
                        'FILENAME' => $file->getPathname(),
                        'REF' => '-',
                        'INDMAJ' => '',
                        'INDMIN' => '',
                        'DATEVERSION' => date("d/m/Y", $file->getMTime())
                        );
                        
        if ($file->isFile())
        {
            if (in_array(pathinfo($file, PATHINFO_EXTENSION), $types))
            {
                $temp['ObjectType'] = 'Document';
                $docsTOC[] = $temp;
            }
        }    
        else
        {
            $temp['ObjectType'] = 'Dossier';
            $temp['FILENAME'] = null;
            $docsTOC[] = $temp;
        }
    }      
    return true;   
}
Modifié en dernier par stealth35 le 02 juin 2010, 11:10, modifié 3 fois.