marmottek
Messages postés1Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention17 avril 2008
-
17 avril 2008 à 16:57
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 2012
-
31 mai 2008 à 18:08
Bonjour,
Je voudrais faire un petit site de critiques de BDs.
Je me suis dit qu'avec la fonction include, je pouvais faire mes critiques sur des docs html et les appeler dans ma page.
Peut-on utiliser la fonction include pour appeler tous les fichiers html d'un même répertoire ?
Peut-on générer un tri (exemple alphabétique du nom de fichier) ?
Peut-on générer des pages avec X fichiers par page ?
Dans le même esprit, est-ce possible de trier genre "tous les fichiers commencant par a" dans le répertoire X ? Cela demande-t-il de faire des pages avec des appels différents ? ou Il suffit de faire des liens genre monsite.com/news.php?news=a ou quelquechose dans le genre.
Je n'ai fait que du HTML simple pour l'instant mais le PHP semble avoir des fonctionnalités de folie.
Je vous remercie d'avance pour les réponses !
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 17 avril 2008 à 17:13
salut
c'est assez difficile de te repondre comme ca...
include c'est une fonction qui ne fait qu'un truc : inclure le fichier passe en parametre, la ou include est appelle.
pour recuperer tout les fichiers d'un repertoire, tu peux faire un opendir, readdir, etc... (cf la doc sur php,net, t'y trouveras plein d'exemples d'utilisation de chaque fonction, c'est un site tres interessant.)
pour trier, faut placer tes fichiers dans un tableau (array) et les trier avec sort (cf php.net)
pour selectionner ceux qui commencent par a, tu peux faire un array_filter.
pour la pagination, en fait, il te faut faire une boucle for, t'as rien d'automatique pour ca.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 17 avril 2008 à 22:05
Salut,
Pour lire le contenu d'un répertoire, on peut aussi utiliser un itérateur, c'est plus propre. Y'a même des sources qui en parlent sur phpcs... Sisi, j'en ai vu...
Ca permet même de trier dans l'ordre qu'on veut, de filtrer, tout ça... Des trucs de ouf...
Y'en a même qui prétendent qu'on peut paginer avec, c'est dire, hein...
<hr size="2" width="100%" />Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 17 avril 2008 à 22:31
hum... c'est un long debat...
perso, je trouve ca porc, parce-que c'est contre les principes objets... Exemple : perso, j'avais besoin de faire un SourceFile qui recupere le langage, mimetype, nombre de lignes, nommbre de commentaires d'un fichier source. bah j'ai fait SourceFile extends FileSPL (ou un truc du genre), mais ensuite, mon directoryItterator ne pourra jamais me sortir des SourceFile...
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 17 avril 2008 à 23:14
C'est pas le DirectoryIterator de la SPL, justement... Mais une classe étendue. A partir de là, on fait ce qu'on veut, non ? Y'a aucune obligation légale de n'utiliser que DirectoryIterator natif... ;)
<hr size="2" width="100%" />Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 19 avril 2008 à 11:12
Hello,
moi non plus je n'ai pas compris ce que tu voulais dire, Coucou, tu peux détailler ?
Perso je fais gaffe avec SplFileObject parce que je me suis rendu compte que sur php5.2, il subsistait des bugs : l'itérateur est mal écrit, il vaut mieux le réécrire (ça a peut-être changé, je n'ai pas réessayé vuq ue j'ai réécrit le mien) : il saute parfois la 1ère ligne d'un fichier lors d'une itération...quoi qu'on fasse.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 19 avril 2008 à 11:42
hum...
le directoryitterator cree des SplFileInfo, on ne peut pas lui specifier une Factory qui creerait les objets que l'on desire a partir de leur Path (pourtant c'est un exemple classique de Factory...)
pour moi ca parrait logique de faire au moins un FileFactory, soit on en fait un Singleton pour pouvoir l'appeller facilement de n'importe ou, soit en en fait plusieurs, passables en parametres, pour avoir une solution plus generale.
exemple simple : je veux pouvoir lister des fichiers samba, des fichiers dans un zip, des fichiers en ftp, etc... j'ai deux solutions, soit je fais un wrapper par protocol, et je fais un directoryItterator generaliste, soit je fais des directoryitterators selon le protocol, et un factory.
on peut trouver une troisieme solution, en s'inspirant des deux premieres :
* des wrappers pour gerer le protocol (premiere couche d'abstraction)
* un directoryitterator generaliste et un FileObj generaliste (seconde couche d'abstraction)
* des FileObj particuliers et DirectoryItterators particuliers, selon les protocols, types de fichiers, etc...
* une factory pour dire quelle classe instancier en fonction du path.
* un directoryMultiItterator qui obeirait a la factory.
* des filtres particuliers en fonction des protocols, types de fichiers, etc...
pourquoi faire ca ? parce-qu'on ne fait pas la meme chose en ftp, en local, sur un zip, etc... quand on a un objet de manipulation de dossier en ftp, on peut vouloir recuperer l'utilisateur courrant... dans un zip, non (et pour les fichiers, les possibilites, on en parle meme pas...)
Bref, ca c'est un modele que j'imagine comme ca, mais qui n'existe pas. En realite, on a des wrappers, et un directoryitterator generaliste, qui ne fait QUE des SplFileInfo...
J'avais essaye de faire sortir au DirectoryItterator un PersonalFile (une classe de ma production pour gerer des fichiers) mais ca fonctionnait pas...
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 19 avril 2008 à 12:03
Mais DirectoryIterator est dédié au filesystem. C'est un peu comme si tu reprochais readdir() de ne pas lire un répertoire ftp.
Et toutes les classes de la SPL peuvent être étendues, voire totalement réécrites très facilement. Utiliser un itérateur de type "directory" généraliste qui implémente un FileInfo différent en fonction du contexte est extrêmement simple avec la SPL. C'est vrai, il n'en existe pas de base. Mais il y a par contre tous les outils pour créer un tel code.
Je ne comprends pas non plus quand tu dis que la SPL va à l'encontre de la notion objet. Moi je trouve que c'est tout le contraire : elle est justement très flexible et est très fortement orientée objet, toute son architecture est basée là-dessus, et elle possède un pouvoir d'abstraction qui n'existe nulle part ailleurs dans PHP.
Les exemples founries avec la SPL le prouvent d'ailleurs : ils sont appliquées à un peu tout et n'importe quoi, mais tous conservent la même base (Traversable, Iterator). Et aucune classe n'est finale. Et surtout, on a tous les éléments pour réécrire absolument ce que l'on veut.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 31 mai 2008 à 18:08
j'ai un truc en cours, ca fait moins de 400 lignes, et c'est CAREMENT plus souple que la SPL...
try{
$d=new Dossier(new Factory(), './');
$i=new SortItterator($d, new Comparator(UnixFile::Type | UnixFile::Asc, new Comparator(UnixFile::Name)));
echo '';
foreach ($i as $f){
echo '<li>'.$f.'</li>';
}
echo '';
}catch (MException $e){
echo $e;
}
de la spl, je n'utilise que les Exceptions et les iterateurs.
Dossier est un dossier listner
Factory est la classe qui cree les objets que renvoie le dossier (ca me paraissait naturel d'en placer une ici... la mettre hors du dossier permet une plus grande souplesse...)
SortItterator trie un iterateur, en O( n log(n)) avec un tri par insertion dans un arbre binaire (c'est joli :) )
Comparator permet de comparer des elements selon des parametres.
tout ca en 367 lignes...
il me reste en gros, a faire des Exceptions un peu moins htmlisees... (faire une vue pour les Exceptions...) montrer un exemple (et donc coder 4-5 classes) de FileInfo pour les MP3 et images. Et a faire le FilterIterator (generique de preference) evidement... Sans oublier le RecursiveIterator (generique de preference...)
en fait, le RecursiveIterator se comporterait comme un flatten...