Itérateur de fichiers CSS
Tatane |
vendredi 21 octobre 2005 à 08:38 |
PHP |
#23 |
RSS
PHP5 inclus en natif dans la SPL, des Iterators.
En les dérivant nous pouvons alors lister les fichiers d'un répertoire trés facilement, voici ici un exemple qui permet de remonter tous les fichiers CSS d'un répertoire donné.
Parcours non récursif d'un répertoire
/** * Itérateur de fichiers CSS * * @author Stéphane MUNOS * @version 0.1 * @access public * */ class CssFilesIterator extends DirectoryIterator { public function isCss() { if( (!parent::isFile()) || (!preg_match('`\.(css)$`i', parent::getFilename())) ) { return false; } return true; } public function valid() { if (parent::valid()) { if (!$this->isCss()) { parent::next(); return $this->valid(); } return true; } return false; } }
Exemple d'utilisation de la classe :
require_once 'C_cssFilesIterator.php'; $O = new CssFilesIterator('../un_rep/un_rep_avec_des_css/'); while ($O->valid()) { echo $O->getFilename().'<br />'; $O->next(); }
Cet exemple ne renverra que les fichiers ayant pour extension ".css" du répertoire passé en paramètres, les fichiers d'un autre type seront totalement ignorés.
On peut maintenant aller plus loin en implémentant non plus DirectoryIterator mais en utilisant le recursiveDirectoryIterator.
La classe qui suit a été développé dans un but précis, la méthode getCss() renvoie un tableau du type suivant, destiné a remplir une liste de formulaire (select) :
array { [menu/ie/style_ie.css] = "/menu/ie/style_ie.css" [menu/ie/layout_ie.css] = "/menu/ie/layout_ie.css" [menu/firefox/style_ff.css] = "/menu/firefox/style_ff.css" [menu/firefox/layout_ff.css] = "/menu/firefox/layout_ff.css" [typo.css] = "/typo.css" [plan.css] = "/plan.css" [form.css] = "/form.css" }
Parcours récursif d'un répertoire
/** * Itérateur récursif de fichiers CSS * * @author Stéphane MUNOS * @version 0.1 * @access public * */ class CssFilesIteratorRecursive { private $iterator = false; private $directory = null; private $A_return = array(); public function __construct($directory) { $this->directory = $directory; $this->iterator = new recursiveDirectoryIterator($directory); } public function getCss($iterator = false) { if(!$iterator) { $iterator = $this->iterator; } while($iterator->valid()) { if($iterator->isDir() AND !$iterator->isDot()) { if($iterator->hasChildren()) { $this->A_return = array_merge($this->A_return, $this->getCss($iterator->getChildren())); } } else { if($iterator->isFile()) { $this->A_return[str_replace($this->directory, '',$iterator->getPathName())] = substr(str_replace(substr($this->directory,1,-1), '',$iterator->getPath()),1).'/'.$iterator->getFilename(); } } $iterator->next(); } return $this->A_return; } function valid() { if (parent::valid()) { if (!$this->isCss()) { parent::next(); return $this->valid(); } return true; } return false; } }
Exemple d'utilisation :
require_once 'C_cssFilesIteratorRecursive.php'; $O_css = new CssFilesIteratorRecursive('../un_rep_avec_des_sous_rep_css/); print_rn($O_css->getCss());
Conclusion
Cet exemple est bien sûr perfectible, mais il a l'avantage de pouvoir s'appliquer à n'importe quelle extension de fichiers.
On pourrait même enviseager de passer l'extension du type de fichier désiré en paramètre, afin d'avoir un Iterator beaucoup plus souple.

Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.