8443 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

sur ta copie d'écran, il manque un bracket { sur la ligne foreach

erreur de copier/coller Smiley cligne

tu peux aussi supprimer les deux slashs lignes 23, çà c'est moi Smiley biggrin
Modifié par keran (15 Oct 2010 - 20:34)
IVIedia, pour obtenir un affichage aléatoire de ton tableau de résultats , utilise shuffle(): http://php.net/manual/fr/function.shuffle.php

(A chaque rechargement du script, tu auras un affichage différent.)

Ce qui dans mon code donnerait:


/*VARIABLES A ADAPTER A TON CAS*/
$dossier_principal='images';//nom du répertoire a lister
$extensions = array('png','gif','jpg','jpeg'); // tableau des extensions d'images a sélectionner: Rajouter ou enlever des extensions

$listing = scandir_through($dossier_principal,$extensions); // tableau de résultats a afficher
shuffle($listing); // mélange le tableau (aléatoire)

echo '<h1>Affichage aléatoire des images du dossier "'.$dossier_principal.'/" et de ses sous-dossiers</h1><ul>';
foreach($listing as $key=>$filename){echo '<li>'.$filename.'</li>';}
echo '</ul>';

//http://php.net/manual/fr/function.glob.php
//http://php.net/manual/fr/function.shuffle.php
ligne du foreach

ainssi ...

     {    foreach (new RecursiveIteratorIterator($filtres,RecursiveIteratorIterator::SELF_FIRST) as $v) { 


?
davidito a écrit :
IVIedia, pour obtenir un affichage aléatoire de ton tableau de résultats , utilise shuffle(): http://php.net/manual/fr/function.shuffle.php

(A chaque rechargement du script, tu auras un affichage différent.)

Ce qui dans mon code donnerait:


/*VARIABLES A ADAPTER A TON CAS*/
$dossier_principal='images';//nom du répertoire a lister
$extensions = array('png','gif','jpg','jpeg'); // tableau des extensions d'images a sélectionner: Rajouter ou enlever des extensions

$listing = scandir_through($dossier_principal,$extensions); // tableau de résultats a afficher
shuffle($listing); // mélange le tableau (aléatoire)

echo '&lt;h1&gt;Affichage aléatoire des images du dossier &quot;'.$dossier_principal.'/&quot; et de ses sous-dossiers&lt;/h1&gt;&lt;ul&gt;';
foreach($listing as $key=&gt;$filename){echo '&lt;li&gt;'.$filename.'&lt;/li&gt;';}
echo '&lt;/ul&gt;';

//http://php.net/manual/fr/function.glob.php
//http://php.net/manual/fr/function.shuffle.php



super !, ça marche comme des roulettes Smiley smile ...

J'espère que si je demande ça, ça ne sera pas de trop Smiley smile et puis ça sera fini mon système
que je veux mettre en place sur mon site Smiley smile

comment dire, affiche moi, une image aléatoire , juste une image du dossier galeries et sous dossier Smiley smile ...

après, on peux tout posté sur le site Smiley smile
avec quelque effet , facebox, ou lightbox Smiley smile ...

Merci
Modifié par IVIedia (15 Oct 2010 - 21:44)
Pour continuer dans les fonction php, cette fois utilise rand() http://php.net/manual/fr/function.rand.php pour choisir une image au hasard dans ton tableau de résultat.

Rand($a,$b) choisi un nombre entre $a et $b inclus.

Donc dans le code, ca donne:


/*VARIABLES A ADAPTER A TON CAS*/
$dossier_principal='images';//nom du répertoire a lister
$extensions = array('png','gif','jpg','jpeg'); // tableau des extensions d'images a sélectionner: Rajouter ou enlever des extensions

$listing = scandir_through($dossier_principal,$extensions);
shuffle($listing);

$max= count($listing)-1; // Numéro maxi des lignes dans le tableau (-1 car la numérotation commence a zéro)
$choix = rand(0,$max); // Choix d'un numéro de ligne au hasard (entre 0 et le numéro maxi de ligne)

echo '<h1>Une image au hasard:</h1>'.$listing[$choix]; // Affichage d'une image au hasard

echo '<h1>Listing du dossier "'.$dossier_principal.'/" et de ses sous-dossiers</h1><ul>';
foreach($listing as $key=>$filename){echo '<li>'.$filename.'</li>';}
echo '</ul>';

//http://php.net/manual/fr/function.glob.php
//http://php.net/manual/fr/function.shuffle.php
//http://php.net/manual/fr/function.rand.php


Smiley cligne
Merci davidito,

tout est ok maintenant Smiley smile , ça marche 5/5
je vais pouvoir crée ma petit galerie bien sympa, et profité du week end pour mettre ça en place Smiley smile

c'est cool Smiley smile

Merci d'avance, et merci a tout le monde d'alsacreation....

:)
bonne soirée
juste pour celles et ceux que çà intérésse

je met à jour le code de la classe qui filtre maintenant les dossiers avec ajout d'un membre array contenant le/les dossiers à filtrer. Donc elle filtre maintenant les dossiers et les fichiers par extensions. Un booleen précise si le filtre des dossiers doit être actif, true par défaut. Merci à tous car çà m'aura permis de mettre ce code à jour. Vous l'aurez compris c'est dans la méthode accept() que réside le secret. Elle est donc à modifier selon les besoins. Toute classe qui hérite de FilterIterator doit surcharger cette méthode.


class FiltreRecursif extends RecursiveFilterIterator {
    private $_Iterateur;
    private $_TabExtensions = array();
    private $_TabDossierAFiltrer = array();
    private $_BoolFiltreDossier;
	
    /**
     * Attend un objet implémentant l'interface RecursiveIterator, un tableau
     * d'extensions sans le point et un tableau de dossiers à filtrer.
     * 
     * @param $iterateur
     * @param $tab_extensions
     * @param $tab_dossier
     */
	function  __construct(RecursiveIterator $iterateur, array $tab_extensions, array $tab_dossier, $bool_dossier = true) {
		if ($iterateur instanceof RecursiveIterator)
        	$this->_Iterateur = $iterateur;
        else throw new InvalidArgumentException('Cet objet n\'est pas une instance de RecursiveIterator');
        if (is_array($tab_extensions))
        	$this->_TabExtensions = $tab_extensions;
        else throw new InvalidArgumentException('Le paramètre 2 n\'est pas un tableau');
        if (is_array($tab_dossier))
        	$this->_TabDossierAFiltrer = $tab_dossier;
        else throw new InvalidArgumentException('Le paramètre 3 n\'est pas un tableau');
        if (is_bool($bool_dossier))
        	$this->_BoolFiltreDossier = $bool_dossier;
        else $this->_BoolFiltreDossier = true;
        parent::__construct($this->_Iterateur);
    }
	
    /**
     * Filtre qui n'accepte que les extensions du tableau et les dossiers.
     * Les dossiers à exclure sont compris dans un tableau lui aussi.Tres efficace.
     */
    function  accept() {
    	if ($this->_BoolFiltreDossier === true) {
	    	if ($this->hasChildren() && !in_array(pathinfo($this->current(),PATHINFO_BASENAME),$this->_TabDossierAFiltrer))
	    		return true;
	        else return in_array(pathinfo($this->current(), PATHINFO_EXTENSION), $this->_TabExtensions);
    	} else return ($this->hasChildren() || in_array(pathinfo($this->current(), PATHINFO_EXTENSION), $this->_TabExtensions));
    }
    
    /**
     * Si l'élément courant contient des enfants sur lesquels itérer, appel récursif
     * de la classe avec ses paramètres.
     */
    function  getChildren() {
        return new self($this->getInnerIterator()->getChildren(), $this->_TabExtensions, $this->_TabDossierAFiltrer,$this->_BoolFiltreDossier);
    }
}
$racine = 'skins/defaut/tests';  
try {     
	$filtre = new RecursiveDirectoryIterator($racine);     
	try {
		// ne filtre que les fichiers        
		$filtres = new FiltreRecursif($filtre,array('jp*g','gif','png'),array(),false);
		// filtre les fichiers et les dossiers, içi thumbs sera ignoré ainsi que les fichiers
		//et dossiers qu'il contient
		//$filtres = new FiltreRecursif($filtre,array('jp*g','gif','png'),array('thumbs'));         
		/* 
		 * RecursiveIteratorIterator::SELF_FIRST pour que les dossiers soit pris en compte
		 * retirer cette constante ne retourne que les fichiers.
		 */   
		foreach (new RecursiveIteratorIterator($filtres,RecursiveIteratorIterator::SELF_FIRST) as $v) {
			/*
			 * // pour tester la sortie
			 * echo '<pre>';
			 * print_r($v);
			 * echo '</pre>';
			 */
			if ($v->isDir())      
				echo 'Dossier : '.strtr($v,'\\','/').'<br />'; 
			else echo 'Fichier : '.strtr($v,'\\','/').'<br />'; 
		}     
	} catch (InvalidArgumentException $spl) { echo $spl->__toString(); } 
} catch (Exception $e) { echo $e->__toString(); } 


enoy Smiley cligne
Merci Keran, nous sommes bien gâté Smiley smile , nous avons plusieurs solution qui fonctionne Smiley smile

bonne journée
Hello @tous

Eh bien jolie code keran : fonctionnelle.
Dommage que la documentation manque.
Le secteur « user contributed notes » est vide sur le manuel PHP fr : parce que méconnu.

Quoiqu'il en soit j'ai d'abord suivi les exercices en PDF de développez.com. Intéressant.
Pour moi ça marche sauf sur certains points.

1 ) Il n'y a pas de diffrence entre true ou false : la prise en compte des dossiers.
2 ) De même si j'ignore la constante SELF_FIRST.

Lorsque j'ai voulu ajouter un répertoire de nouvelles erreurs « de ma part » ont surgit : ces erreurs n'était pas présentent au premier lancement. Ceux-ci se sont pointés au moment exacte où j'ai ajouter un répertoire « bmp » dans le répertoire cibler « png » dans mon cas.

Quoiqu'il en soit c'est intéressant : un point fort.

J'ai un fichier caché « Thumbs.db » provenant possiblement d'un gestionnaire d'images avec indexation du genre picasa. Je peut facilement l'intégrer ou l'ignorer grâce au array. Celui-ci est entièrement opérationnel et fort sympathique dans son utilisation.

Les quelques erreurs restante concernant l'ajout d'un répertoire dans l'arborescence via « Windows Commander », eh bien j'essairai de trouver une solution.

++

PS : J'ai réparer tout est ok - sauf la boolean dont je vois mal son utilité.
Tant qu'à SELF_FIRST - c'est entièrement opérationnelle.
Modifié par zardoz (16 Oct 2010 - 19:46)
<< zardoz
Merci, si la doc est si restreinte c'est parce que, en autre, c'est plutôt avancé comme concept, le tout objet. On n'est censé(e) connaitre les bases du code objet. C'est vrai et faux à la fois mais nous, pauvres "french guy", on doit s'en contenter. A nous de faire le boulôt...

a écrit :
sauf la boolean dont je vois mal son utilité


$bool_dossier? si oui, prend en compte le tableau des dossiers à filtrer. comme içi

 $filtres = new FiltreRecursif($filtre,array('jp*g','gif','png'),array(),false); 


Il faut d'ailleurs que je découple pour ne pas avoir ce tableau vide, c'est moche et inutile.

a écrit :
Tant qu'à SELF_FIRST - c'est entièrement opérationnelle


Tu m'étonnes, c'est une constante de la classe recursiveDirectoryIterator Smiley cligne

a écrit :
J'ai un fichier caché « Thumbs.db » provenant possiblement d'un gestionnaire d'images avec indexation du genre picasa


Thumbs.db est un fichier de base de données(.db = database) windows présent dans tout les dossiers comportant des images ou vidéos wmv/avi. Présent quand on met en cache les images.

NB: je vous remercie tous mais le code de davidito, même si c'est du procédural connu, c'est un code digne de respect, même si, même si...

foreach($listing as $key=>$filename){echo '<li>'.$filename.'</li>';} 


si on utilise pas $key pourquoi la charger en mémoire? et aussi çà c'est plus important, les erreurs, il faut aussi les gérer Smiley cligne Je sais se sont des exemples mais bon, je sais aussi que beaucoup de débutants prennent les codes et les utilisent comme il peuvent et c'est bien normal, pour un débutant.

il y à aussi celui d'heyoan, qui n'est pas spécialement une bille en php. Le mien c'est juste une autre approche. qui veux approfondir trouvera son bonheur en lisant les codes et tutoriels de malalam ou neigedhiver sur le célébre réseau codesources, ce sont les deux meilleurs du réseau pour le code objet.
Hello

Eh oui je sais pour le bool mais je ne vois pas de différence à l'exécution : La valeur par défaut ou false. Ça reste pareil.

Je sais aussi que SELF_FIRST est une constante prédéfini, je connais ma doc : L'erreur était ailleurs.

Je sais aussi pour .db : Merci de me le rappeler. Smiley cligne

Ceci dit lorsque nous écrivons en nos propres termes ça ouvre des portes aux erreurs et les erreurs sont corriger sans trop
de difficulté. « genre erreur de frappe, fautes mineurs etc ».

Quoiqu'il en soit tout est nikel : sauf que je ne vois pas encore l'intérêt du bool.

++
Modifié par zardoz (17 Oct 2010 - 00:05)
Hello

@keran

L'instanciation de la classe - FiltreRecursif.class.php : fichier de lancement - filtreRecursif.php


include ('classes/FiltreRecursif.class.php');
# --
$br = '<br>';
$racine = './images';
# --
try
{
  $filtre = new RecursiveDirectoryIterator ($racine);
  try {
    # -- ne filtre que les fichiers
	$filtres = new FiltreRecursif ($filtre, array ('jpeg', 'jpg', 'gif', 'png', 'bmp'), array (), false);
	# -- Filtre les fichiers et les dossiers ainsi que leurs enfants fichiers ou dossiers
	// --- $flitres = new FiltreRecursif ($filtre, array ('jpeg', 'jpg', 'gif', 'png', 'bmp'), array ('Thumbs'));
	/**
	 * RecursiveIteratorIterator::SELF_FIRST pour que les dossiers soit pris en compte
	 * retirer cette constante ne retourne que les fichiers
	*/
	foreach (new RecursiveIteratorIterator ($filtres, RecursiveIteratorIterator::SELF_FIRST) as $v)
	{
	  # -- En données brute
	  # -- echo '<pre>';
	  # --  print_r ($v);
	  # -- echo '</pre>';
	  
	  if ($v->isDir ())
	    echo '<b>DOSSIER : </b>' . strtr ($v, '\\', '/') . $br;
	  else echo '<b>fichier : </b>'  . strtr ($v, '\\', '/') . $br;  
	}
  }
  catch (InvalidArgumentException $spl)
  {
    echo $spl->__toString ();
  }
}
  catch (Exception $e) { echo $e->__toString (); }

Je te laisse aussi la classe car c'est à ce niveau que j'ai des doutes

class FiltreRecursif extends RecursiveFilterIterator
{
  private $_iterateur;
  private $_tabExtensions = array ();
  private $_tabDossiersFiltrer = array ();
  private $_onOffFiltreDossier;
  /**
   * Attend un objet implémentant l'interface RecursiveIterator, un tableau
   * d'extensions sans le point et un tableau de dossiers à filtrer
   *
   * @param $iterateur
   * @param $tabExtensions
   * @param $tabDossiers
  */
  public function __construct (RecursiveIterator $iterateur, array $tabExtensions, array $tabDossiers, $onOff = true)
  {
    if ($iterateur instanceOf RecursiveIterator)
	  $this->_iterateur = $iterateur;
	else throw new InvalidArgumentException ('Cet objet n\'est pas une instance RecursiveIterator');
	# --
	if (is_array ($tabExtensions))
	  $this->_tabExtensions = $tabExtensions;
	else throw new InvalidArgumentException (utf8_decode ('Le paramètre 2 n\'est pas un tableau'));
	# --
	if (is_array ($tabDossiers))
	  $this->_tabDossiersFiltrer = $tabDossiers;
	else throw new InvalidArgumentException (utf8_decode ('Le paramètre 3 n\'est pas un tableau'));
	# --
	if (is_bool ($onOff))
	  $this->_onOffFiltreDossier = true;
	  parent::__construct ($this->_iterateur);
  }
  /**
   * Filtre qui n'accepte que les extensions du tableau et les dossiers.
   * Les dossiers à exclure sont compris dans un tableau eux aussi.
  */
  public function accept ()
  {
    if ($this->_onOffFiltreDossier === true)
	{
	  if ($this->hasChildren () && !in_array (pathinfo ($this->current (), PATHINFO_BASENAME), $this->_tabDossiersFiltrer))
	    return true;
	  else return in_array (pathinfo ($this->current (), PATHINFO_EXTENSION), $this->_tabExtensions);
	}
	else return ($this->hasChildren () || in_array (pathinfo ($this_>current (), PATHINFO_EXTENSION), $this->_tabExtensions));
  }
  /**
   * Si l'élément courant contient des enfants sur lesquels itérer : appel récusif
   * de la classe avec ses paramètres
  */
  public function getChildren ()
  {
    return new self ($this->getInnerIterator ()->getChildren (), $this->_tabExtensions, $this->_tabDossiersFiltrer, $this->_onOffFiltreDossier);
  }
}


Mon code se tient proche du tiens. Seule quelques noms de variables changeront.
En SPL j'ai appris que nous ne pouvions pas changer grand chose puisqu`'il s'agit souvent d'implémentation.
Les noms de méthodes particulièrement resteront inchangées. Ce qui bascule mes habitudes.

Ceci comme résultat

upload/20350-filtreRecu.jpg

Alors mon but évidemment est de mieux saisir le rôle de la Boolean car je ne le vois pas.
Si je décommente le 2ième modèle il génère un erreur. Il ne reconnait pas $filtres au pluriel.
$filtres est le premier param de new RecursiveIteratorIterator dans le foreach.
Mais dès l'instant où je le met au singulier tout est opérationnelle.

++
Modifié par zardoz (17 Oct 2010 - 09:22)
Bonjour à tous Smiley smile ...

avec le code de davidito, il y 'a moyen d'activité la pagination ?

Je m'explique, jusqu'à présent nous pouvons listé les infos des dossiers, ici j'arrive a affiché mes images en 640/480 par exemple , mais quand il y 'a plus de 100 photos a chargé dans la même page ça deviens lourds, c'est pourquoi je voulais savoir si avec un petit script il y a moyen de faire ça ...

affiche tout les images de manières aléatoire, et liste les 10 premier résultat, si il y 'a plus de 10 images, alors on active la pagination
ex :

IMG02.jpg
IMG06.jpg
IMG02.jpg
IMG22.jpg
IMG98.jpg
IMG12.jpg
IMG46.jpg
IMG82.jpg
IMG20.jpg
IMG78.jpg

<= 1 - 2 - 3 - 4 - 5 =>

Merci
<< zardoz

Je viens de refaire des tests avec ma classe et la tienne.

sans retoucher la mienne c'est conforme et filtré. Par contre, la tienne contient une erreur dans la méthode accept

in_array (pathinfo ($this_>current (), PATHINFO_EXTENSION)


l'underscore de current Smiley cligne

cette erreur corrigée, je fais


$racine = 'tablatures';  
try {     
	$filtre = new RecursiveDirectoryIterator($racine);     
	try {
		//$filtres = new FiltreRecursif($filtre,array('gtp','gp3','gp4','gp5','zip','ptb','tef','pdf'),array('guitarpro'));
		$filtres = new FiltreRecursif($filtre,array('gtp','gp3','gp4','gp5','zip','ptb','tef','pdf'),array(''),false);
		foreach (new RecursiveIteratorIterator($filtres,RecursiveIteratorIterator::SELF_FIRST) as $v) {
			if ($v->isDir())      
				echo 'Dossier : '.strtr($v,'\\','/').'<br />'; 
			else echo 'Fichier : '.strtr($v,'\\','/').'<br />'; 
		}     
	} catch (InvalidArgumentException $spl) { echo $spl->__toString(); } 
} catch (Exception $e) { echo $e->__toString(); } 


Et çà fonctionne, elle filtre Smiley cligne

a écrit :
Mais dès l'instant où je le met au singulier tout est opérationnelle.


Normal, tu passes dans foreach l'instance de RecursiveDirectoryIterator ce qui est valide mais le retour n'est pas filtré, logique.

et puis cette façon de faire n'est pas correcte



if (is_bool ($onOff))       $this->_onOffFiltreDossier = true;


si je fais

$filtres = new FiltreRecursif($filtre,array('gtp','gp3','gp4','gp5','zip','ptb','tef','pdf'),array(''),'erreur');


le tableau étant vide c'est ok mais il y à quand même deux problèmes. non?

if (is_bool($onOff))       
	$this->_onOffFiltreDossier = onOff;
          else $this->_onOffFiltreDossier = true;


Filtre le bool et lui assigne true par défaut donc si c'est une string çà devient un bool qui vaut true.CQFD Smiley cligne Et tu perds aussi avec ta façon d'assigner en dur l'interet du paramètre puisqu'il vaut toujours true si c'est un bool.
Modifié par keran (17 Oct 2010 - 16:48)
Salut

Eh bien merci keran je vérifie aujourd'hui.
SPL c'est vraiment une autre façon de faire. J'ai suivi tes liens et je vois bien
un point en commun : l'implémentation « implements ».

Une des puissance de SPL sera justement de modifier le comportement
par défaut des fonctions natives en PHP. On le vois bien avec
Julien-Pauli (développez.com) et Malalam (Code source la classe String).

Quoiqu'il en soit en SPL nous devons avoir une bonne base en POO mais aussi
une très bonne connaissance des fonctions natives en PHP.
Suggérer aux développeurs chevronnés, créatifs, ingénieux.

Merci de ta participation keran et aussi tous les autres.

++
<< victor Brito

a écrit :
À mon avis, il y a moyen de simplifier le script


essai de faire la même chose avec scandir, glob ou autres et surtout envoi moi le code si tu y arrives... Smiley lol

<< zardoz

a écrit :
un point en commun : l'implémentation « implements ».


La toute puissance des interfaces. Comme cette classe, elle implémente RecursiveIterator indirectement par le biais de l'iterateur passé en paramètre et 30 lignes de code seulement pour filtrer récursivement à la fois les fichiers et les dossiers d'un chemin et optimisé avec çà . qui dit mieux? Du coup cette classe est utilisable avec tout objet implementant RecursiveIterator, pas seulement RecursiveDirectoryIterator...Et aucunes fonctions natives ne m'apportera çà. Et encore un avantage, retourne des objets splFileInfo...
Modifié par keran (17 Oct 2010 - 22:46)
IVIedia a écrit :
Bonjour à tous Smiley smile ...

avec le code de davidito, il y 'a moyen d'activité la pagination ?

Je m'explique, jusqu'à présent nous pouvons listé les infos des dossiers, ici j'arrive a affiché mes images en 640/480 par exemple , mais quand il y 'a plus de 100 photos a chargé dans la même page ça deviens lourds, c'est pourquoi je voulais savoir si avec un petit script il y a moyen de faire ça ...

affiche tout les images de manières aléatoire, et liste les 10 premier résultat, si il y 'a plus de 10 images, alors on active la pagination
ex :

IMG02.jpg
IMG06.jpg
IMG02.jpg
IMG22.jpg
IMG98.jpg
IMG12.jpg
IMG46.jpg
IMG82.jpg
IMG20.jpg
IMG78.jpg

&lt;= 1 - 2 - 3 - 4 - 5 =&gt;

Merci


bonjour

Je cherche une fonction de pagination si ça permet ou pas ...
merci d'avance

Smiley smile
Salut IVIedia

Je peut te suggérer ceci

Tu pourras le télécharger en PDF. Smiley smile

En fait oui c'est possible ce que tu cherche avec la clause LIMIT
Évidemment c'est sur utilisation d'une BDD.
Le document traite aussi de la pagination que tu devras adapter selon tes besoins.

++
Modifié par zardoz (18 Oct 2010 - 20:27)
Pages :