Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASSE LECTUREENLIGNE - POUR LES SITES DE SCANTRAD OU ...


Information sur la source

Catégorie :Graphique Classé sous : image, gd, scantrad, lecture, miniature Niveau : Débutant Date de création : 18/09/2008 Date de mise à jour : 27/09/2008 21:57:42 Vu / téléchargé: 2 807 / 130

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Bonjour,

Cette classe permet d'afficher les images contenues dans un dossier et d'afficher la première.
Des miniatures des images  sont créées et affichées en dessous, plusieurs affichages sont disponibles.

Voir la capture d'écran pour un aperçu.
 

Source

  • <?php
  • class lectureEnLigne {
  • //
  • // Tiger-222 - 10 Septembre 2008
  • // révisée le 27 Septembre 2008
  • //
  • // http://xpression.123.fr
  • //
  • //
  • // Informations sur la classe :
  • // Classe qui affiche les images contenues dans un dossier donné en paramètre.
  • // Utile pour les sites de scantrad pour un affichage des chapitres du genre
  • // "lecture en ligne" ou tout simplement pour afficher ses photos de vacances
  • // sur son site perso.
  • //
  • //
  • // Note :
  • // La première fois que ce script est lancé, il peut prendre un peu de temps
  • // suivant le nombre d'images qu'il y a dans le dossier.
  • //
  • //
  • // Fonctionnement de la classe :
  • // Pour instancier la classe : $test = new lecureEnLigne('dossier', 'paremetre_ur', 'auteur_miniatures);
  • // Pour afficher une image : $test->image_courante();
  • // Pour récupérer le numéro de l'image précédente : $test->precedente();
  • // Pour récupérer le numéro de l'image suivante : $test->suivante();
  • // Pour récupérer le talbeau des miniatures : $test->lister_miniatures();
  • //
  • //
  • // Exemple :
  • // 1. On instancie la classe
  • // try
  • // {
  • // $test = new lectureEnLigne('[MFT] Naruto Chapitre 416', 'img', 50);
  • // }
  • // catch (Exception $e)
  • // {
  • // echo $e->getMessage();
  • // }
  • //
  • // 2. On affiche l'image courante
  • // echo '<img src="'.$test->image_courante().'" />';
  • //
  • // 3. Un lien vers l'image précédente
  • // echo '<a href="'.$test->precedente().'>Image précédente</a>';
  • //
  • // 4. Un lien vers l'image suivante
  • // echo '<a href="'.$test->suivante().'>Image suivante</a>';
  • //
  • // 5. Affichage des miniatures
  • // A - Solution 1 : lister toutes les miniatures
  • // $miniatures = $test->lister_miniatures();
  • // foreach ($miniatures as $miniature)
  • // {
  • // echo
  • // '<a href="'.$miniature['lien'].'" alt="'.$miniature['titre'].'" >'
  • // .'<img src="'.$miniature['chemin'].'" /></a> ';
  • // }
  • //
  • // B - Solution 2 : lister seulement 3 miniatures : celle de l'image précédente, l'actuelle et la suivante.
  • // $miniatures = $test->trois_miniatures();
  • // foreach ($miniatures as $miniature)
  • // {
  • // echo
  • // '<a href="'.$miniature['lien'].'" alt="'.$miniature['titre'].'" >'
  • // .'<img src="'.$miniature['chemin'].'" /></a> ';
  • // }
  • //
  • //
  • // A vous d'adapter le tout à votre guise !
  • //
  • //
  • // Note : un grand merci à CodeFalse pour son aide (http://www.reflectiv.net).
  • //
  • // Variable pour les erreurs
  • private $_erreur = array(
  • 0 => 'La bibliothèque GD n\'est pas installée.',
  • 1 => 'Veuillez indiquer un dossier à traiter.',
  • 2 => 'Le dossier n\'existe pas.',
  • 3 => 'Le dossier n\'est pas accessible en lecture.',
  • 4 => 'Impossible de faire une copie de l\'image.',
  • 5 => 'Il n\'y a aucune image dans le dossier.');
  • //
  • // Fonction de consctruction de la classe.
  • //
  • // Prend trois arguments :
  • // - le dossier à traiter
  • // - le nom de la variable URL
  • // - la hauteur des miniatures
  • //
  • public function __construct($dossier = NULL, $param_url = NULL, $nouvelle_hauteur = 80)
  • {
  • // La bibliothèque GD est-elle présente ?
  • $this->_test_gd();
  • // Variables
  • $this->dossier = $dossier;
  • $this->param_url = $param_url;
  • $this->nouvelle_hauteur = $nouvelle_hauteur;
  • // Testons les variables
  • $this->_test_dossier();
  • if ( empty($this->nouvelle_hauteur) || !is_numeric($this->nouvelle_hauteur) || $this->nouvelle_hauteur < 1 )
  • {
  • $this->nouvelle_hauteur = 80;
  • }
  • if ( empty($this->param_url) )
  • {
  • $this->param_url = 'imgLeL';
  • }
  • // Remplissons le tableau des images
  • $this->_listage();
  • }
  • // #########################################################
  • // Fonctions de tests
  • //
  • // Fonction qui teste la présence de la bibliothèque GD.
  • //
  • private function _test_gd()
  • {
  • if ( !function_exists('gd_info') )
  • {
  • throw new Exception ($this->_erreur['0']);
  • }
  • }
  • //
  • // Fonction qui teste la validité d'un dossier.
  • //
  • private function _test_dossier()
  • {
  • if ( empty($this->dossier) )
  • {
  • throw new Exception ($this->_erreur['1']);
  • }
  • elseif ( !is_dir($this->dossier) )
  • {
  • throw new Exception ($this->_erreur['2']);
  • }
  • elseif ( !is_readable($this->dossier) )
  • {
  • throw new Exception ($this->_erreur['3']);
  • }
  • }
  • //
  • // Fonction qui teste la validité d'une image.
  • //
  • private function _is_image()
  • {
  • if ( is_file($this->dossier.'/'.$this->fichier) )
  • {
  • $this->infos = getimagesize($this->dossier.'/'.$this->fichier);
  • if ( $this->infos['mime'] === 'image/jpeg' )
  • {
  • return 'jpeg';
  • }
  • elseif ( $this->infos['mime'] == 'image/png' )
  • {
  • return 'png';
  • }
  • }
  • }
  • // #########################################################
  • // Moteur
  • //
  • // Fonction qui créé un tableau contenant les images du dossier.
  • //
  • private function _listage()
  • {
  • $action = opendir($this->dossier);
  • $this->i = 0;
  • $this->tableau = array();
  • // Listons les images dans un tableau :
  • while ($this->fichier = readdir($action))
  • {
  • // S'agit-il d'une image valable ?
  • if ( $this->_is_image() === 'jpeg' || $this->_is_image() === 'png' )
  • {
  • // S'agit-il d'une miniature ?
  • if ( !ereg('mini_', $this->fichier) )
  • {
  • $this->tableau[$this->i] = $this->fichier; // Ajout des fichiers dans un tableau
  • }
  • //elseif ( ) // verifions la taille actuelle de la miniature
  • }
  • ++$this->i;
  • }
  • closedir($action);
  • // Trions les entrées du tableau
  • sort($this->tableau);
  • // Comptons le nombre d'entrées
  • $this->total = count($this->tableau);
  • // Retournons le tableau... ou l'erreur
  • if ( $this->total < 1 )
  • {
  • throw new Exception ($this->_erreur['5']);
  • }
  • else
  • {
  • return $this->tableau;
  • }
  • }
  • //
  • // Fonction qui retourne diverses informations sur l'image.
  • //
  • private function _infos_image()
  • {
  • // Informations de l'image actuelle
  • $this->infos = getimagesize($this->image);
  • $this->largeur_actuelle = $this->infos['0'];
  • $this->hauteur_actuelle = $this->infos['1'];
  • }
  • //
  • // Fonction qui retourne diverses informations sur la miniature.
  • //
  • private function _infos_vignette()
  • {
  • // Informations de l'image actuelle
  • $this->infos = getimagesize($this->vignette);
  • $this->hauteur_actuelle_vignette = $this->infos['1'];
  • }
  • //
  • // Fonction qui permet de redimensionner une image.
  • //
  • private function _redimensionner()
  • {
  • // Nouvelle image
  • if ( $this->infos['mime'] === 'image/jpeg' )
  • {
  • $this->nouvelle_image = imagecreatefromjpeg($this->image);
  • }
  • if ( $this->infos['mime'] === 'image/png' )
  • {
  • $this->nouvelle_image = imagecreatefrompng($this->image);
  • }
  • // Calculons le coefficient de redimensionnement et la nouvelle largeur en conséquence
  • $this->coefficient = $this->nouvelle_hauteur * 100 / $this->hauteur_actuelle;
  • $this->coefficient = round($this->coefficient);
  • $this->nouvelle_largeur = $this->coefficient * $this->largeur_actuelle / 100;
  • // Miniature
  • //
  • // Format de la commande imagecreatetruecolor :
  • // - la largeur de l'image créée
  • // - la hauteur de l'image créée
  • //
  • $this->img_mini = imagecreatetruecolor ($this->nouvelle_largeur, $this->nouvelle_hauteur);
  • //
  • // Format de la commande imagecopyresampled :
  • // - image de destination
  • // - image source
  • // - point de départ en x de l'image de destination
  • // - point de départ en yde l'image de destination
  • // - point de départ en x de l'image source
  • // - point de départ en y de l'image source
  • // - largeur de l'image de destination
  • // - hauteur de l'image de destination
  • // - largeur de l'image source
  • // - hauteur de l'image source
  • //
  • imagecopyresampled($this->img_mini, $this->nouvelle_image, 0, 0, 0, 0, $this->nouvelle_largeur, $this->nouvelle_hauteur, $this->largeur_actuelle, $this->hauteur_actuelle);
  • // Création
  • if ( $this->infos['mime'] === 'image/jpeg' )
  • {
  • //
  • // Format de la commande imagejpg :
  • // - l'image à traiter
  • // - le nom de sortie (si vide, alors la sortie est le navigateur)
  • // - la qualité de l'image
  • //
  • imagejpeg($this->img_mini, $this->vignette, 100);
  • }
  • if ( $this->infos['mime'] === 'image/png' )
  • {
  • //
  • // Format de la commande imagepng :
  • // - l'image à traiter
  • // - le nom de sortie (si vide, alors la sortie est le navigateur)
  • //
  • imagepng($this->img_mini, $this->vignette);
  • }
  • // Suppression des images temporaires
  • imagedestroy($this->nouvelle_image);
  • imagedestroy($this->img_mini);
  • }
  • //
  • // Fonction pour la création de la vignette.
  • //
  • private function _miniature()
  • {
  • // Informations sur l'image
  • $this->_infos_image();
  • // La miniature exite t-elle dékà ?
  • if ( !file_exists($this->vignette) ) // Existe t-elle déjà ?
  • {
  • // Créons la miniature :
  • if ( copy($this->image, $this->vignette) )
  • {
  • $this->_redimensionner(); // Nouvelle vignette à partir de l'image
  • }
  • else
  • {
  • throw new Exception ($this->_erreur['4']);
  • }
  • }
  • else
  • {
  • // Informations sur l'image
  • $this->_infos_vignette();
  • // Voyons si la miniature actuelle répond bien à la hauteur demandée
  • if ( $this->hauteur_actuelle_vignette <> $this->nouvelle_hauteur )
  • {
  • $this->_redimensionner(); // Nouvelle vignette à partir de l'image
  • }
  • }
  • }
  • //
  • // Fonction pour la navigation entre les images.
  • //
  • private function _navigation()
  • {
  • if ( isset($_GET[$this->param_url]) && !empty($_GET[$this->param_url]) && is_numeric($_GET[$this->param_url]) )
  • {
  • if ( $_GET[$this->param_url] == 0 ) // S'il s'agit de la première image
  • {
  • $this->precedent = 0;
  • $this->suivant = $_GET[$this->param_url] + 1;
  • }
  • elseif ( $_GET[$this->param_url] > $this->total - 2 ) // S'il s'agit de la dernière image
  • {
  • $this->precedent = $this->total - 2;
  • $this->suivant = $this->total - 1;
  • }
  • else
  • {
  • $this->precedent = $_GET[$this->param_url] - 1;
  • $this->suivant = $_GET[$this->param_url] + 1;
  • }
  • }
  • else // Aucune variable donc on considère qu'il s'agit de la 1ère image
  • {
  • $this->precedent = 0;
  • $this->suivant = 1;
  • }
  • }
  • //
  • // Fonction qui renvoie l'URL complète de la page.
  • //
  • private function _url_courante()
  • {
  • // Informations :
  • // $_SERVER['HTTP_HOST'] renvoie 127.0.0.1 ou www.site.fr
  • // $_SERVER['SCRIPT_NAME'] renvoie index.php
  • // $_SERVER['QUERY_STRING'] renvoie les paramètres passés à l'URL
  • $this->url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
  • // Transférons le nombre contenu dans le paramètre
  • if ( !empty($_GET[$this->param_url]) )
  • {
  • $nombre = $_GET[$this->param_url];
  • }
  • else
  • {
  • $nombre = '';
  • }
  • if ( !empty($_SERVER['QUERY_STRING']) ) // S'il y a un ou plusieurs paramètres dans l'URL
  • {
  • if ( ereg($this->param_url, $_SERVER['QUERY_STRING']) ) // Si dans ces paramètres, il y a $this->param_url, alors il faut l'enlever
  • {
  • // Détruisons le paramètre
  • unset($_GET[$this->param_url]);
  • // Comptons le nombre d'entrées de $_GET pour voir s'il y a d'autres paramètres
  • $nb_param = count($_GET);
  • if ( $nb_param == 0 ) // S'il n'y a pas d'autres paramètres
  • {
  • // Reconstruisons l'URL sans le paramètre $this->param_url
  • $this->url .= '?';
  • }
  • else
  • {
  • // Reconstruisons l'URL sans le paramètre $this->param_url
  • $this->url .= '?'.http_build_query($_GET).'&';
  • }
  • }
  • else
  • {
  • $this->url .= '?'.$_SERVER['QUERY_STRING'].'&';
  • }
  • }
  • else
  • {
  • $this->url .= '?';
  • }
  • // Redonnons le nombre au paramètre
  • $_GET[$this->param_url] = $nombre;
  • // Retournons l'URL complète prète à l'emploi
  • return $this->url.$this->param_url.'=';
  • }
  • // #########################################################
  • // Résultats
  • //
  • // Fonction pour l'image précédente.
  • //
  • public function precedente()
  • {
  • // Calculons le numéro de l'image précédente
  • $this->_navigation();
  • return $this->_url_courante().$this->precedent;
  • }
  • //
  • // Fonction pour l'image suivante.
  • //
  • public function suivante()
  • {
  • // Calculons le numéro de l'image suivante
  • $this->_navigation();
  • return $this->_url_courante().$this->suivant;
  • }
  • //
  • // Fonction qui affiche l'image courante. Si aucune, alors la première du tableau.
  • //
  • public function image_courante()
  • {
  • if ( isset($_GET[$this->param_url]) && !empty($_GET[$this->param_url]) && is_numeric($_GET[$this->param_url]) )
  • {
  • if ( $_GET[$this->param_url] > $this->total - 2 ) // S'il s'agit de la dernière image
  • {
  • $this->numero_actuel = $this->total - 1; // Variable utile pour a fonction trois_miniatures()
  • return $this->dossier.'/'.$this->tableau[$this->total - 1];
  • }
  • elseif ( !array_key_exists($_GET[$this->param_url], $this->tableau) ) // Si la valeur du paramètre est hors tableau
  • {
  • $this->numero_actuel = 0;
  • return $this->dossier.'/'.$this->tableau['0'];
  • }
  • else
  • {
  • $this->numero_actuel = $_GET[$this->param_url];
  • return $this->dossier.'/'.$this->tableau[$_GET[$this->param_url]];
  • }
  • }
  • else
  • {
  • $this->numero_actuel = 0;
  • return $this->dossier.'/'.$this->tableau['0'];
  • }
  • }
  • //
  • // Fonction qui liste toutes les miniatures dans un tableau.
  • //
  • public function lister_miniatures()
  • {
  • // Variable
  • $this->tab_miniatures = array();
  • for ($this->j = 0; $this->j < $this->total; ++$this->j)
  • {
  • // Variables :
  • $this->image = $this->dossier.'/'.$this->tableau[$this->j]; // Chemin de l'image taille normale
  • $this->vignette = $this->dossier.'/mini_'.$this->tableau[$this->j]; // Chemin de la vignette
  • // Voyons si la miniature existe, sinon on la créé
  • $this->_miniature();
  • // On ajoute tout ça dans un tableau
  • $this->tab_miniatures[$this->j]['lien'] = $this->_url_courante().$this->j; // Numéro de l'image dans le tableau, pour le lien
  • $this->tab_miniatures[$this->j]['titre'] = $this->tableau[$this->j]; // Nom de l'image
  • $this->tab_miniatures[$this->j]['chemin'] = $this->vignette; // Chemin de la miniature
  • }
  • // Retournons le tableau
  • return $this->tab_miniatures;
  • }
  • //
  • // Fonction qui renvoi un tableau contenant 3 miniatures, celle de l'image précédente, l'actuelle et la suivante.
  • //
  • public function trois_miniatures()
  • {
  • // Variable
  • $this->tab_trois_miniatures = array();
  • // On ajoute tout ça dans un tableau
  • for ( $this->j = 0; $this->j < 3; ++$this->j )
  • {
  • // Déterminons le numero de l'image
  • if ( $this->j == 0 ) // Entrée précédente dans le tableau
  • {
  • if ( $this->numero_actuel == 0 )
  • {
  • $this->num = $this->numero_actuel;
  • }
  • else
  • {
  • $this->num = $this->numero_actuel - 1;
  • }
  • }
  • elseif ( $this->j == 1 ) // Entrés actuelle dans le tableau
  • {
  • $this->num = $this->numero_actuel;
  • }
  • else // Entreé suivante dans le tableau
  • {
  • if ( $this->numero_actuel > $this->total - 2 )
  • {
  • $this->num = $this->numero_actuel;
  • }
  • else
  • {
  • $this->num = $this->numero_actuel + 1;
  • }
  • }
  • // Variables :
  • $this->image = $this->dossier.'/'.$this->tableau[$this->num]; // Chemin de l'image taille normale
  • $this->vignette = $this->dossier.'/mini_'.$this->tableau[$this->num]; // Chemin de la vignette
  • // Voyons si la miniature existe, sinon on la créé
  • $this->_miniature();
  • // Miniature précédente
  • $this->tab_trois_miniatures[$this->j]['lien'] = $this->_url_courante().$this->num; // Numéro de l'image dans le tableau, pour le lien
  • $this->tab_trois_miniatures[$this->j]['titre'] = $this->tableau[$this->num]; // Nom de l'image
  • $this->tab_trois_miniatures[$this->j]['chemin'] = $this->vignette; // Chemin de la miniature
  • }
  • // Retournons le tableau
  • return $this->tab_trois_miniatures;
  • }
  • }
  • ?>
<?php
	class lectureEnLigne {
	//
	// Tiger-222 - 10 Septembre 2008
	// révisée le 27 Septembre 2008
	//
	// http://xpression.123.fr
	//
	//
	// Informations sur la classe :
	//	Classe qui affiche les images contenues dans un dossier donné en paramètre.
	//	Utile pour les sites de scantrad pour un affichage des chapitres du genre
	//	"lecture en ligne" ou tout simplement pour afficher ses photos de vacances
	//	sur son site perso.
	//
	//
	// Note :
	//	La première fois que ce script est lancé, il peut prendre un peu de temps
	//	suivant le nombre d'images qu'il y a dans le dossier.
	//
	//
	// Fonctionnement de la classe :
	//	Pour instancier la classe : $test = new lecureEnLigne('dossier', 'paremetre_ur', 'auteur_miniatures);
	//	Pour afficher une image : $test->image_courante();
	//	Pour récupérer le numéro de l'image précédente : $test->precedente();
	//	Pour récupérer le numéro de l'image suivante : $test->suivante();
	//	Pour récupérer le talbeau des miniatures : $test->lister_miniatures();
	//
	//
	// Exemple :
	//	1. On instancie la classe
	//		try
	//		{
	//			$test = new lectureEnLigne('[MFT] Naruto Chapitre 416', 'img', 50);
	//		}
	//		catch (Exception $e)
	//		{
	//			echo $e->getMessage();
	//		}
	//
	//	2. On affiche l'image courante
	//		echo '<img src="'.$test->image_courante().'" />';
	//
	//	3. Un lien vers l'image précédente
	//		echo '<a href="'.$test->precedente().'>Image précédente</a>';
	//
	//	4. Un lien vers l'image suivante
	//		echo '<a href="'.$test->suivante().'>Image suivante</a>';
	//
	//	5. Affichage des miniatures
	//		A - Solution 1 : lister toutes les miniatures
	//			$miniatures = $test->lister_miniatures();
	//			foreach ($miniatures as $miniature)
	//			{
	//				echo
	//					'<a href="'.$miniature['lien'].'" alt="'.$miniature['titre'].'" >'
	//					.'<img src="'.$miniature['chemin'].'" /></a> ';
	//			}
	//
	//		B - Solution 2 : lister seulement 3 miniatures : celle de l'image précédente, l'actuelle et la suivante.
	//			$miniatures = $test->trois_miniatures();
	//			foreach ($miniatures as $miniature)
	//			{
	//				echo
	//					'<a href="'.$miniature['lien'].'" alt="'.$miniature['titre'].'" >'
	//					.'<img src="'.$miniature['chemin'].'" /></a> ';
	//			}
	//
	//
	// A vous d'adapter le tout à votre guise !
	//
	//
	// Note : un grand merci à CodeFalse pour son aide (http://www.reflectiv.net).
	//



		// Variable pour les erreurs
		private $_erreur = array(
			0 => 'La bibliothèque GD n\'est pas installée.',
			1 => 'Veuillez indiquer un dossier à traiter.',
			2 => 'Le dossier n\'existe pas.',
			3 => 'Le dossier n\'est pas accessible en lecture.',
			4 => 'Impossible de faire une copie de l\'image.',
			5 => 'Il n\'y a aucune image dans le dossier.');



		//
		// Fonction de consctruction de la classe.
		//
		// Prend trois arguments :
		//	- le dossier à traiter
		//	- le nom de la variable URL
		//	- la hauteur des miniatures
		//
		public function __construct($dossier = NULL, $param_url = NULL, $nouvelle_hauteur = 80)
		{
			// La bibliothèque GD est-elle présente ?
			$this->_test_gd();

			// Variables
			$this->dossier = $dossier;
			$this->param_url = $param_url;
			$this->nouvelle_hauteur = $nouvelle_hauteur;

			// Testons les variables
			$this->_test_dossier();

			if ( empty($this->nouvelle_hauteur) || !is_numeric($this->nouvelle_hauteur) || $this->nouvelle_hauteur < 1 )
			{
				$this->nouvelle_hauteur = 80;
			}
			if ( empty($this->param_url) )
			{
				$this->param_url = 'imgLeL';
			}

			// Remplissons le tableau des images
			$this->_listage();
		}



		// #########################################################
		//  Fonctions de tests

		//
		// Fonction qui teste la présence de la bibliothèque GD.
		//
		private function _test_gd()
		{
			if ( !function_exists('gd_info') )
			{
				throw new Exception ($this->_erreur['0']);
			}
		}

		//
		// Fonction qui teste la validité d'un dossier.
		//
		private function _test_dossier()
		{
			if ( empty($this->dossier) )
			{
				throw new Exception ($this->_erreur['1']);
			}
			elseif ( !is_dir($this->dossier) )
			{
				throw new Exception ($this->_erreur['2']);
			}
			elseif ( !is_readable($this->dossier) )
			{
				throw new Exception ($this->_erreur['3']);
			}
		}

		//
		// Fonction qui teste la validité d'une image.
		//
		private function _is_image()
		{
			if ( is_file($this->dossier.'/'.$this->fichier) )
			{
				$this->infos = getimagesize($this->dossier.'/'.$this->fichier);

				if ( $this->infos['mime'] === 'image/jpeg' )
				{
					return 'jpeg';
				}
				elseif ( $this->infos['mime'] == 'image/png' )
				{
					return 'png';
				}
			}
		}



		// #########################################################
		// Moteur

		//
		// Fonction qui créé un tableau contenant les images du dossier.
		//
		private function _listage()
		{
			$action = opendir($this->dossier);
			$this->i = 0;
			$this->tableau = array();

			// Listons les images dans un tableau :
			while ($this->fichier = readdir($action))
			{
				// S'agit-il d'une image valable ?
				if ( $this->_is_image() === 'jpeg' || $this->_is_image() === 'png' )
				{
					// S'agit-il d'une miniature ?
					if ( !ereg('mini_', $this->fichier) )
					{
						$this->tableau[$this->i] = $this->fichier; // Ajout des fichiers dans un tableau
					}
					//elseif ( ) // verifions la taille actuelle de la miniature
				}
				++$this->i;
			}
			closedir($action);

			// Trions les entrées du tableau
			sort($this->tableau);

			// Comptons le nombre d'entrées
			$this->total = count($this->tableau);

			// Retournons le tableau... ou l'erreur
			if ( $this->total < 1 )
			{
				throw new Exception ($this->_erreur['5']);
			}
			else
			{
				return $this->tableau;
			}
		}

		//
		// Fonction qui retourne diverses informations sur l'image.
		//
		private function _infos_image()
		{
			// Informations de l'image actuelle
			$this->infos = getimagesize($this->image);
			$this->largeur_actuelle = $this->infos['0'];
			$this->hauteur_actuelle = $this->infos['1'];
		}

		//
		// Fonction qui retourne diverses informations sur la miniature.
		//
		private function _infos_vignette()
		{
			// Informations de l'image actuelle
			$this->infos = getimagesize($this->vignette);
			$this->hauteur_actuelle_vignette = $this->infos['1'];
		}

		//
		// Fonction qui permet de redimensionner une image.
		//
		private function _redimensionner()
		{
			// Nouvelle image
			if ( $this->infos['mime'] === 'image/jpeg' )
			{
				$this->nouvelle_image = imagecreatefromjpeg($this->image);
			}
			if ( $this->infos['mime'] === 'image/png' )
			{
				$this->nouvelle_image = imagecreatefrompng($this->image);
			}

			// Calculons le coefficient de redimensionnement et la nouvelle largeur en conséquence
			$this->coefficient = $this->nouvelle_hauteur * 100 / $this->hauteur_actuelle;
			$this->coefficient = round($this->coefficient);
			$this->nouvelle_largeur = $this->coefficient * $this->largeur_actuelle / 100;

			// Miniature
			//
			// Format de la commande imagecreatetruecolor :
			//	- la largeur de l'image créée
			//	- la hauteur de l'image créée
			//
			$this->img_mini = imagecreatetruecolor ($this->nouvelle_largeur, $this->nouvelle_hauteur);

			//
			// Format de la commande imagecopyresampled :
			//	- image de destination
			//	- image source
			//	- point de départ en x de l'image de destination
			//	- point de départ en yde l'image de destination
			//	- point de départ en x de l'image source
			//	- point de départ en y de l'image source
			//	- largeur de l'image de destination
			//	- hauteur de l'image de destination
			//	- largeur de l'image source
			//	- hauteur de l'image source
			//
			imagecopyresampled($this->img_mini, $this->nouvelle_image, 0, 0, 0, 0, $this->nouvelle_largeur, $this->nouvelle_hauteur, $this->largeur_actuelle, $this->hauteur_actuelle);

			// Création
			if ( $this->infos['mime'] === 'image/jpeg' )
			{
				//
				// Format de la commande imagejpg :
				//	- l'image à traiter
				//	- le nom de sortie (si vide, alors la sortie est le navigateur)
				//	- la qualité de l'image
				//
				imagejpeg($this->img_mini, $this->vignette, 100);
			}
			if ( $this->infos['mime'] === 'image/png' )
			{
				//
				// Format de la commande imagepng :
				//	- l'image à traiter
				//	- le nom de sortie (si vide, alors la sortie est le navigateur)
				//
				imagepng($this->img_mini, $this->vignette);
			}

			// Suppression des images temporaires
			imagedestroy($this->nouvelle_image);
			imagedestroy($this->img_mini);
		}

		//
		// Fonction pour la création de la vignette.
		//
		private function _miniature()
		{
			// Informations sur l'image
			$this->_infos_image();

			// La miniature exite t-elle dékà ?
			if ( !file_exists($this->vignette) ) // Existe t-elle déjà ?
			{
				// Créons la miniature :
				if ( copy($this->image, $this->vignette) )
				{
					$this->_redimensionner(); // Nouvelle vignette à partir de l'image
				}
				else
				{
					throw new Exception ($this->_erreur['4']);
				}
			}
			else
			{
				// Informations sur l'image
				$this->_infos_vignette();

				// Voyons si la miniature actuelle répond bien à la hauteur demandée
				if ( $this->hauteur_actuelle_vignette <> $this->nouvelle_hauteur )
				{
					$this->_redimensionner(); // Nouvelle vignette à partir de l'image
				}
			}
		}

		//
		// Fonction pour la navigation entre les images.
		//
		private function _navigation()
		{
			if ( isset($_GET[$this->param_url]) && !empty($_GET[$this->param_url]) && is_numeric($_GET[$this->param_url]) )
			{
				if ( $_GET[$this->param_url] == 0 ) // S'il s'agit de la première image
				{
					$this->precedent = 0;
					$this->suivant = $_GET[$this->param_url] + 1;
				}
				elseif ( $_GET[$this->param_url] > $this->total - 2 ) // S'il s'agit de la dernière image
				{
					$this->precedent = $this->total - 2;
					$this->suivant = $this->total - 1;
				}
				else
				{
					$this->precedent = $_GET[$this->param_url] - 1;
					$this->suivant = $_GET[$this->param_url] + 1;
				}
			}
			else // Aucune variable donc on considère qu'il s'agit de la 1ère image
			{
				$this->precedent = 0;
				$this->suivant = 1;
			}
		}

		//
		// Fonction qui renvoie l'URL complète de la page.
		//
		private function _url_courante()
		{
			// Informations :
			//	$_SERVER['HTTP_HOST'] renvoie 127.0.0.1 ou www.site.fr
			//	$_SERVER['SCRIPT_NAME'] renvoie index.php
			//	$_SERVER['QUERY_STRING'] renvoie les paramètres passés à l'URL

			$this->url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];

			// Transférons le nombre contenu dans le paramètre
			if ( !empty($_GET[$this->param_url]) )
			{
				$nombre = $_GET[$this->param_url];
			}
			else
			{
				$nombre = '';
			}

			if ( !empty($_SERVER['QUERY_STRING']) ) // S'il y a un ou plusieurs paramètres dans l'URL
			{
				if ( ereg($this->param_url, $_SERVER['QUERY_STRING']) ) // Si dans ces paramètres, il y a $this->param_url, alors il faut l'enlever
				{

					// Détruisons le paramètre
					unset($_GET[$this->param_url]);

					// Comptons le nombre d'entrées de $_GET pour voir s'il y a d'autres paramètres
					$nb_param = count($_GET);

					if ( $nb_param == 0 ) // S'il n'y a pas d'autres paramètres
					{
						// Reconstruisons l'URL sans le paramètre $this->param_url
						$this->url .= '?';
					}
					else
					{
						// Reconstruisons l'URL sans le paramètre $this->param_url
						$this->url .= '?'.http_build_query($_GET).'&';
					}
				}
				else
				{
					$this->url .= '?'.$_SERVER['QUERY_STRING'].'&';
				}
			}
			else
			{
				$this->url .= '?';
			}

			// Redonnons le nombre au paramètre
			$_GET[$this->param_url] = $nombre;

			// Retournons l'URL complète prète à l'emploi
			return $this->url.$this->param_url.'=';
		}



		// #########################################################
		// Résultats

		//
		// Fonction pour l'image précédente.
		//
		public function precedente()
		{
			// Calculons le numéro de l'image précédente
			$this->_navigation();

			return $this->_url_courante().$this->precedent;
		}

		//
		// Fonction pour l'image suivante.
		//
		public function suivante()
		{
			// Calculons le numéro de l'image suivante
			$this->_navigation();

			return $this->_url_courante().$this->suivant;
		}

		//
		// Fonction qui affiche l'image courante. Si aucune, alors la première du tableau.
		//
		public function image_courante()
		{
			if ( isset($_GET[$this->param_url]) && !empty($_GET[$this->param_url]) && is_numeric($_GET[$this->param_url]) )
			{
				if ( $_GET[$this->param_url] > $this->total - 2 ) // S'il s'agit de la dernière image
				{
					$this->numero_actuel = $this->total - 1; // Variable utile pour a fonction trois_miniatures()
					return $this->dossier.'/'.$this->tableau[$this->total - 1];
				}
				elseif ( !array_key_exists($_GET[$this->param_url], $this->tableau) ) // Si la valeur du paramètre est hors tableau
				{
					$this->numero_actuel = 0;
					return $this->dossier.'/'.$this->tableau['0'];
				}
				else
				{
					$this->numero_actuel = $_GET[$this->param_url];
					return $this->dossier.'/'.$this->tableau[$_GET[$this->param_url]];
				}
			}
			else
			{
				$this->numero_actuel = 0;
				return $this->dossier.'/'.$this->tableau['0'];
			}
		}

		//
		// Fonction qui liste toutes les miniatures dans un tableau.
		//
		public function lister_miniatures()
		{
			//  Variable
			$this->tab_miniatures = array();

			for ($this->j = 0; $this->j < $this->total; ++$this->j)
			{
				// Variables :
				$this->image = $this->dossier.'/'.$this->tableau[$this->j]; // Chemin de l'image taille normale
				$this->vignette =  $this->dossier.'/mini_'.$this->tableau[$this->j]; // Chemin de la vignette

				// Voyons si la miniature existe, sinon on la créé
				$this->_miniature();

				// On ajoute tout ça dans un tableau
				$this->tab_miniatures[$this->j]['lien'] = $this->_url_courante().$this->j; // Numéro de l'image dans le tableau, pour le lien
				$this->tab_miniatures[$this->j]['titre'] = $this->tableau[$this->j]; // Nom de l'image
				$this->tab_miniatures[$this->j]['chemin'] = $this->vignette; // Chemin de la miniature
			}

			// Retournons le tableau
			return $this->tab_miniatures;
		}

		//
		// Fonction qui renvoi un tableau contenant 3 miniatures, celle de l'image précédente, l'actuelle et la suivante.
		//
		public function trois_miniatures()
		{
			// Variable
			$this->tab_trois_miniatures = array();

			// On ajoute tout ça dans un tableau
			for ( $this->j = 0; $this->j < 3; ++$this->j )
			{
				// Déterminons le numero de l'image
				if ( $this->j == 0 ) // Entrée précédente dans le tableau
				{
					if ( $this->numero_actuel == 0 )
					{
						$this->num = $this->numero_actuel;
					}
					else
					{
						$this->num = $this->numero_actuel - 1;
					}
				}
				elseif ( $this->j == 1 ) // Entrés actuelle dans le tableau
				{
					$this->num = $this->numero_actuel;
				}
				else // Entreé suivante dans le tableau
				{
					if ( $this->numero_actuel > $this->total - 2 )
					{
						$this->num = $this->numero_actuel;
					}
					else
					{
						$this->num =  $this->numero_actuel + 1;
					}
				}

				// Variables :
				$this->image = $this->dossier.'/'.$this->tableau[$this->num]; // Chemin de l'image taille normale
				$this->vignette =  $this->dossier.'/mini_'.$this->tableau[$this->num]; // Chemin de la vignette

				// Voyons si la miniature existe, sinon on la créé
				$this->_miniature();

				// Miniature précédente
				$this->tab_trois_miniatures[$this->j]['lien'] = $this->_url_courante().$this->num; // Numéro de l'image dans le tableau, pour le lien
				$this->tab_trois_miniatures[$this->j]['titre'] = $this->tableau[$this->num]; // Nom de l'image
				$this->tab_trois_miniatures[$this->j]['chemin'] = $this->vignette; // Chemin de la miniature
			}

			// Retournons le tableau
			return $this->tab_trois_miniatures;
		}
	}
?>

Conclusion

Voir les informations commentées pour la mise en place.

Merci à CodeFalse ;D
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

18 septembre 2008 11:31:20 :
Modification des commentaires.
19 septembre 2008 17:47:56 :
Grosse modification de la classe pour prendre en compte le commentaire de CodeFalse. l y a donc la classe lectureEnLigne pour le traitement (indispensable) et dans le zip il y a le fichier template (très optionel, c'est seulement pour avoir un rapide aperçu des fonctionnalités).
19 septembre 2008 18:08:14 :
Test de la constante avant de la définir.
20 septembre 2008 22:26:04 :
Améliorations apportées suite au 2ème commentaire de CodeFalse. Plus ajout de vérifications diverses.
21 septembre 2008 22:32:53 :
Dernière MAJ : changement de la fonction qui gère les erreurs par une variable.
27 septembre 2008 21:57:42 :
Nouvelle fonctionnalité : possibilité de choisir un affichage de 3 miniatures (image précédente, actuelle et suivante). Ajout de divers tests et de deux templates.

Commentaires et avis

signaler à un administrateur
Commentaire de codefalse le 18/09/2008 15:00:56 administrateur CS

J'ai bien aimé l'idée de la classe, j'ai bien apprécié le style de code dans la classe ... jusqu'à la moitié !
Pourquoi ?

PAS DE HTML DANS TES CLASSES !!!

Si j'ai un style perso sur mon site et que je veux utiliser ta classe, sans adaptation, je suis coincé. Donc si je cherche une classe de ce style, je ne prendrais pas la tienne car d'autres proposent le même rendu (ou presque) sans me forcer à modifier ton code !

Tu peux créer une classe externe qui utilise un template pour le rendu, ou prendre directement un fichier php simple et faire des trucs genre
<img src="<?php echo $myImageClass->path; ?>" alt="<?php echo $myImageClass->title; ?>" />
et pour la liste des images
<?php
$Images = $myImageClass->getAll ();
foreach ($Images as $Image) {
   <img src="<?php echo $Image['path']; ?>" alt="<?php echo $Image['title']; ?>" />
}
?>

comme ca l'utilisateur de ta classe n'aura qu'à adapter la partie html à son site, et c'est tout !

signaler à un administrateur
Commentaire de tiger222 le 19/09/2008 17:49:34

Merci du retour CodeFalse. Les modifications ont été apportées !

signaler à un administrateur
Commentaire de codefalse le 19/09/2008 19:56:39 administrateur CS

Bon, ca s'améliore, et je te félicite pour l'effort que tu y as mis :)

Cependant, j'ai encore quelques remarques (histoire de perfectionner la chose encore)

Ta fonction erreur, qu'est-ce que je vois dedans ??? Nan mais ??? Lance des exceptions plutôt, c'est à l'utilisateur de ta classe de faire en sorte d'attraper les exceptions que tu lance afin que son code se déroule bien (throw new Exception ($this->tableau_erreur[$numero]);)
Par ailleur, quand tu appel cette fonction, tu lui passe en paramètre un nombre mais en string ($this->erreur('3');), c'est un nombre, passe le comme tel ($this->erreur(3);)

Ensuite, tes méthodes suivant et précédent, tu propose une url avec ?[constante]=$var, constante étant param_url et valant forcément img. Je te met devant deux problemes :
Si ma page possède d'autres paramètres en GET, avec ton script je suis coincé ca marchera pas (genre id_repertoire=3 pour une requete dans une bdd (par ex)), ton script va me forcer l'affichage de ma page avec img=x et mon script ne saura plus quel repertoire correspond la page en cours.
Autre problème, si j'ai déjà une variable en GET qui s'appele img (pour une raison quelconque), ton script va la modifier à son usage, voir pire, va planter car le paramètre fourni pour la valeur $_GET['img'] ne sera pas celui auquel il s'attends (ca peux être le répertoire, car j'ai décidé que mon repertoire serait passé en get, par la clée "img").

Moralité : propose le nom de variable comme paramètre, et prends en compte les autres arguments de la page actuelle.

Petit point négligeable, en règle général, on préfixe les fonctions privées/protégées par un _ (private function _myPrivateFunction). Mais c'est rien de bien important ;)

Dernier point, et non des moindres : Ta fonction lister_miniatures retourne un tableau de valeurs, c'est pas mal. Le niveau au dessus maintenant, c'est de se tourner vers la SPL, notament vers les interfaces Iterate, Seekable et Countable, qui te permette de parcourir un résultat juste avec un foreach !
(imagine :
<?php
$obj = new lectureEnLigne ('images/');
foreach ($obj as $images) {
   echo '<img src="'.$images['path'].'" alt="'.$images['title'].'" /><br />';
}
?>

Et voila, toutes mes images sont affichées !
C'est d'un niveau supérieur, mais ca vaut franchement le coup !

A toi de voir :)

Mais bon boulot quand même ! :)

J'attends ton prochain commentaire pour noter (si tu préfère t'arreter là) ou continuer (auquel cas je noterai après la prochaine mise à jours)

signaler à un administrateur
Commentaire de tiger222 le 20/09/2008 22:36:10

Merci beaucoup pour ces indications !

Du coup, j'ai changé les noms des fonctions privées, mis en place la gestion des erreurs, le lien pour les fonctions precedente et suivante a été revu pour prendre en compte l'URL complète, et si jamais l'utilisateur entre manuellement un numéro dans l'URL mais qu'il n'existe pas dans le tableau, alors on redirige vers l'image de départ.

J'ai commencé à regarder pour la SPL, mais c'est tout nouveau, je mettrai à jour dès que ce sera au point.

Merci ;)

signaler à un administrateur
Commentaire de codefalse le 21/09/2008 16:07:09 administrateur CS 8/10

C'est de mieux en mieux ! :)

Maintenant que tu lance des exceptions, tu n'a plus vraiment besoin de la fonction "erreur". En effet, à chaque erreur lancée, tu crée un tableau qui contient les différents messages d'erreur. Pourquoi ne pas les mettres dans la structure de la table ? genre
<?php
class MyClass {
   private $_Errors = array (0 => 'erreur 1',
                             1 => 'erreyr 2',
                             2 => ... etc...);
}
?>
comme cela dans ton code tu n'a plus qu'a faire
throw new Exception ($this->_Errors[x]); avec X, l'index correspondant à l'erreur !

Pour le parcours du dossier, tu peux jeter un oeil à DirectoryIterator, qui est une amélioration (et un passage en objet) de opendir et cie.

Mais tout ca, ce n'est que des broutilles ! :)

Très bon boulot et beaux efforts de ta part de mettre le code à jour ! :)

Je te met 8/10 :)

signaler à un administrateur
Commentaire de tiger222 le 21/09/2008 22:47:56

Voilà, la dernière MAJ vient d'être faite, j'en reste là pour cette classe.

Je te remercie grandement pour ton aide et conseil.
Je partirai sur de meilleures bases pour mes futures classes !

Merci !

;)

signaler à un administrateur
Commentaire de codefalse le 21/09/2008 23:22:19 administrateur CS

C'est déjà franchement pas mal, ce que je te proposais à la fin, c'était des améliorations non essentielles.

De toute facon on peux toujours améliorer un code, il y a un dicton qui dit qu'un programme n'est vraiment terminé qu'à la mort de tous ses développeurs :p

L'essentiel, c'est que tu comprenne ce que tu fait et que tu progresse. Si tu t'intéresse à la SPL, tu va découvrir de nouveaux horizons, etc.

Continue, apprends, renseigne toi, instruit toi, et tu ne feras que progresser :)

signaler à un administrateur
Commentaire de longshot41 le 22/09/2008 19:46:59

J aime bien lire ton code, pas encore testé, mais c'est simpa de voir du code propre (en premiere lecture ;) ) Fallait le dire!

signaler à un administrateur
Commentaire de tiger222 le 22/09/2008 21:30:50

Merci LongShot41 !

signaler à un administrateur
Commentaire de tiger222 le 27/09/2008 22:02:49

Mise à jour moyenne : possibilité d'avoir un affichage moins "lourd" pour les miniatures. Seulement 3 seront affichées, celle de l'image précédente, l'image actuelle et l'image suivante. Niveau ressources ça allège pas mal la chose puisque seulement 3 miniatures seront créées (si inexistantes) et ensuite une seule par page (la suivante).

J'ai ajouté une vérification au niveau de la hauteur des miniatures existantes; avant, je ne vérifiais que le nom de la miniature, du coup si l'utilisateur changeait la valeur de leur hauteur de celles-ci, ce n'était pas pris en compte.

++@ !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Copyright image [ par kimengumi ] BonjourJ'ai bien aimé le script de webdesignasp pour écrire un copyright sur les images.En fait, j'enregistre l'image telle quelle sur mon serveur et générer des miniatures avec gd 1.6 [ par vegetaline ] muhaha alors là c'est rigolo, un super défi pour les programmeurs fous!ok j'ai le code pour générer des miniatures grâce au php, mais ça marche qu'ave Liens PHP (appel d'un fichier PHP) [ par vincf1 ] Bonjour à tous tout d'abord Voila, j'explique mon petit soucis (je suis novice en PHP ).Mon but est d'afficher une image miniat texte sur image... librairie GD ? [ par ozitoun ] Bonjour bonjour,voili voilou, je cherche à mettre une texte sur une image (jpeg).j'ai essayé les imagestring, imagechar... mais à chaque fois les exem Couper le bas d'une image (GD PHP) [ par dezeque ] bonjour,j'aimerai savoir comment faire pour couper le bas d'une image ?elle fais 600X800 et j'aimerai enlver les 50 dernirers pixels du bas pour quell Problème d'affichage avec la libraire GD [ par CMOIPOPO ] Salut &#224; tous,Je souhaite dessiner tout b&#234;tement un rectangle en php (je travaille en local)&nbsp;&#224; l'aide de la libraire GD. Pour cela, Librairie GD, Besoin d'aide !!! [ par Astalavista ] &nbsp;&nbsp;&nbsp; Bon, je post ca, car je n'arrive pas a trouver ... :( Je cherche un moyen de fair un Stretch sur une image, C'est a dir de deformer [BLOB->GD] Redimensionner un "flux image binaire"... [ par arnal69130 ] Bonjour &#224; tous,Je cherche &#224; faire une page pour afficher la carte d'identit&#233; d'un "agent", pour simplifier disons juste son nom et sa p Où est l'érreur ? (Image Miniature) [ par ImmortalPC ] Salut, apr&#232;s avoir cherch&#233; une solution pour faire une image miniature en automatique j'ai finalement trouv&#233; un script super Voici le s Librairie GD [ par Stephan45120 ] J'orai besoin de superposer 2 images. La première en arrière plan et l'autre en calque par dessus(transparente à certain endroit). Ce que je veux arri


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.