IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Class Galerie d'image


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut Class Galerie d'image
    Je poste cette source en tant que débutant des class.
    Après des années à faire du php tjrs a la vieille mode limite du php3, j'ai donc entrepris de créer une class pour voir comment ça marché vraiment...

    Ce script bien que fonctionnel est surement loin d être correct et optimisé... je le poste d ailleurs pour ça car j'aimerai que l'on m'explique ( et pas critique hein ) mes erreurs.

    Alors cette class donc:
    après récupération du nom du répertoire dans une table sql, vérification si le répertoire existe bien, affiche donc les photos du répertoire par page.

    j'attend des commentaires constructif pour me permettre de comprendre ce que j'ai mal fait
    Merci à vous


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    <?php
    	class viewgallery {
    		public $id;
    		public $name_gallery;
    		public $type;
    		public $w;
    		public $h;
    		public $rw;
    		public $rh;
    		public $rtop;
    		public $relpatch;
    		public $webpatch;
    		public $nombre_pic;
    		public $nombre_ppage;
    		public $page;
    		public $verif;
    		public $name;
    		public $pic;
    		public $nbpage;
    		public $page_back;
    		public $page_next;
    		public $affiche_pic; 
     
    		   public function __construct($id) {
    		 	$this->id = $id;
    			}
     
    		// recherche des infos dans la sql
    		private function get_sql() {
    			global $db;
    			$sql = "SELECT * FROM `".TABLE_GALLERY."` WHERE `id`='".$this->id."' limit 1";
    			$args = $db->query_first($sql);
    			$this->name_gallery = $args['name_gallery']; //repertoir des images
    			$this->type = $args['type']; //type d'affichage
    			$this->w = $args['w']; // largeur maxi de l'image
    			$this->h = $args['h']; // hauteur maxi de l'image
    			$this->nombre_ppage = $args['var'];	// nombre par page
     
    			if($this->w==0) { $this->w=300; }
    			elseif($this->w>1000) { $this->w=1000; }   // test des dimention demander
     
    			if($this->h==0) { $this->h=300; }
    			elseif($this->h>1000) { $this->h=1000; }	
    		}
     
     
    		// verifie si le repertoir est bien present
    		public function verif_dir() {
    		if(is_dir("".$this->relpatch."".$this->name_gallery."")) { $this->verif = true; }
    		else { $this->verif = false; }
    		}
     
     
    		// recup des image du repertoire
    		public function get_array_pic() {
    		$dh = opendir("".$this->relpatch."".$this->name_gallery.""); 
    			while (false !== ($filename = readdir($dh))) { $files[] = $filename; }
    			closedir($dh);
    			sort($files);
    			for ($i=0;$i<=count($files);$i++)
    		 		{
    			        if ($files[$i] != "." && $files[$i] != ".." && $files[$i]!="index.html" && $files[$i]!=null) {
    					$this->pic[] = $files[$i];
    			        }
    			}
    			$this->nombre_pic = count($this->pic); // combien d'image dans le rep
    			$this->name = ucfirst(str_replace("_","",str_replace("MA_DIR_","",$this->name_gallery))); // nétoie le nom du rep
    		}
     
     
    		// redimention d'image
    		public function dim_image($img) {
    		   	$dst_w = $this->w;
    		   	$dst_h = $this->h;
    		   	$size = GetImageSize("".$this->relpatch."".$this->name_gallery."/".$img.""); // taille reel de l'image 
    		   	$src_w = $size[0]; 
    		   	$src_h = $size[1];
    		  		$test_h = round(($dst_w / $src_w) * $src_h);
    		  		$test_w = round(($dst_h / $src_h) * $src_w);
     
    			if(!$dst_h) { $dst_h = $test_h; }
    		  		elseif(!$dst_w) { $dst_w = $test_w; }
    		  		elseif($test_h>$dst_h) { $dst_w = $test_w; }
    		  		else { $dst_h = $test_h; }
     
    		 		if($dst_h > 1 && $dst_h < $this->h){	// centre l'image
    				$top = ceil(($this->h - $dst_h) / 2);
    			} else { $top = 0; }  
     
    			$this->rtop = $top;
    			$this->rw = $dst_w;
    			$this->rh = $dst_h;
    		}
     
     
    		public function view($page=0) {
    		$this->get_sql();
    		$this->verif_dir();	
    		if($this->verif==true) { 
    			$this->get_array_pic();	// recup des images du repertoire
    			$this->page = $page; // recup de la page en cour
    			$this->nbpage = round($this->nombre_pic / $this->nombre_ppage);	// nombre de page
     
    			if($this->page > $this->nbpage-1) { $this->page=0; } // si page en cour plus grand que le nombre de page on retourne au debut
     
    			if($this->page!=0) { $this->page_back = $this->page-1; } else { $this->page_back = 0; }	// page retour
    			if($this->page+1 < $this->nbpage) { $this->page_next = $this->page+1; } else { $this->page_next = 0; }	// page suivant
     
    			$varpic_debut = $this->page*$this->nombre_ppage;
    			$varpic_fin = ($this->page+1)*$this->nombre_ppage; 
     
    				foreach ($this->pic as $key => $value)
    					  {
    						  if($key>=$varpic_debut && $key<$varpic_fin) { 
    						  $this->dim_image($value);
    						  // image a afficher
    						  $this->affiche_pic[] = '<img src="'.$this->webpatch.''.$this->name_gallery.'/'.$value.'" width="'.$this->rw.'" height="'.$this->rh.'" style="margin-bottom:'.$this->rtop.'px"/>'."\n";
    						  } 
    					  }
    				}
    			else
    			{
    			echo "Erreur: Répertoire galerie non valide.";
    			}
    		   }
    	 }
    ?>
     
    <?php
    // contenue de la page  
    $gallery = new viewgallery('14'); 
    $gallery->relpatch = "/le/chemin/complet/du/rep/files/images/";
    $gallery->webpatch = "../files/images/";
    $gallery->view($_GET['page']);
    ?> 
     
    <table>	
    	<tr>
    		<td colspan="3">Galerie : <?= $gallery->name ?></td>
    	<tr>
    	<td><a href="?op=test&page=<?= $gallery->page_back ?>"> back </a></td>
    	<td><?php if($gallery->verif==true) { foreach ($gallery->affiche_pic as $img) { echo $img; } } ?></td>
    	<td><a href="?op=test&page=<?= $gallery->page_next ?>"> next </a></td>
    	</tr>
    </table>

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Je vais essayer de commenter (sans trop critiquer ) au fil de l'eau en lisant ta classe.

    Je vois que toutes les propriétés de la classe sont publiques: est ce que leur visibilité est cohérente avec l'utilisation qu'on fait de la classe ? Est ce que par hasard bon nombre de ces attributs sont destinés à l'usage interne de la classe et devraient donc être protégés ou privés ?
    Personnellement je mets toujours tout en protégé et je donne les méthodes getter setter pour que la classe ait toujours le contrôle sur ses propres attributs, mais c'est à toi de voir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public $relpatch;
    public $webpatch;
    Est-ce que par hasard tu voulais dire realpath et webpath ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function __construct($id) {
      $this->id = $id;
    }
    Ne serait-il pas judicieux de tester cet ID au moyen d'une requête simple et éventuellement de lever une exception si cet ID ne corresponds à aucun enregistrement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private function get_sql() {
    Personnellement, comme PHP par ailleurs, j'utilise la nomenclature Java pour les noms des attributs/méthodes soit MyClass::myMethod();
    A toi de choisir un formalisme tant que tu t'y tiens

    Ne serait-il pas judicieux d'utiliser un Singleton de PDO plutôt que de passer une variable de script en script ? Celle là est pas trop mal: http://tonylandis.com/php/php5-pdo-singleton-class/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // recup des image du repertoire
    		public function get_array_pic() {
    		$dh = opendir("".$this->relpatch."".$this->name_gallery.""); 
    			while (false !== ($filename = readdir($dh))) { $files[] = $filename; }
    			closedir($dh);
    			sort($files);
    			for ($i=0;$i<=count($files);$i++)
    		 		{
    			        if ($files[$i] != "." && $files[$i] != ".." && $files[$i]!="index.html" && $files[$i]!=null) {
    					$this->pic[] = $files[$i];
    			        }
    			}
    			$this->nombre_pic = count($this->pic); // combien d'image dans le rep
    			$this->name = ucfirst(str_replace("_","",str_replace("MA_DIR_","",$this->name_gallery))); // nétoie le nom du rep
    		}
    Je vois ici que tu utilise une syntaxe itérative pour réccupérer tes images. Maintenant que tu fais de l'objet, autant se servir des classes de PHP et de la SPL: http://www.php.net/~helly/php/ext/spl/
    Avec SplFileObject tu peux obtenir les fichiers d'un répertoire, tu mets un iterateur dessus pour filtrer les types de fichiers qui t'intéressent avec une classe étendue de FilterIterator et c'est fait. On verra comment faire dans les post suivant si tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public function view($page=0) {
    Si tu considère cette classe comme un helper HTML (une classe destinée à facilité la construction des vues) alors cette méthode pourrait devenir magique. Pourquoi ne pas utiliser __toString ce que te permettrait de faire "echo $my_gallery;". On peut aussi imaginer quelque chose du genre "echo $my_gallery($page);" qui appellerait la méthode magique __invoke de ton object.

    En somme, tu as bien saisi le mécanisme de l'encapsulation mais on dirait que tu as juste copié/collé ton processus iteratif et que tu l'as découpé en méthodes avant de tout jeter dans une classe. Tout n'est certes pas à refaire mais tant qu'a faire de l'objet on pourrait optimiser grandement ce code.

    De plus, cette classe est à la fois une classe modèle - ou de données - (en ce sens qu'elle accède à la BDD), une classe métier - ou application - (en ce sens qu'elle effectue des opération comme le redimentionnement d'images par exemple) et une classe de vue - ou de présentation - (en ce sens qu'elle peut s'afficher ou afficher des informations).
    Habituellement, on découpe ces 3 aspects dans des classes différentes de manière à améliorer la flexibilité de ton application. Tu peux lire un article qui traite de ça ici: http://fr.wikipedia.org/wiki/Architecture_trois_tiers

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut
    2eme version avec les qlque conseil apporter.
    parcontre je ne voi pas comment empeché de continué si ya une exception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    <?php 
     
    	   class MyException extends Exception { 
    		    public function __construct($msg=NULL, $code=0) 
    		    { 
    		        parent::__construct($msg, $code); 
    		    }  
    		} 
     
     
    	class Gallery {
    		private $rw;
    		private $rh;
    		private $rtop;
    		private $w;
    		private $h;
    		private $pic;
    		private $nbpage; 
     
    		public $nombre_pic;
    		public $page;
    		public $page_back;
    		public $page_next;
    		public $affiche_pic;
    		public $realpath;
    		public $webpath;
    		public $nombre_ppage;
    		public $name_gallery;
    		public $type;
     
     
    		   public function __construct() {
    			}
     
    			public function data($rep,$type,$w,$h,$nbpp) { 
    			if(is_dir($this->realpath.$rep)) {
    				$nbfiles=0;
    				$Dir=new RecursiveDirectoryIterator($this->realpath.$this->name_gallery);
    				foreach (new RecursiveIteratorIterator($Dir) as $filename=>$cur) {
    					if($cur->getFilename()!="index.html") {
    						$nbfiles++;
    						$this->pic[]=$cur->getFilename();
    					}
    				}
    				sort($this->pic);
    				$this->nombre_pic = count($this->pic);
    				$this->name_gallery = $rep; //repertoir des images
    				$this->type = $type; //type d'affichage
    				$this->w = $w; // largeur maxi de l'image
    				$this->h = $h; // hauteur maxi de l'image
    				$this->nombre_ppage = $nbpp;	// nombre par page
    				if($this->w==0) { $this->w=300; }
    				elseif($this->w>1000) { $this->w=1000; }   // test des dimention demander
    				if($this->h==0) { $this->h=300; }
    				elseif($this->h>1000) { $this->h=1000; }	
    			} 
    			else
    			 {
    		 		throw new MyException('Erreur de repertoire'); 
    		 	 }
    		}			
     
    		// redimention d'image
    		public function RedimImage($img) {
    		if(GetImageSize("".$this->realpath."".$this->name_gallery."/".$img."")) { 
    		   	$dst_w = $this->w;
    		   	$dst_h = $this->h;
    		   	$size = GetImageSize("".$this->realpath."".$this->name_gallery."/".$img.""); // taille reel de l'image 
    		   	$src_w = $size[0]; 
    		   	$src_h = $size[1];
    		  		$test_h = round(($dst_w / $src_w) * $src_h);
    		  		$test_w = round(($dst_h / $src_h) * $src_w);
     
    			if(!$dst_h) { $dst_h = $test_h; }
    		  		elseif(!$dst_w) { $dst_w = $test_w; }
    		  		elseif($test_h>$dst_h) { $dst_w = $test_w; }
    		  		else { $dst_h = $test_h; }
     
    		 	if($dst_h > 1 && $dst_h < $this->h){	// centre l'image
    				$top = ceil(($this->h - $dst_h) / 2);
    			} else { $top = 0; }  
     
    			$this->rtop = $top;
    			$this->rw = $dst_w;
    			$this->rh = $dst_h;
    		 }
    		 else
    		 {
    		 	throw new MyException('Erreur de redimention'); 
    		 }
    		}
     
     
    		public function ViewGallery($page=0) {
    			$this->page = $page; // recup de la page en cour
    			$this->nbpage = round($this->nombre_pic / $this->nombre_ppage);	// nombre de page
     
    			if($this->page > $this->nbpage-1) { $this->page=0; } // si page en cour plus grand que le nombre de page on retourne au debut
     
    			if($this->page!=0) { $this->page_back = $this->page-1; } else { $this->page_back = 0; }	// page retour
    			if($this->page+1 < $this->nbpage) { $this->page_next = $this->page+1; } else { $this->page_next = 0; }	// page suivant
     
    			$varpic_debut = $this->page*$this->nombre_ppage;
    			$varpic_fin = ($this->page+1)*$this->nombre_ppage; 
     
    							foreach ($this->pic as $key => $value) {
    						  if($key>=$varpic_debut && $key<$varpic_fin) { 
    						  $this->RedimImage($value);
    						  $args = array($value,
    						  				$this->rw,
    										$this->rh,
    										$this->rtop);
    						  $this->affiche_pic[] = $args;
    					  } 
    				  }
    		} 
    }
    ?>
     
     
    <?php
    // contenue de la page 
    try{ 
    $gallery = new Gallery();
    $gallery->realpath = "/home/website/public_html/files/images/";
    $gallery->webpath = "../files/images/";
    $gallery->data('MA_DIR_equipe2','1','300','300','10'); 
    $gallery->ViewGallery($_GET['page']);
    }
    catch(MyException $e)
    {
    echo 'Oops un bug : ' .$e->getMessage() . ' à la ligne : ' . $e ->getLine();
    }
     
    ?> 
     
    <table>	
    	<td><a href="?op=test&page=<?= $gallery->page_back ?>"> back </a></td>
    	<td><?php for($i=0;$i<count($gallery->affiche_pic);$i++) { echo '<img src="'.$gallery->webpath.$gallery->name_gallery.'/'.$gallery->affiche_pic[$i][0].'" width="'.$gallery->affiche_pic[$i][1].'" height="'.$gallery->affiche_pic[$i][2].'" style="margin-bottom:'.$gallery->affiche_pic[$i][3].'px"/>'; }  ?></td>
    	<td><a href="?op=test&page=<?= $gallery->page_next ?>"> next </a></td>
    	</tr>
    </table>

Discussions similaires

  1. [Galerie] Galerie d'image
    Par cjacquel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 17/08/2006, 19h25
  2. une galerie d'images
    Par Le Mage Noir dans le forum Langage
    Réponses: 9
    Dernier message: 19/03/2006, 22h57
  3. galerie d'image qui s'ouvre dans une autre fenêtre
    Par crampouz dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 17/02/2006, 15h17
  4. [Galerie] Galeries d'images : feedback ?
    Par Mr N. dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 14/11/2005, 17h39
  5. [Images] Finalisation Galerie d'image
    Par jexl dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 14/11/2005, 12h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo