Orange73
Messages postés1375Date d'inscriptiondimanche 28 novembre 2004StatutMembreDernière intervention 2 août 2011
-
23 avril 2009 à 11:14
cs_robinou
Messages postés31Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention22 décembre 2009
-
22 déc. 2009 à 23:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_robinou
Messages postés31Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention22 décembre 2009 22 déc. 2009 à 23:03
je suis une grosse bouse, désolé, tout baigne ... joyeuses fêtes
cs_robinou
Messages postés31Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention22 décembre 2009 22 déc. 2009 à 22:57
Salut neigedhiver
J'utilise ton code mais erreur si un des répertoires est vide
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 27 mai 2009 à 14:51
Y'a vraiment pas besoin d'autant de lignes de code pour parcourir récursivement un répertoire... Exemple fait à l'arrache (mais qui fonctionne) :
<?php
class MyDir extends RecursiveIteratorIterator {
public function __construct($directory) {
$it = new RecursiveDirectoryIterator($directory);
parent::__construct($it, RecursiveIteratorIterator::SELF_FIRST);
}
}
Après, ça devient intéressant quand on commence à s'intéresser aux filtres et à la mise en forme du bazar produit. Mais la base est là.
seyvapul
Messages postés39Date d'inscriptionvendredi 15 juillet 2005StatutMembreDernière intervention 4 juin 2017 27 mai 2009 à 14:43
Merci, je vais voir cela très vite, je sens que je vais gagner du temps.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 27 mai 2009 à 14:37
Pour faire un parcours tout simple de répertoires, autant utiliser une classe étendue de DirectoryIterator avec RecursiveDirectoryIterator : c'est toujours plus clair qu'un appel récursif (qui certes fonctionne).
Sinon, <ol> c'est bien aussi, pour numéroter les fichiers.
seyvapul
Messages postés39Date d'inscriptionvendredi 15 juillet 2005StatutMembreDernière intervention 4 juin 2017 27 mai 2009 à 14:21
Pour ceux que cela intéresse, je suis en train de coder une fonction de parcours de dossier.
Je vous met le code en dessous.
les variables $c et $f sont juste là pour le visuel, c'est pas fini mais cela donne déjà une idée.
DEBUT de test.php
<?php
# $c sert juste à indiquer le numero du dossier pour affichage.
# Liste_Dossier fait appel à la class PHP5 DirectoryIterator.
function Liste_Dossier($dossier,$c) {
# Construit un nouvel itérateur de dossier à partir de $dossier
$dir = new DirectoryIterator($dossier);
foreach ($dir as $fileinfo) {
$f = 0;
# -> IsDir() renvoie true si $fileinfo est un dossier.
# -> IsDot() renvoie true si fileinfo est '.' ou '..'.
# On ne parcours alors que les dossiers présents dans $dossier.
if($fileinfo -> IsDir() && !$fileinfo ->IsDot()) {
# Incrément de $c à chaque dossier trouvé.
++$c;
# Affichage pour voir que tout va bien.
# Possibilite de remplir une table pour y stocker les chemins, etc.
echo $c.' - '.$fileinfo.'
';
# Appel recursif de la fonction pour parcourir les sous dossiers.
# Augmentation de $c par 100 (prévoir plus si besoin :D )
Liste_Dossier($dossier.'/'.$fileinfo,$c*100);
}
# Traitement du cas d'un fichier.
# IsFile() renvoie true si $fileinfo est un fichier.
if($fileinfo -> IsFile()) {
# Incrément de $f à chaque fichier.
++$f;
# Affichage pour voir que tout va bien.
echo $f.' - F -'.$fileinfo.'
';
}
}
}
# Appel de la fonction ($c est ici égale à 0 - Début)
liste_Dossier(dirname(__FILE__),0);
?>
FIN de test.php
Je sais pas si cela peut aider, mais dans le doute ...
Dès que j'aurai fini mon codage, avec un peu de css pour que cela soit plus jolie, je mettrai ma source en ligne.
Pour les différents type de fichiers, pourquoi ne pas passer par une feuille xml, je crois que fhx a déjà traité le sujet.
@plus.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 19 mai 2009 à 20:27
Salut,
Moi ce qui me désole c'est que c'est la 98326780489573Z94ème source à parcourir des répertoires avec opendir... Et en plus, readdir est mal utilisé...
C'est lassant quoi...
mephistope
Messages postés4Date d'inscriptionmercredi 12 avril 2006StatutMembreDernière intervention17 décembre 2009 30 avril 2009 à 16:05
Salut et merci pour vos précisions.
Je ne m'attendais vraiment pas a voir des commentaires sur ce code.
C'est noté pour les normes W3C (je comprenais pas pourquoi il y avais 500 erreurs sur 20 lignes) + les else if redondants + inutile $var1 = $var2 si elle ne doit pas etre modifié …
En tout cas vos réponses m'aident à mieux comprendre.
Un grand merci a vous 6 !
Je m’inspire du code proposé afin de faire les modifs et je re poste le code …
Ps : j’ai honte, car ce script était déjà une amélioration d’un code au résultat identique mais dons le nombre de lignes était multiplié par 10 et bugé a fond.
Rien que pour la date j’utilisais la fonction fileatime($var) qui renvoi le nombre de secondes passé depuis le 1er janvier 1970 , puis de la a faire les divisions pour arriver à une date valide ,alors que la fonction filemtime($var) le fait tres bien (re inveter la roue ;-)
@ tres bientot .
mephistope.
cs_UNi
Messages postés35Date d'inscriptionvendredi 15 février 2002StatutMembreDernière intervention27 avril 2009 27 avril 2009 à 09:25
Il existe une classe en PHP qui fait déjà très bien ce que tu essaye de faire !!
http://be.php.net/manual/fr/class.dir.php Donc ca ne sert à rien de réinventer la roue ;)
Concernant l'affichage des images selon l'extension il y a beaucoup plus simple que de faire N if...elseif
Récupère l'extension de ton fichier et charge l'image correspondante si elle existe
$extension=strrchr($nomFichier,'.');
if (file_exists("images2/".$extension.".png"))
echo "<td></td>";
else
echo "<td></td>";
klicksoe
Messages postés38Date d'inscriptionvendredi 9 mars 2007StatutMembreDernière intervention23 avril 2009 23 avril 2009 à 16:31
Pas très respectueux des normes W3C tout ça :s
De plus, ce n'est pas "<?", mais "<?php" qu'il faut utiliser.
Pour tes extensions, comme l'a proposé Orange73 (mais un peu modifié), on regarde si l'image de l'extension existe et on l'affiche, sinon, on prend l'image de base :
$extension = strtolower($extension); // pour éviter les problèmes de casse
if (!is_file('images2/'.$extension.'.png')) { $extension='unkn'; } // si l'image n'existe pas, on donne l'extension unknow
echo ''; // on affiche l'image
Pour ton calcul de taille, tu pourrais utiliser une fonction également.
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 23 avril 2009 à 16:26
La technique pour récupérer l'extension est correcte c'est la gestion derrière pour afficher une image qui ne l'est pas... un switch serait plus simple et plus clair et le mieux serait d'externaliser le traitement dans une fonction à part... je dirais même que...
j'obtiens le même résultat en 5 lignes de code que toi en 40 lignes... .. !
$dossier = opendir($folder);
while ($Fichier = readdir($dossier))
tu fais quoi s'il y a un pb d'ouverture du répertoir... ou si le répertoire cible n'existe pas... pareil si le répertoire s'appel 0 ta boucle s'arrêtera... également ton $nomFichier = $Fichier; est totalement inutile... .. .
Tout dépend de l'utilité du code mais à mon avis inutile de le tourner en objet... la POO c'est bien en abuser ça craind... .. .
@ tchaOo°
ps: et remplace tes <? par <?php
faiblard
Messages postés337Date d'inscriptionsamedi 3 février 2007StatutMembreDernière intervention 4 janvier 2011 23 avril 2009 à 11:28
Et pourquoi ne pas utiliser path_info pour récupérer l'extension?
Faire plusieurs fois filesize sur la même variable et ridicule tu le fais une fois et tu le stock...
Teclis01
Messages postés1423Date d'inscriptionmardi 14 décembre 2004StatutMembreDernière intervention29 décembre 20124 23 avril 2009 à 11:21
elseif, elseif, elseif, ... le tout dans l'affichage... mouais... j'ai rarement vu moins propre.
Bon et bien tu as gagné 3 choses :
1/passer en objet (il doit déjà exister moult fois)
2/faire un fichier de conf
3/reposter
Orange73
Messages postés1375Date d'inscriptiondimanche 28 novembre 2004StatutMembreDernière intervention 2 août 2011 23 avril 2009 à 11:14
hello,
1/ Utile et l'affichage permet de mieux visualiser l'arborescence.
2/ il faudrait faire une fonction récursive de ta source ainsi qu'une classe, pour que tout le monde puisse l'utiliser pour n'importe quel besoin.
3/ tu aurais pu simplifier et meme virer ton pavé de if()else if() par simplement la recuperation de l'icone via le nom de l'extension par une seule ligne :
echo '<td></td>'; // avec simple quotes en plus pour les echo
22 déc. 2009 à 23:03
22 déc. 2009 à 22:57
J'utilise ton code mais erreur si un des répertoires est vide
27 mai 2009 à 14:51
<?php
class MyDir extends RecursiveIteratorIterator {
public function __construct($directory) {
$it = new RecursiveDirectoryIterator($directory);
parent::__construct($it, RecursiveIteratorIterator::SELF_FIRST);
}
}
echo '';
foreach ($oDir = new MyDir('/home/neige/opendev/') as $item) {
echo '<li>', str_repeat('-', $oDir -> getDepth()), $item -> getFilename(), '</li>';
}
echo '';
?>
Après, ça devient intéressant quand on commence à s'intéresser aux filtres et à la mise en forme du bazar produit. Mais la base est là.
27 mai 2009 à 14:43
27 mai 2009 à 14:37
Cf l'excellente source de Malalam : http://www.phpcs.com/codes/PHP5-SMARTDIR-ITERATEURS-PHP-LECTURE-INTELLIGENTE-REPERTOIRE_40393.aspx
Sinon, <ol> c'est bien aussi, pour numéroter les fichiers.
27 mai 2009 à 14:21
Je vous met le code en dessous.
les variables $c et $f sont juste là pour le visuel, c'est pas fini mais cela donne déjà une idée.
DEBUT de test.php
<?php
# $c sert juste à indiquer le numero du dossier pour affichage.
# Liste_Dossier fait appel à la class PHP5 DirectoryIterator.
function Liste_Dossier($dossier,$c) {
# Construit un nouvel itérateur de dossier à partir de $dossier
$dir = new DirectoryIterator($dossier);
foreach ($dir as $fileinfo) {
$f = 0;
# -> IsDir() renvoie true si $fileinfo est un dossier.
# -> IsDot() renvoie true si fileinfo est '.' ou '..'.
# On ne parcours alors que les dossiers présents dans $dossier.
if($fileinfo -> IsDir() && !$fileinfo ->IsDot()) {
# Incrément de $c à chaque dossier trouvé.
++$c;
# Affichage pour voir que tout va bien.
# Possibilite de remplir une table pour y stocker les chemins, etc.
echo $c.' - '.$fileinfo.'
';
# Appel recursif de la fonction pour parcourir les sous dossiers.
# Augmentation de $c par 100 (prévoir plus si besoin :D )
Liste_Dossier($dossier.'/'.$fileinfo,$c*100);
}
# Traitement du cas d'un fichier.
# IsFile() renvoie true si $fileinfo est un fichier.
if($fileinfo -> IsFile()) {
# Incrément de $f à chaque fichier.
++$f;
# Affichage pour voir que tout va bien.
echo $f.' - F -'.$fileinfo.'
';
}
}
}
# Appel de la fonction ($c est ici égale à 0 - Début)
liste_Dossier(dirname(__FILE__),0);
?>
FIN de test.php
Je sais pas si cela peut aider, mais dans le doute ...
Dès que j'aurai fini mon codage, avec un peu de css pour que cela soit plus jolie, je mettrai ma source en ligne.
Pour les différents type de fichiers, pourquoi ne pas passer par une feuille xml, je crois que fhx a déjà traité le sujet.
@plus.
19 mai 2009 à 20:27
Moi ce qui me désole c'est que c'est la 98326780489573Z94ème source à parcourir des répertoires avec opendir... Et en plus, readdir est mal utilisé...
C'est lassant quoi...
30 avril 2009 à 16:05
Je ne m'attendais vraiment pas a voir des commentaires sur ce code.
C'est noté pour les normes W3C (je comprenais pas pourquoi il y avais 500 erreurs sur 20 lignes) + les else if redondants + inutile $var1 = $var2 si elle ne doit pas etre modifié …
En tout cas vos réponses m'aident à mieux comprendre.
Un grand merci a vous 6 !
Je m’inspire du code proposé afin de faire les modifs et je re poste le code …
Ps : j’ai honte, car ce script était déjà une amélioration d’un code au résultat identique mais dons le nombre de lignes était multiplié par 10 et bugé a fond.
Rien que pour la date j’utilisais la fonction fileatime($var) qui renvoi le nombre de secondes passé depuis le 1er janvier 1970 , puis de la a faire les divisions pour arriver à une date valide ,alors que la fonction filemtime($var) le fait tres bien (re inveter la roue ;-)
@ tres bientot .
mephistope.
27 avril 2009 à 09:25
http://be.php.net/manual/fr/class.dir.php
Donc ca ne sert à rien de réinventer la roue ;)
Concernant l'affichage des images selon l'extension il y a beaucoup plus simple que de faire N if...elseif
Récupère l'extension de ton fichier et charge l'image correspondante si elle existe
$extension=strrchr($nomFichier,'.');
if (file_exists("images2/".$extension.".png"))
echo "<td></td>";
else
echo "<td></td>";
23 avril 2009 à 16:31
De plus, ce n'est pas "<?", mais "<?php" qu'il faut utiliser.
Pour tes extensions, comme l'a proposé Orange73 (mais un peu modifié), on regarde si l'image de l'extension existe et on l'affiche, sinon, on prend l'image de base :
$extension = strtolower($extension); // pour éviter les problèmes de casse
if (!is_file('images2/'.$extension.'.png')) { $extension='unkn'; } // si l'image n'existe pas, on donne l'extension unknow
echo ''; // on affiche l'image
Pour ton calcul de taille, tu pourrais utiliser une fonction également.
23 avril 2009 à 16:26
$ext = strtolower(substr(strrchr($nomFichier,'.'),1);
if(is_file(dirname(__FILE__).DIRECTORY_SEPARATOR.'images2'.DIRECTORY_SEPARATOR.$ext.'.png'))
echo '<td></td>';
else
echo '<td></td>';
j'obtiens le même résultat en 5 lignes de code que toi en 40 lignes... .. !
$dossier = opendir($folder);
while ($Fichier = readdir($dossier))
tu fais quoi s'il y a un pb d'ouverture du répertoir... ou si le répertoire cible n'existe pas... pareil si le répertoire s'appel 0 ta boucle s'arrêtera... également ton $nomFichier = $Fichier; est totalement inutile... .. .
if(($dossier = opendir($folder)) !== false)
{ while(false !($nomFichier readdir($dossier)))
{
// traitement
}
closedir($dossier);
}
else // gestion de l'erreur...
Tout dépend de l'utilité du code mais à mon avis inutile de le tourner en objet... la POO c'est bien en abuser ça craind... .. .
@ tchaOo°
ps: et remplace tes <? par <?php
23 avril 2009 à 11:28
Faire plusieurs fois filesize sur la même variable et ridicule tu le fais une fois et tu le stock...
23 avril 2009 à 11:21
Bon et bien tu as gagné 3 choses :
1/passer en objet (il doit déjà exister moult fois)
2/faire un fichier de conf
3/reposter
23 avril 2009 à 11:14
1/ Utile et l'affichage permet de mieux visualiser l'arborescence.
2/ il faudrait faire une fonction récursive de ta source ainsi qu'une classe, pour que tout le monde puisse l'utiliser pour n'importe quel besoin.
3/ tu aurais pu simplifier et meme virer ton pavé de if()else if() par simplement la recuperation de l'icone via le nom de l'extension par une seule ligne :
echo '<td></td>'; // avec simple quotes en plus pour les echo