begin process at 2012 02 15 23:34:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > GESTION DE FICHIERS AVEC LA SPL

GESTION DE FICHIERS AVEC LA SPL


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :POO, Classes, SPL, fichiers, dossiers Niveau :Initié Date de création :17/03/2009 Date de mise à jour :17/03/2009 09:28:08 Vu / téléchargé :2 870 / 131

Auteur : alphanono

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Voilà bien longtemps que je lis différentes choses à propose de la SPL dans ces pages et j'ai fini par retrousser mes manches et essayer de comprendre le fonctionnement de cet outil.
Déjà, pour ceux que ça intéresse d'en savoir plus, voilà un lien qui m'a bien aidé à démarrer : http://julien-pauli.developpez.com/tutoriels/php/s pl/
Dans cette source, rien de bien transcendant, de quoi établir un listing complet d'un dossier et de ses sous-dossiers (fichiers inclus), possibilité d'appliquer des filtres, d'en ressortir un arbre HTML des dossiers et fichiers ou un Array type listing de fichiers.
Cette source est très basique mais je ne souhaitais pas aller plus loin pour le moment car mes connaissances de la SPL datent d'hier. Il y aura certainement des choses à corriger d'abord puis des fonctions à ajouter ensuite.
Merci aux grands gourous de nous donner leur avis (Malalam, Neigedhiver, ...) sur cette source qui souhaite apporter un peu de fraîcheur avec la SPL.
Merci d'éviter les réflexions du genre 'il vaudrait mieux mettre les noms des méthodes en anglais', ... c'est pas le but ici, hein !

---------------------------
Utilisation de la class et des fonctions présentent :

//--> On crée l'instance de la classe
$fichiers = new utilitaireFichiers('./');

//--> On définit un peu le style de l'arbre HTML.
$fichiers->arbreFichierDebut = "<li class='{class}'>{fichier} <span class='taille'>({taille})</span>\n";

//--> On filtre les fichiers pour ne garder que ceux qui sont d'une extension .css
$fichiers->filtreExtensions("css",true);

//- -> On renvoie l'arbre HTML qui contient tous les dossiers mais seulement les fichiers css
echo $fichiers->arborescence();

//--> On reprend la liste complète
$fichiers->initListe();

//--> On ne sélectionne que les fichiers de type .js
$fichiers->filtreExtensions("js",true);

//--> On peut passer un deuxième filtre (ou plus). Ici pour n'afficher que les fichiers qui sont dans un dossier "module"
$fichiers->filtreRegExp("#/module/#i", 0, 0, 0, true);

//--> On récupère la liste des fichiers sous forme de tableau et on l'affiche pour contrôle
print_r($fichiers->arrayFichiers());

--- -------------------------------
A noter que j'utilise aussi ça pour la gestion de l'affichage de l'arbre :
$css  = "<style type='text/css'>\n";
$css .= "ul {padding:0 0 10px 16px}\n";
$css .= "li.dossier {font-weight:bold}\n";
$css .= "li.fichier {font-weight:normal}\n";
$css .= "li .taille {font-size: 0.8em}\n";
$css .= "</style>\n";

Source

  • <?php
  • /*****************************************************
  • /*
  • /* Class de gestion des fichiers
  • /* Cette class permet pour le moment de gérer une liste de dossiers/fichiers grâce à la SPL
  • /* On peut y appliquer des filtres par extension de fichier et des filtres personnalisés
  • /* On peut retourner un arbre des dossiers en HTML ou une liste des fichiers dans un Array
  • /*
  • /* Cette class est dans un état basique et chacun peut le modifier à son grée. Le principe c'est
  • /* que tout se passe en 3 temps
  • /* 1- On crée le pointeur principal et on récupère la liste complète des dossiers/fichiers
  • /* 2- On applique tous les filtres et les tris voulus
  • /* 3- On traite la liste obtenue, soit pour une récupération sous forme HTML, Array, ... , soit
  • /* pour appliquer des oppérations de suppression, renommage, ...
  • /*
  • /*****************************************************/
  • class utilitaireFichiers {
  • private $racine;
  • private $listeRacine;
  • private $listeSelect;
  • //--> Pour l'affichage de l'arbre HTML
  • public $arbreDossierDebut = "<ul>\n";
  • public $arbreDossierFin = "</ul>\n";
  • public $arbreFichierDebut = "<li>\n{fichier}\n";
  • public $arbreFichierFin = "</li>\n";
  • /**
  • * @brief création de la gestion des fichiers
  • * @param $_racine chemin absolu ou relatif vers le dossier à gérer
  • */
  • public function __construct($_racine){
  • $this->racine = $_racine;
  • $this->listeRacine = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->racine,RecursiveDirectoryIterator::KEY_AS_FILENAME), RecursiveIteratorIterator::SELF_FIRST);
  • $this->listeSelect = $this->listeRacine;
  • }
  • /**
  • * @brief gère l'affichage des dossiers/fichiers sous forme d'arbre avec les paramètres arbreDossierDebut, arbreDossierFin, arbreFichierDebut, arbreFichierFin
  • * @return renvoie un arbre au format HTML
  • */
  • public function arborescence(){
  • $arbo = $this->arbreDossierDebut;
  • $nivoAncien = $this->listeSelect->getDepth();
  • $typeAncien = "";
  • foreach ($this->listeSelect as $entry) {
  • $nivoActuel = $this->listeSelect->getDepth();
  • if($nivoActuel < $nivoAncien || ($entry->isDir() && $nivoActuel == $nivoAncien)){
  • $boucle = $nivoAncien - $nivoActuel;
  • if($typeAncien == "fichier") $boucle--;
  • for($i=0;$i<=$boucle;$i++){
  • $arbo .= $this->arbreDossierFin . $this->arbreFichierFin;
  • }
  • }
  • //--> Défini le type
  • $type = $entry->isDir() ? "dossier" : "fichier";
  • //--> Calcul des valeurs
  • $valeurs = array( "chemin" => $entry->getRealPath(),
  • "fichier" => $entry->getFilename(),
  • "taille" => $entry->getSize(),
  • "class" => $type
  • );
  • $chercher = array( "chemin" => "#{chemin}#i",
  • "fichier" => "#{fichier}#i",
  • "taille" => "#{taille}#i",
  • "class" => "#{class}#i"
  • );
  • //--> Création de la ligne d'affichage
  • $arbo .= preg_replace($chercher, $valeurs, $this->arbreFichierDebut) . "\n";
  • //--> Si c'est un dossier et qu'il a des enfants, on ajoute le code de début de dossier
  • if($type == "dossier" && $this->listeSelect->hasChildren()){
  • $arbo .= $this->arbreDossierDebut;
  • } else {
  • //--> Ajout de la fin de fichier
  • $arbo .= $this->arbreFichierFin;
  • }
  • //--> Enregistrement du nivo actuel et du type
  • $nivoAncien = $nivoActuel;
  • $typeAncien = $type;
  • }
  • $arbo .= $this->arbreDossierFin;
  • return $arbo;
  • }
  • /**
  • * @brief reprend la liste complète des dossiers/fichiers
  • */
  • public function initListe(){
  • $this->listeSelect = $this->listeRacine;
  • }
  • /**
  • * @brief filtrage des données ($this->listeSelect) avec une expression régulière. Possibilité de garder tous les dossiers
  • * @param $_regex expression régulière
  • * @param $_mode
  • * @param $_flags
  • * @param $_preg_flags
  • * @param $_preservDir Mettre à true pour ne pas filtrer les dossiers. Permet ainsi de garder la structure des dossiers tout en filtrant les fichiers.
  • */
  • public function filtreRegExp($_regex, $_mode = 0, $_flags = 0, $_preg_flags = 0, $_preservDir = false){
  • if($_preservDir){
  • $this->listeSelect = new RegexIteratorPreservDir($this->listeSelect, $_regex, $_mode, $_flags, $_preg_flags);
  • } else {
  • $this->listeSelect = new RegexIterator($this->listeSelect, $_regex, $_mode, $_flags, $_preg_flags);
  • }
  • }
  • /**
  • * @brief Filtre les fichiers par leurs extensions. Fonction de facilité qui utilise en réalité le système de tri par RegExp
  • * @param $_extensions Liste d'extensions séparées par des virgules. Ex: php,html,js
  • * @param $_preservDir Mettre à true pour ne pas filtrer les dossiers. Permet ainsi de garder la structure des dossiers tout en filtrant les fichiers.
  • */
  • public function filtreExtensions($_extensions, $_preservDir = false){
  • $extensions = explode(",", $_extensions);
  • $exp = "#\.(" . implode("|", $extensions) . ")$#i";
  • $this->filtreRegExp($exp, 0, 0, 0, $_preservDir);
  • }
  • /**
  • * @brief fonction qui renvoie la liste des fichiers sous forme d'array
  • * @return Array contenant la liste des chemins complets des fichiers
  • */
  • public function arrayFichiers(){
  • $fichiers = array();
  • foreach ($this->listeSelect as $entry){
  • if($entry->isFile()){
  • $fichiers[] = $entry->getRealPath();
  • }
  • }
  • return $fichiers;
  • }
  • }
  • /**
  • * @brief Class redéfinissant RegexIterator pour gérer la préservation des dossiers
  • */
  • class RegexIteratorPreservDir extends RegexIterator {
  • public function __construct($_it, $_regex, $_mode = 0, $_flags = 0, $_preg_flags = 0){
  • parent::__construct($_it, $_regex, $_mode, $_flags, $_preg_flags);
  • $this->regex = $_regex;
  • $this->flags = $_flags;
  • $this->mode = $_mode;
  • $this->preg_flags = $_preg_flags;
  • }
  • /**
  • * @brief On garde la fonction de base mais on ajoute la condition if($this->current->isDir())
  • */
  • public function accept(){
  • $matches = array();
  • $this->key = parent::key();
  • $this->current = parent::current();
  • if($this->current->isDir()){
  • return true;
  • } else {
  • $subject = ($this->flags & self::USE_KEY) ? $this->key : $this->current;
  • switch($this->mode){
  • case self::MATCH:
  • return preg_match($this->regex, $subject, $matches, $this->preg_flags);
  • case self::GET_MATCH:
  • $this->current = array();
  • return preg_match($this->regex, $subject, $this->current, $this->preg_flags) > 0;
  • case self::ALL_MATCHES:
  • $this->current = array();
  • return preg_match_all($this->regex, $subject, $this->current, $this->preg_flags) > 0;
  • case self::SPLIT:
  • $this->current = array();
  • preg_split($this->regex, $subject, $this->current, $this->preg_flags) > 1;
  • case self::REPLACE:
  • $this->current = array();
  • $result = preg_replace($this->regex, $this->replacement, $subject);
  • if ($this->flags & self::USE_KEY){
  • $this->key = $result;
  • } else {
  • $this->current = $result;
  • }
  • }
  • }
  • }
  • }
  • ?>
<?php

/*****************************************************
/*
/* Class de gestion des fichiers
/* Cette class permet pour le moment de gérer une liste de dossiers/fichiers grâce à la SPL
/* On peut y appliquer des filtres par extension de fichier et des filtres personnalisés
/* On peut retourner un arbre des dossiers en HTML ou une liste des fichiers dans un Array
/*
/* Cette class est dans un état basique et chacun peut le modifier à son grée. Le principe c'est 
/* que tout se passe en 3 temps
/* 1- On crée le pointeur principal et on récupère la liste complète des dossiers/fichiers
/* 2- On applique tous les filtres et les tris voulus
/* 3- On traite la liste obtenue, soit pour une récupération sous forme HTML, Array, ... , soit
/* pour appliquer des oppérations de suppression, renommage, ...
/*
/*****************************************************/

class utilitaireFichiers {
	
	private $racine;
	private $listeRacine;
	private $listeSelect;
	
	//--> Pour l'affichage de l'arbre HTML
	public $arbreDossierDebut	= "<ul>\n";
	public $arbreDossierFin		= "</ul>\n";
	public $arbreFichierDebut	= "<li>\n{fichier}\n";
	public $arbreFichierFin		= "</li>\n";
	
	/**
	 * @brief création de la gestion des fichiers
	 * @param $_racine chemin absolu ou relatif vers le dossier à gérer
	 */
	public function __construct($_racine){
		$this->racine 		= $_racine;
		$this->listeRacine 	= new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->racine,RecursiveDirectoryIterator::KEY_AS_FILENAME), RecursiveIteratorIterator::SELF_FIRST);
		$this->listeSelect 	= $this->listeRacine;
	}
	
	/**
	 * @brief gère l'affichage des dossiers/fichiers sous forme d'arbre avec les paramètres arbreDossierDebut, arbreDossierFin, arbreFichierDebut, arbreFichierFin
	 * @return renvoie un arbre au format HTML
	 */
	public function arborescence(){
		$arbo 		= $this->arbreDossierDebut;
		$nivoAncien	= $this->listeSelect->getDepth();
		$typeAncien	= "";
		foreach ($this->listeSelect as $entry) {
			$nivoActuel = $this->listeSelect->getDepth();
			if($nivoActuel < $nivoAncien || ($entry->isDir() && $nivoActuel == $nivoAncien)){
				$boucle = $nivoAncien - $nivoActuel;
				if($typeAncien == "fichier") $boucle--;
				for($i=0;$i<=$boucle;$i++){
					$arbo .= $this->arbreDossierFin . $this->arbreFichierFin;
				}
			}
			//--> Défini le type
			$type = $entry->isDir() ? "dossier" : "fichier";
			//--> Calcul des valeurs
			$valeurs = array(	"chemin" 		=> $entry->getRealPath(),
							 	"fichier"		=> $entry->getFilename(),
								"taille"		=> $entry->getSize(),
								"class"			=> $type
							);
			$chercher = array(	"chemin" 		=> "#{chemin}#i",
							 	"fichier"		=> "#{fichier}#i",
								"taille"		=> "#{taille}#i",
								"class"			=> "#{class}#i"
							);
			//--> Création de la ligne d'affichage
			$arbo .= preg_replace($chercher, $valeurs, $this->arbreFichierDebut) . "\n";
			
			//--> Si c'est un dossier et qu'il a des enfants, on ajoute le code de début de dossier
			if($type == "dossier" && $this->listeSelect->hasChildren()){
				$arbo .= $this->arbreDossierDebut;
			} else {
				//--> Ajout de la fin de fichier
				$arbo .= $this->arbreFichierFin;
			}
			//--> Enregistrement du nivo actuel et du type
			$nivoAncien = $nivoActuel;
			$typeAncien = $type;
		}
		$arbo .= $this->arbreDossierFin;
		
		return $arbo;
	}
	
	/**
	 * @brief reprend la liste complète des dossiers/fichiers
	 */
	public function initListe(){
		$this->listeSelect = $this->listeRacine;
	}
	
	/**
	 * @brief filtrage des données ($this->listeSelect) avec une expression régulière. Possibilité de garder tous les dossiers
	 * @param $_regex expression régulière
	 * @param $_mode
	 * @param $_flags
	 * @param $_preg_flags
	 * @param $_preservDir Mettre à true pour ne pas filtrer les dossiers. Permet ainsi de garder la structure des dossiers tout en filtrant les fichiers.
	 */
	public function filtreRegExp($_regex, $_mode = 0, $_flags = 0, $_preg_flags = 0, $_preservDir = false){
		if($_preservDir){
			$this->listeSelect = new RegexIteratorPreservDir($this->listeSelect, $_regex, $_mode, $_flags, $_preg_flags);
		} else {
			$this->listeSelect = new RegexIterator($this->listeSelect, $_regex, $_mode, $_flags, $_preg_flags);
		}
	}
	
	/**
	 * @brief Filtre les fichiers par leurs extensions. Fonction de facilité qui utilise en réalité le système de tri par RegExp
	 * @param $_extensions Liste d'extensions séparées par des virgules. Ex: php,html,js
	 * @param $_preservDir Mettre à true pour ne pas filtrer les dossiers. Permet ainsi de garder la structure des dossiers tout en filtrant les fichiers.
	 */
	public function filtreExtensions($_extensions, $_preservDir = false){
		$extensions = explode(",", $_extensions);
		$exp		= "#\.(" . implode("|", $extensions) . ")$#i";
		$this->filtreRegExp($exp, 0, 0, 0, $_preservDir);
	}
	
	/**
	 * @brief fonction qui renvoie la liste des fichiers sous forme d'array
	 * @return Array contenant la liste des chemins complets des fichiers
	 */
	public function arrayFichiers(){
		$fichiers = array();
		foreach ($this->listeSelect as $entry){
			if($entry->isFile()){
				$fichiers[] = $entry->getRealPath();
			}
		}
		return $fichiers;
	}
	
}


/**
 * @brief Class redéfinissant RegexIterator pour gérer la préservation des dossiers
 */
class RegexIteratorPreservDir extends RegexIterator {
    public function __construct($_it, $_regex, $_mode = 0, $_flags = 0, $_preg_flags = 0){
        parent::__construct($_it, $_regex, $_mode, $_flags, $_preg_flags);
		$this->regex 		= $_regex;
		$this->flags 		= $_flags;
		$this->mode 		= $_mode;
		$this->preg_flags 	= $_preg_flags;
    }
	
	/**
	 * @brief On garde la fonction de base mais on ajoute la condition if($this->current->isDir())
	 */
	public function accept(){
		$matches       = array();
		$this->key     = parent::key();
		$this->current = parent::current();
		if($this->current->isDir()){
			return true;
		} else {
			$subject = ($this->flags & self::USE_KEY) ? $this->key : $this->current;
			switch($this->mode){
				case self::MATCH:
					return preg_match($this->regex, $subject, $matches, $this->preg_flags);
			
				case self::GET_MATCH:
					$this->current = array();
					return preg_match($this->regex, $subject, $this->current, $this->preg_flags) > 0;
			
				case self::ALL_MATCHES:
					$this->current = array();
					return preg_match_all($this->regex, $subject, $this->current, $this->preg_flags) > 0;
			
				case self::SPLIT:
					$this->current = array();
					preg_split($this->regex, $subject, $this->current, $this->preg_flags) > 1;
			
				case self::REPLACE:
					$this->current = array();
					$result = preg_replace($this->regex, $this->replacement, $subject);
					if ($this->flags & self::USE_KEY){
						$this->key = $result;
					} else {
						$this->current = $result;
					}
			}
		}
	}
}

?>

 Conclusion

Quelques heures à étudier le fonctionnement de la SPL et déjà un bout de code fonctionnel. C'était pas si méchant que ça ... Je pense en avoir saisie une bonne partie. Pour le reste, des erreurs de fonctionnement sont peut-être à relever dans ce code. Merci aux experts de nous éclairer.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

17 mars 2009 09:28:09 :
Correction de caractères qui ne passent pas dans ces formulaires.

 Sources de la même categorie

UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
FONCTION RECURSIVE DE DOSSIERS par tefa24600
Source avec Zip CONVERSION DES UNITÉS INFORMATIQUE (O, KIO, MIO, GIO, TIO...... par genetApt151
TROUVER LES DOUBLONS DANS UNE LISTE DE FICHIERS par soobook

 Sources en rapport avec celle ci

Source avec Zip SURCHARGE DE LA CLASSE RECURSIVEDIRECTORYITERATOR POUR RÉCUP... par Astalavista
Source avec Zip HASHMAP EN PHP AVEC LA SPL par dorian91
EXPLORATEUR FTP SUR 2 NIVEAUX par viki53
Source avec Zip Source avec une capture FILTRER, METTRE EN CACHE OU MAPER, OU TRIER UN ITERATEUR par coucou747
Source avec Zip DBOC 1.6 [PHP5] par Morphinof

Commentaires et avis

Commentaire de neigedhiver le 17/03/2009 12:02:34

Salut,

Bon alors le premier bon point, c'est que tu me considère comme un grand gourou... Je sais pas si c'est objectivement vrai, mais ça fait plaisir d'être flatté de la sorte... Avant même de regarder la source, tu pars avec un bonus ^^

Bon plus sérieusement... J'ai pas la possibilité, là, de regarder bien en détails (un eeePC c'est pratique, mais c'est petit, et pour développer, y'a mieux...).

Autre bon point, la volonté d'utiliser des itérateurs et la SPL pour lister des fichiers. Ca, vraiment, ça fait chaud au coeur.

Bon mon commentaire va pas apporter grand chose, mais il me permmettra au moins de suivre les futurs commentaires (ouais, égoïstement...) et donc de ne pas oublier de regarder la source en détails quand je serai de retour dans ma campagne (faut pas hésiter à me le rappeler, même, je devrais 'normalement' être rentré ce week end).

Bon alors un petit point négatyif, ce serait bien de mettre les noms des méthodes en anglais (wouah la blague !). Non j'déconne, on s'en tape là (pardon, c'est pas drôle, mais je suis fatigué).

Plus sérieusement à nouveau, j'aime moyennement ce que ta classe produit en sortie. Ca me semble fait proprement, mais j pense qu'on peut faire mieux : séparer la sortie du traitement. Ouais, parce qu'en plus, j'aime bien le design pattern MVC qui consiste (entre autres) à séparer le traitement de l'affichage. Là, tu sors du HTML (ou du XHTML, peu importe). L'idée est que si tu veux afficher ta liste dans un fichier texte, en XML, même avec les quelques propriétés qui permettent de mettre en forme ton texte, ça peut ne pas suffire (mais bon, j'ai qu'un peu survolé, alors je me trompe peut-être...).

Bref... Excellente initiative en tout cas !

Commentaire de malalam le 17/03/2009 20:01:43 administrateur CS 10/10

Hello,

à moi, donc...

Le premier bon point, c'est que tu me considères comme un grand gourou...(ouais je sais???guère original).
Le premier mauvais point, c'est que tu me places au même niveau que Neige, alors que, franchement, je suis quand même très nettement meilleur...tss...;-)

Après les plaisanteries d'usage initiées par Neige, quelques éléments. je n'ai pas non plus beaucoup de temps, mais moi c'est parce que demain je me lève à 4h, et que je suis déjà fatigué d'avance rien que d'y penser. Tout ça pour un déplacement pro. Pff.

C'est pas mal! Donc. J'ai du mal à analyser ta méthode arborescence qui à première vue me semble un peu compliquée pour un truc qui construit une arbo à partir d'un itérateur récursif. Mais je n'ai pas le temps d'approfondir, donc...je m'abstiens d'en dire plus. En fait un peu plus quand même :-)...il aurait été intéressant, comme le souligne Neige, de permettre une sortie différente. Et comme tu sors une arbo de toute manière, tu aurais encore pu faire une classe de templating léger basée sur la SPL :-) Ou si tu veux te mettre à autre chose, à du XML et des XSL, très sympa aussi.
Tu utilises RegexIterator, ce qui est très bien! Mais, pour faire encore mieux, tu aurais pu le coupler avec un FilterIterator, puisque tu fais des filtres. Ca aurait donc fait une 3ème classe.

Sinon, franchement...c'est propre, c'est clair, c'est commenté, et moi j'aime bien ta norme de nommage des méthodes, propriétés etc. Fut-ce du français :-) Non, c'est très bien le français...sûr, quand on bosse à l'international ou qu'on veut partager à l'international un code, l'anglais c'est mieux; mais je ne crois pas que ce soit ton cas.
L'anglais a aussi l'avantage de, bien souvent, réduire le nombre de caractères à taper pour obtenir des noms explicites, c'est surtout pour ça que j'aime bien l'utiliser même dans des projets cantonnés à mon taf, pour mon taf, visibles uniquement par mes développeurs (français...marocains aussi mais bon...ils sont meilleurs en français qu'en anglais globalement!).

Bon taf, Alphanono (ah oui, mauvais point : c'est QUOI ce pseudo???? :-p)

Sinon, ça va, Olivier ? :-)

Commentaire de malalam le 17/03/2009 20:04:05 administrateur CS

Ah, juste: concernant ta méthode arborescence et la sortie...c'est bien, là-dessus que j'appuie : ta méthode est compliquée, à priori, parce que tu veux reproduire l'arbo dans une liste HTML. Avec une classe de sortie dédiée ET SPLisée, je pense que tu peux obtenir un truc beaucoup plus puissant, plus souple, ET alléger du même coup ta méthode arborescence (au détriment d'une nouvelle classe plus complexe hein...mais aussi plus puissante).
Vlà.

Commentaire de alphanono le 17/03/2009 21:32:01

Salut les boss ! Je vois que ça réagit, ça fait plaisir. Bon, si ça peut vous faire désenfler, j'aurais pû ajouter à la liste des gourous Coucou747 ou Codefalse par exemple mais je vais m'arrêter là sous peine de faire des jaloux ! ;) Je ne sais pas si le terme de gourou vous convient mais en ce qui me concerne, je suis autodidacte, formé par vos soins sur ce site, à l'insu de votre plain gré. Vos interventions toujours bien avisées transforment les classes basiques en de véritables mines d'informations (sur ce qu'il ne faut pas faire en général, ou sur comment mieux faire)
Pour mon pseudo, désolé mais Malalam était déjà pris ... j'ai fait avec ce qu'il restait ! ;-)

Bon, pour en revenir à la source, je vois que vous avez un peu de mal tous les 2 avec la partie arborescence en HTML. C'est vrai que côté MVC, l'idéal serait de sortir cette fonction ; en tout cas, comme ça, ça a le mérite de ne pas avoir à passer par x classes externes pour sortir l'info qui peut être gérée ici. Je dois bien dire que 'dans la vraie vie', j'utilise une classe pour gérer les arborescences graphiques. Je lui transmets un Array organisé spécialement pour ça et il en ressort une arbo HTML. Mais tout ça est un petit peu lourd à placer ici (et j'ai pas non plus envie d'y mettre toutes mes sources ;-) Avec ce que je propose ici, c'est déjà presque un micro moteur de template puisque je génère des variables qui vont pouvoir être insérées dans les <ul><li> (qu'on peut d'ailleurs remplacer par des <div>, <span>, ...)
Par contre, ta proposition de gérer ça avec la SPL m'intéresse. Il faudrait que je regarde ça de plus prêt. En fait j'utilise pas mal de classes perso dont je me rend compte qu'elles sont déjà développées par la SPL. J'ai notamment développé une class que j'ai appellée 'gestion des hierarchies' et qui ne fait rien d'autre que ce que font les classes Iterator (sauf qu'Iterator est plus complet !)

Bon, ma function actuelle de création de l'arborescence peut paraître un peu compliquée parceque j'essaie de gérer tous les cas. Genre on ouvre un <ul> pour un dossier et il faut ensuite le refermer avec un </ul> quand on a fini de lister le dossier puis fermer la ligne <li> qui contenait ce dossier avec </li>. Seulement, il ce peut qu'on ferme plusieurs dossiers à la suite. On va donc se retrouver avec une suite de </ul></li></ul></li></ul></li>. Et c'est ça qui prend quelques lignes dans la fonction.
Le problème vient peut-être du fait que, merci la SPL, l'arborescence qui nous est livrée est ordonnée de façon parfaitement linéaire pour ce qu'on veut en faire. Les fichiers et les dossiers ne sont pas mêlangés, il suffit de parcourir l'objet avec un foreach et de suivre tout naturellement l'ordre donné. J'ai donc utilisé cette facilité mais peut-être faudrait-il prendre en compte un fonctionnement moins linéaire ? Mais dans ce cas, je ne vois pas vraiment comment faire ... ?!

Bon, j'arrête pour ce soir, il y a déjà de quoi lire ;) Merci pour vos commentaires, je vais voir ce que je peux en faire !

Commentaire de codefalse le 18/03/2009 15:05:52 administrateur CS

Que dire ! Pas mal de choses ont déjà été mentionnée.
Je voulais ajouter un malus parce que mon pseudo était pas mentionné, mais tu te rattrape dans ton dernier message ... mais j'hésite quand même ... bon ok je blague :p

Pour ce qui est du MVC, je rejoint Neige et Malalam. Tu parle ensuite qu'en général, tu boucle sur un array.
J'aimerai juste mentionner que je commence à voir les tableaux comme de la peste. Surtout sur une structure ou tu ne peux pas gérer la taille du tableau.
Si le dossier contient 5 fichiers, ca va pas être méchant. En revanche, si ton dossier en possède des milliers/millions, tu risque d'avoir des problèmes de mémoire.

La spl te fournit une itération à la volée, pourquoi ne pas en profiter ?
Pourquoi parcourir (boucler) le dossier pour mettre le contenu dans un tableau, et ensuite re-boucler sur ce tableau pour afficher le contenu ?

Si, en tant que moteur de template, tu utilise php (ce que je fait, car à l'origine, php à été réalisé pour faire office de moteur de template, ndlr), tu peux passer un objet qui implémente iterator et qui parcours le dossier.

Par exemple tu peux instancier tout ton système est passer ton objet à ton moteur de template. Ou si tu veux rajouter des restrictions, tu peux faire une classe spécifique pour ton moteur de template, et passer un objet iterator (__construct (iterator $oTonObjet)) afin que quand tu boucle sur la classe spécifique, celle ci bouclera sur l'objet donné dans le constructeur.
Ca à l'avantage d'être générique (itérateur pour un dossier, pour un contenu de fichier (par lignes), contenu d'une base de donnée, etc, etc, etc).

En tout cas très bon travail. L'intérêt que tu montre à la SPL montre tout simplement que tu te tiens à jour (la SPL n'est là que depuis PHP 5.2), et que tu ne nous ponds pas des classes en php 4 :p

Commentaire de neigedhiver le 18/03/2009 17:36:23

@Malalam : Ca va, et toi ? C'est pas facile de communiquer avec toi ;) Dernière fois que j'ai essayé de t'appeler, j'ai pas réussi (et pourtant j'avais une bonne excuse, c'était ton anniv...)

@Codefalse : Pour ce qui est de l'ancienneté de la SPL, tu te trompes un peu... Elle est compilée par défaut depuis PHP5.0. Depuis PHP5.3, elle ne peut pas être désinstallée. Et avant PHP5? la SPL était disponible comme extension PECL : http://pecl.php.net/package/SPL

Voilà, c'est tout ce que j'ai à rajouter pour le moment :).

Ah non, dernière chose... Ca fait vraiment plaisir de savoir que certaines personnes lisent quand même nos commentaires, nos longues discussions et interminables débats à l'occasion de sources de qualité variables, et en tirent des enseignements positifs... Ca conforte dans l'idée que les longues discussion parfois hors-sujet ne sont jamais vaines :)

Commentaire de astro53 le 23/03/2009 07:38:35

Salut, heureusement que j ai plus de 20 minutes pour regarder ce site sinon je n aurais pas eu le temps de tout lire...
Moi j ai fais un bon en php il y a tout juste 1 mois peut etre moins en apprenant l'existence de la POO... Je ne savais rien encore la dessus auparavant. Et j ai lu beaucoup de tutoriaux sur le sujet. Et je n avais pas encore compris que les iterators pouvais servir a une arborescence et je vais de ce pas visiter ce lien sur la SPL...Merci a vous pour vos codes et commentaires judicieux. Je n ai pas encore ecris de source en PHP (seulement en Javascript). J'espere reussir un jour a ecrire de belles sources comme celle-ci.

PS:Je m excuse pour toutes les fautes d ortographe que je peux faire...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Sécurité-fichiers-dossiers [ par stageSAP ] Bonjour,Pour mon site, je protège l'accès aux pages grâce aux variables de sessions et cela marche très bien. Je travaille en local pour l'instant. Su effacer tous les fichiers et dossiers a la racine d un site [ par Teclis01 ] Je crois que tout est dans le titre.Je suis decu de free je ne peux plus acceder a mon ftp je peux seulement acceder a mon site en passant par un navi Tri de fichiers par date [ par Clem ] Comment trier dans l'orde du plus nouveau au plus vieux, des dossiers ?J'ai trouvé pour afficher les dossiers :&lt;?$rep=opendir('.');while ($file = r logiciel POO [ par kowal2205 ] Je me pose la question de la cr&#233;ation de mes classes dans un projet de taille moyenne car je ne trouve pas de logiciel &#224; mon pied qui me per PHP5 -> SPL , tri sur DirectoryIterator [ par stailer ] Bonjour, J'utilise la classe DirectoryIterator pour lister tous les répertoires et fichiers d'un chemin. Grâce à isFile je peux lister uniquement les Mettre en ligne une arborescence de dossiers et de fichiers [ par hkpsyco974 ] Bonjour tout le monde, je ne sais pas si mon post est bien placé, désolé si ce n'est pas le cas...Mon problème :L'endroit ou je travaille est un cabin premier pas avec spl, premier deboire [ par devcphp12 ] Bonjour à tous, J'ai voulu me lancer à la spl ( soyons fou tiens) en commencant par DirectoryIterator. voici une ancienne fonction que j'avais : /** CHMOD [ par flaydeer ] Salut, Un peu de mal a suivre sur le chmod, que faut il mettre alors concrètement sur les droits des dossiers et fichiers. Par exempl: j'ai un doss afficher une liste de dossiers et de fichiers sous forme d'arborescence en php [ par boubou2412 ] Bonjour,j'ai un petit probléme concernat l'affichage dans ma page web et j'aimerais bien que vous m'aidez.Bref le probléme quej'ai plusieurs volet et Lister un folder et adapter un lien sur les fichiers de ce folder. [ par ecolom ] BOnjour les Z'amis ( amies) [^^happy13] , J'ai plusieurs document, doc, pdf, txt,msg qui se trouve sur un serveur. J'ai trouvé un code sur le net qui


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,747 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales