Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/02/2011, 18h52   #1
Invité de passage
 
Inscription : février 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 2
Points : 0
Points : 0
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 :
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>
phophop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2011, 19h40   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
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 :
1
2
3
 
public $relpatch;
public $webpatch;
Est-ce que par hasard tu voulais dire realpath et webpath ?

Code :
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 :
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 :
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 :
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 13h00   #3
Invité de passage
 
Inscription : février 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 2
Points : 0
Points : 0
2eme version avec les qlque conseil apporter.
parcontre je ne voi pas comment empeché de continué si ya une exception.
Code :
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>
phophop est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h04.


 
 
 
 
Partenaires

Hébergement Web