Premier pas avec spl, premier deboire

devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009 - 9 oct. 2009 à 10:52
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 15 oct. 2009 à 21:19
Bonjour à tous,

J'ai voulu me lancer à la spl ( soyons fou tiens) en commencant par DirectoryIterator.

voici une ancienne fonction que j'avais :
/** methode de parcours d'un dossier ou les rapports ont deja ete generées et dans lequel on ne cherche que des fichiers pdf ou doc , il suffit de mettre l'extension du fichier desiré en deuxieme arguement
* la methode retourne le listing des fichiers trouvés sous forme d'un tableau
**/
function AfficheFichier($sCheminVersRapportAEnvoyer,$sFiltre){
static $aMyArray=array();

if ($pDirectory = opendir($sCheminVersRapportAEnvoyer)) {// opendir nous renvoit un pointeur sur le dossier
// on initiliase

while (false !($sFile readdir($pDirectory))){

//je ne dois convertir que les fichiers .doc en .pdf car il se peut qu'il y ait des fichiers .pdf
//$sExtensionFile renvoit une chaine de carctere ie doc ou pdf ou jpg
$sExtensionFile=pathinfo($sFile,PATHINFO_EXTENSION);

if ($sFile != "." && $sFile != "..") {
if ($sExtensionFile == $sFiltre){
// for debug wb_message_box($window, $sFile,"fichier",WBC_INFO);
$aMyArray[]=$sFile;
}
}

}// fin du while
closedir($pDirectory);// je ferme le handle de manipulation du dossier qui contient les cartes ernt
return $aMyArray;
}else{
wb_message_box($window,'Listage des fichiers impossible','Répertoire illisible',WBC_INFO);
}
}


et voici avec DirectoryIterator :
//on etend la classe directoyinterator afin de creer une methode qui nous permettent de retourner l'extension d'un fichier **/
class MyDirectoryIterator extends DirectoryIterator implements Iterator {

public function GetExtensionOfFile(){

/** avec la spl plus besoin de passer la variable du nom de fichier à tester car on le recupere le fichier courant (parcourut par notre boucle foreach) avec la methode GetFileName()
* cette methode etant disponible dans la classe parente DirectoryIterator , on fait appel à elle par parent::getFilename()
**/
$sFilename = parent::getFilename();

//on commence par utiliser la methode isFile issue de la classe parente DirectoryIterator pour verifier que nous sommes bien en presence d'un fichier
if ( TRUE === parent::isFile($sFilename)){
//on recupere l'extension du fichier
$sExtensionFile=pathinfo($sFilename,PATHINFO_EXTENSION);
return $sExtensionFile;
}
}
}

/** fonction d'affichage du contenu d'un fichier avec la spl **/
function AfficheFichierWithSpl($sCheminVersRapportAEnvoyer,$sFiltre){
static $aMyArray=array();

foreach (new MyDirectoryIterator($sCheminVersRapportAEnvoyer) as $sValeurFile){

if(TRUE === $sValeurFile->isDot() ) // on supprime les dossiers donc . et ..
{
if ( $sFiltre === $sValeurFile->GetExtensionOfFile())
$aMyArray[] = $sValeurFile; // on ne recupere que les fichiers dont les extensions sont definies par $sFiltre ( doc ou pdf ou jpg et on les renvoit sous forme d'un tableau

}
}
return $aMyArray;
}

Mais voila ca ne marche pas et je n'ai aucun moyen de debuguer ca.

Quelqu'un peut il m'aiguiller.

ps : je commence juste avec la spl

5 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 oct. 2009 à 18:33
Salut,

Je vais faire un peu d'autopromo, une fois n'est pas coutume...
http://www.phpcs.com/codes/PHP5-LISTING-REPERTOIRE-AVEC-FILTRES_45125.aspx
Il s'agit d'un package de classes permettant de parcourir récursivement ou non un répertoire en filtrant les fichiers affichés en fonction de différents critères.

Je pense que tu ne cherches pas forcément un truc tout fait, puisque visiblement tu cherches à comprendre, et c'est très bien. Mais peut-être que justement, avoir des classes qui fonctionne déjà développées te permettra de mieux voir ce qu'il faut faire pour arriver au résultat attendu.
Si tu as d'autres questions après la consultation de cette source, n'hésite pas à les poser, j'y répondrai avec plaisir.

P.S. : Ca fait plaisir que quelqu'un passe de readdir() à DirectoryIterator :)
0
devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009
9 oct. 2009 à 18:56
Merci neige,

je vais essayer de digerer ton code qui est bien au dela d emon niveau.

deja je commence par quelques petites questions :

quand tu es parti directement de splfileinfo et non de directoryIterator, pourrais tu m'expliquer ton choix?

d'autre part des le debut , la documentation officielle fait reference à
DirectoryIterator extends SplFileInfo implements Iterator , Traversable , SeekableIterator

Donc je comprends pourquoi tu cree ta fonction getextension à partir de SplFileInfo ( tu reviens à la classe de base).

d'autre part n je ne comprends pas pourquoi j'ai ecris ceci ce matin
class MyDirectoryIterator extends DirectoryIterator implements Iterator
DirectoryIterator extends SplFileInfo implements Iterator d'apres la doc officielle donc rien que la j'ai fait une erreur.

A bientot des que j'aurais vraiment compris ton script et que je puisse t'en parler sur le bout des doigts
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 oct. 2009 à 20:11
Si tu as besoin de faire fonctionner quelque chose, ma source te permet d'avoir de quoi parcourir tes répertoires très facilement. L'utilisation est suffisament simple pour que n'importe qui puisse s'en servir.
Pour ce qui est de comprendre, évidemment, il faut un peu plus de "travail" quand on découvre juste la SPL. Mais pour ça, DirectoryIterator est un parfait exemple de la simplification que la SPL apporte aux codes qui l'utilisent. Sans parler de la limitation des erreurs généralement dûes à une mauvaise utilisation de readdir().

J'avais aussi posté un article sur mon blog dans lequel je détaillais la conception (le début tout au moins) de cette source (j'ai laissé trainer le lien dans la conclusion de la source). Ca devrait peut-être t'apporter quelques éclaircissements sur le fonctionnement général.

Mais comme je suis dans un bon jour (en fait, c'est surtout du prosélytisme pour la SPL), je vais faire un petit récapitulatif ici.

Comme tu peux le voir, j'ai plusieurs classes.
La classe centrale est XDir, c'est elle qui est manipulée par l'utilisateur. Cette classe étend FilterIterator et non pas DirectoryIterator, parce que j'avais besoin d'une classe qui filtre, ce que fait (en toute logique) FilterIterator. Le constructeur de FilterIterator prend en argument un itérateur : cet itérateur sur lequel on va appliquer les filtres. XDir simplifie la construction de FilterIterator en lui passant en argument un itérateur qui convient pour les dossiers : soit un DirectoryIterator, pour un parcours simple, soit un RecursiveIteratorIterator pour le parcours récursif. RecursiveIetratorIterator prend lui-même un itérateur récursif en argument (RecursiveDirectoryIterator en l'occurrence). Ca fait donc 3 itérateurs imbriqués les uns dans les autres, ce que XDir rend totalement transparent.

La classe XDirFileInfo étend SplFileInfo pour lui apporter de quoi simplifier un peu plus la vie de l'utilisateur, avec des méthodes qui me paraissent quasi indispensables comme getExtension() et isHidden(). La première, surtout, donne la vraie extension du fichier, de manière certaine. La plupart des codes trouvés sont ultra-simplistes et utilisent des fonctions qui retournent "htaccess" pour un fichier .htaccess, ce qui est erronné : htaccess est le nom du fichier, pas l'extension, puisqu'il n'en a pas, c'est juste un fichier caché. DirectoryIterator (et donc RecursiveDirectoryIterator) peut retourner une instance d'une classe spécifique lors du parcours des fichiers. Par défaut, c'est SplFileInfo. Ici, on utilise XDirFileInfo.

Enfin, XDirFilter est une classe abstraite étendue par tous les filtres. La méthode accept() est celle qui sera appelée par XDir pour savoir si le fichier doit être conservé ou pas (c'est à dire s'il passe ou non le filtre).

Le package utilise l'API de Reflexion de PHP5 pour vérifier que les filtres sont valides. Rien de bien compliqué là dedans, même si la doc sur l'API de Réflexion est particulièrement peu fournie : le code et les commentaires devraient suffire.

En fait, c'est assez simple, même si c'est un peu complexe : quelques classes, mais le fonctionnement n'a rien d'extra-ordinaire... XDir ne fait que faciliter l'instanciation de l'itérateur qu'on utilise pour parcourir le répertoire, les filtres sont assez élémentaires à utiliser/comprendre/écrire et XDirFileInfo n'apporte que deux méthodes supplémentaires à SplFileInfo. Cela dit, il est vrai que c'est du code qui n'a plus grand chose à voir avec du procédural, il est donc légitime que l'assimilation prenne un peu de temps.

Voilà voilà, en espérant que ça te sera utile, tout ça ;)
0
devcphp12 Messages postés 11 Date d'inscription jeudi 3 septembre 2009 Statut Membre Dernière intervention 29 octobre 2009
15 oct. 2009 à 21:16
Petite question neige d'hiver, les testes que je veux effectuer à savoir ne recuperer que les fichiers .doc et seulement des fichiers passent obligatoirement par la fonction isvalid().

Ai je tort ou raison?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
15 oct. 2009 à 21:19
Non, ils passent par la méthode accept(), qui est la méthode de FilterIterator() qui détermine si un fichier doit être conservé ou non par le filtre.
La méthode valid() (et pas isvalid()) indique à la boucle qui itère si l'élément suivant est un élément valide, donc s'il faut continuer ou pas d'itérer.

--
Neige

N'hésitez pas à lire la doc
0
Rejoignez-nous