Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 912 | Rev 1059 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 912 Rev 1058
1
<?php
1
<?php
2
// declare(encoding='UTF-8');
2
// declare(encoding='UTF-8');
3
/**
3
/**
4
 * Classe abstraite dont chaque controleur de l'application doit hériter.
4
 * Classe abstraite dont chaque controleur de l'application doit hériter.
5
 *
5
 *
6
 * @category	PHP 5.2
6
 * @category	PHP 5.2
7
 * @package		eflore-consultation
7
 * @package		eflore-consultation
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
9
 * @author		Delphine CAUQUIL <delphine@tela-botanica.org>
10
 * @copyright	2011 Tela-Botanica
10
 * @copyright	2011 Tela-Botanica
11
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
11
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
12
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
12
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
13
 * @version		$Id$
13
 * @version		$Id$
14
 */
14
 */
15
abstract class aControleur extends Controleur {
15
abstract class aControleur extends Controleur {
16
 
16
 
17
	const META_TITRE = 'titre';
17
	const META_TITRE = 'titre';
18
	const META_DESCRIPTION = 'description';
18
	const META_DESCRIPTION = 'description';
19
	const META_TAGS = 'tags';
19
	const META_TAGS = 'tags';
20
	const ENTETE = 'entete';
20
	const ENTETE = 'entete';
21
	const RENDU_TETE = 'tete';
21
	const RENDU_TETE = 'tete';
22
	const RENDU_CORPS = 'corps';
22
	const RENDU_CORPS = 'corps';
23
	const RENDU_PIED = 'pied';
23
	const RENDU_PIED = 'pied';
24
	const RENDU_NAVIGATION = 'navigation';
24
	const RENDU_NAVIGATION = 'navigation';
25
	const RENDU_MENU = 'menu';
25
	const RENDU_MENU = 'menu';
26
 
26
 
27
	private $sortie = array();
27
	private $sortie = array();
28
	protected $urlBase = null;
28
	protected $urlBase = null;
29
	protected $urlCourante = null;
29
	protected $urlCourante = null;
30
	protected $urls = null;
30
	protected $urls = null;
31
	
31
	
32
	protected $cache = null;
32
	protected $cache = null;
33
 
33
 
34
	public function __construct(AppUrls $urls = null)  {
34
	public function __construct(AppUrls $urls = null)  {
35
		$chemin = Config::get('chemin_modules').
35
		$chemin = Config::get('chemin_modules').
36
			AppControleur::getNomDossierDepuisClasse(get_class($this)).DS.
36
			AppControleur::getNomDossierDepuisClasse(get_class($this)).DS.
37
			Config::get('dossier_squelettes').DS;
37
			Config::get('dossier_squelettes').DS;
38
		Registre::set('tbf.chemin_squelettes', $chemin);
38
		Registre::set('tbf.chemin_squelettes', $chemin);
39
 
39
 
40
		$this->urlBase = Registre::get('eFlore.urlBase');
40
		$this->urlBase = Registre::get('eFlore.urlBase');
41
		$this->urlCourante = Registre::get('eFlore.urlCourante');
41
		$this->urlCourante = Registre::get('eFlore.urlCourante');
42
		$this->urlRedirection = Registre::get('eFlore.urlRedirection');
42
		$this->urlRedirection = Registre::get('eFlore.urlRedirection');
43
		$this->urls = (is_null($urls)) ? new AppUrls() : $urls;
43
		$this->urls = (is_null($urls)) ? new AppUrls() : $urls;
44
		
44
		
45
		$this->cache = new CacheSimple(array("mise_en_cache" => Config::get("cache"), "stockage_chemin" => Config::get("chemincache"), "duree_de_vie" => Config::get("dureecache")));
45
		$this->cache = new CacheSimple(array("mise_en_cache" => Config::get("cache"), "stockage_chemin" => Config::get("chemincache"), "duree_de_vie" => Config::get("dureecache")));
46
 
46
 
47
		parent::__construct();
47
		parent::__construct();
48
	}
48
	}
49
 
49
 
50
	//+------------------------------------------------------------------------------------------------------+
50
	//+------------------------------------------------------------------------------------------------------+
51
	// GESTION de l'AFFICHAGE en SORTIE
51
	// GESTION de l'AFFICHAGE en SORTIE
52
 
52
 
53
	/**
53
	/**
54
 	* Attribue une position de sortie à un contenu.
54
 	* Attribue une position de sortie à un contenu.
55
 	*/
55
 	*/
56
	protected function setSortie($position, $contenu, $fusionner = false) {
56
	protected function setSortie($position, $contenu, $fusionner = false) {
57
		if ($this->verifierExistenceTypeSortie($position)) {
57
		if ($this->verifierExistenceTypeSortie($position)) {
58
			if ($fusionner) {
58
			if ($fusionner) {
59
				if (isset($this->sortie[$position])) {
59
				if (isset($this->sortie[$position])) {
60
					$this->sortie[$position] .= $contenu;
60
					$this->sortie[$position] .= $contenu;
61
				} else {
61
				} else {
62
					$this->sortie[$position] = $contenu;
62
					$this->sortie[$position] = $contenu;
63
				}
63
				}
64
			} else {
64
			} else {
65
				$this->sortie[$position] = $contenu;
65
				$this->sortie[$position] = $contenu;
66
			}
66
			}
67
		}
67
		}
68
	}
68
	}
69
 
69
 
70
	/**
70
	/**
71
	 * Vérifie l'existence du type de sortie indiqué pour son utilisation dans le tableau de sortie.
71
	 * Vérifie l'existence du type de sortie indiqué pour son utilisation dans le tableau de sortie.
72
	 * @param string le type de sortie à tester.
72
	 * @param string le type de sortie à tester.
73
	 * @return bool true si le type de sortie est valide, sinon false.
73
	 * @return bool true si le type de sortie est valide, sinon false.
74
	 */
74
	 */
75
	private function verifierExistenceTypeSortie($type) {
75
	private function verifierExistenceTypeSortie($type) {
76
		$existe = true;
76
		$existe = true;
77
		if ($type != self::RENDU_TETE &&
77
		if ($type != self::RENDU_TETE &&
78
			$type != self::RENDU_CORPS &&
78
			$type != self::RENDU_CORPS &&
79
			$type != self::RENDU_PIED &&
79
			$type != self::RENDU_PIED &&
80
			$type != self::RENDU_NAVIGATION &&
80
			$type != self::RENDU_NAVIGATION &&
81
			$type != self::RENDU_MENU &&
81
			$type != self::RENDU_MENU &&
82
			$type != self::ENTETE &&
82
			$type != self::ENTETE &&
83
			$type != self::META_TITRE &&
83
			$type != self::META_TITRE &&
84
			$type != self::META_DESCRIPTION &&
84
			$type != self::META_DESCRIPTION &&
85
			$type != self::META_TAGS) {
85
			$type != self::META_TAGS) {
86
			trigger_error("Le type de sortie '$type' n'est pas une valeur prédéfinie.", E_USER_WARNING);
86
			trigger_error("Le type de sortie '$type' n'est pas une valeur prédéfinie.", E_USER_WARNING);
87
			$existe = false;
87
			$existe = false;
88
		}
88
		}
89
		return $existe;
89
		return $existe;
90
	}
90
	}
91
 
91
 
92
	/**
92
	/**
93
	 * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
93
	 * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
94
	 */
94
	 */
95
	public function getSortie() {
95
	public function getSortie() {
96
		return $this->sortie;
96
		return $this->sortie;
97
	}
97
	}
98
 
98
 
99
	/**
99
	/**
100
	 * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
100
	 * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
101
	 * @param array le tableau à fusionner
101
	 * @param array le tableau à fusionner
102
	 */
102
	 */
103
	private function fusionnerSortie($nouvelleSortie) {
103
	private function fusionnerSortie($nouvelleSortie) {
104
		$sortieActuelle = $this->getSortie();
104
		$sortieActuelle = $this->getSortie();
105
		foreach ($nouvelleSortie as $position => $nouveauContenu) {
105
		foreach ($nouvelleSortie as $position => $nouveauContenu) {
106
			if ($nouveauContenu != '') {
106
			if ($nouveauContenu != '') {
107
				$contenuPrecedent = isset($sortieActuelle[$position]) ? $sortieActuelle[$position] : null;
107
				$contenuPrecedent = isset($sortieActuelle[$position]) ? $sortieActuelle[$position] : null;
108
				if ($nouveauContenu != $contenuPrecedent) {
108
				if ($nouveauContenu != $contenuPrecedent) {
109
					$this->setSortie($position, $nouveauContenu, true);
109
					$this->setSortie($position, $nouveauContenu, true);
110
				}
110
				}
111
			}
111
			}
112
		}
112
		}
113
	}
113
	}
114
	
114
	
115
	/**
115
	/**
116
	* Vide toutes les sorties (utile en cas de classe statique et de module ajax)
116
	* Vide toutes les sorties (utile en cas de classe statique et de module ajax)
117
	*/
117
	*/
118
	protected function viderSorties() {
118
	protected function viderSorties() {
119
		$this->setSortie(self::RENDU_TETE, '');
119
		$this->setSortie(self::RENDU_TETE, '');
120
		$this->setSortie(self::RENDU_CORPS, '');
120
		$this->setSortie(self::RENDU_CORPS, '');
121
		$this->setSortie(self::RENDU_PIED, '');
121
		$this->setSortie(self::RENDU_PIED, '');
122
		$this->setSortie(self::RENDU_NAVIGATION, '');
122
		$this->setSortie(self::RENDU_NAVIGATION, '');
123
		$this->setSortie(self::RENDU_MENU, '');
123
		$this->setSortie(self::RENDU_MENU, '');
124
	}
124
	}
125
 
125
 
126
	/**
126
	/**
127
	 * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
127
	 * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
128
	 * Permet à une action d'un module donnée de charger le résultat d'une autre action de module.
128
	 * Permet à une action d'un module donnée de charger le résultat d'une autre action de module.
129
	 */
129
	 */
130
	protected function executerAction($ClasseModule, $action, $parametres = array()) {
130
	protected function executerAction($ClasseModule, $action, $parametres = array()) {
131
		$module = new $ClasseModule();
131
		$module = new $ClasseModule();
132
		$sortiePrecedente = $this->getSortie();
132
		$sortiePrecedente = $this->getSortie();
133
		// Initialisation du module demandé
133
		// Initialisation du module demandé
134
		if (method_exists($module, 'initialiser')) {
134
		if (method_exists($module, 'initialiser')) {
135
			$module->initialiser();
135
			$module->initialiser();
136
		}
136
		}
137
		// Lancement de l'action demandé du module chargé
137
		// Lancement de l'action demandé du module chargé
138
		if (method_exists($module, $action)) {
138
		if (method_exists($module, $action)) {
139
			if (isset($parametres)) {
139
			if (isset($parametres)) {
140
				$module->$action($parametres);
140
				$module->$action($parametres);
141
			} else {
141
			} else {
142
				$module->$action();
142
				$module->$action();
143
			}
143
			}
144
			$nouvelleSortie = $module->getSortie();
144
			$nouvelleSortie = $module->getSortie();
145
			$this->fusionnerSortie($nouvelleSortie);
145
			$this->fusionnerSortie($nouvelleSortie);
146
		} else {
146
		} else {
147
			$m = "La méthode '$action' du controleur '$ClasseModule' est introuvable.";
147
			$m = "La méthode '$action' du controleur '$ClasseModule' est introuvable.";
148
			trigger_error($m, E_USER_ERROR);
148
			trigger_error($m, E_USER_ERROR);
149
		}
149
		}
150
	}
150
	}
151
	
151
	
152
	//+------------------------------------------------------------------------------------------------------+
152
	//+------------------------------------------------------------------------------------------------------+
153
	// GESTION du VUES COMMUNES
153
	// GESTION du VUES COMMUNES
154
	/**
154
	/**
155
	 * Charge un squelette de vue depuis l'emplacement commune.
155
	 * Charge un squelette de vue depuis l'emplacement commune.
156
	 * @param String $tpl le nom du squelette à charger sans l'extenssion de fichier.
156
	 * @param String $tpl le nom du squelette à charger sans l'extenssion de fichier.
157
	 * @param Array $donnees les données à passer au squelette PHP.
157
	 * @param Array $donnees les données à passer au squelette PHP.
158
	 */
158
	 */
159
	private function getVueCommune($tpl, $donnees) {
159
	private function getVueCommune($tpl, $donnees) {
160
		$cheminOrigine = $this->getCheminSquelette();
160
		$cheminOrigine = $this->getCheminSquelette();
161
		$this->setCheminSquelette(Config::get('chemin_squelettes'));
161
		$this->setCheminSquelette(Config::get('chemin_squelettes'));
162
		$vue = $this->getVue($tpl, $donnees);
162
		$vue = $this->getVue($tpl, $donnees);
163
		$this->setCheminSquelette($cheminOrigine);
163
		$this->setCheminSquelette($cheminOrigine);
164
		return $vue;
164
		return $vue;
165
	}
165
	}
166
 
166
 
167
	/**
167
	/**
168
	 * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
168
	 * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
169
	 */
169
	 */
170
	public function chargerEnteteGeneral() {
170
	public function chargerEnteteGeneral() {
171
		$donnees['appli'] = Framework::getInfoAppli();
171
		$donnees['appli'] = Framework::getInfoAppli();
172
		$donnees['i18n'] = array_merge(I18n::get('Entete'), I18n::get('General'));
172
		$donnees['i18n'] = array_merge(I18n::get('Entete'), I18n::get('General'));
173
		$donnees['referentiel_titre'] = I18n::get('Referentiels-titres.'.Registre::get('parametres.referentiel'));
173
		$donnees['referentiel_titre'] = I18n::get('Referentiels-titres.'.Registre::get('parametres.referentiel'));
174
 
174
 
175
		$this->setSortie(self::RENDU_TETE, $this->getVueCommune('entete_page', $donnees));
175
		$this->setSortie(self::RENDU_TETE, $this->getVueCommune('entete_page', $donnees));
176
	}
176
	}
177
 
177
 
178
	/**
178
	/**
179
	 * Pour mutualiser la création du menu de l'application, sa gestion est gérée dans cette classe.
179
	 * Pour mutualiser la création du menu de l'application, sa gestion est gérée dans cette classe.
180
	 */
180
	 */
181
	public function chargerMenuGeneral() {
181
	public function chargerMenuGeneral() {
182
		$donnees['appli'] = Framework::getInfoAppli();
182
		$donnees['appli'] = Framework::getInfoAppli();
183
		$donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
183
		$donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
184
		$donnees['courrielContact'] = Config::get('courriel_contact');
184
		$donnees['courrielContact'] = Config::get('courriel_contact');
185
 
185
 
186
		$this->setSortie(self::RENDU_MENU, $this->getVueCommune('menu', $donnees));
186
		$this->setSortie(self::RENDU_MENU, $this->getVueCommune('menu', $donnees));
187
	}
187
	}
188
 
188
 
189
	/**
189
	/**
190
	 * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
190
	 * Pour mutualiser la création du pied de page de l'application, sa gestion est gérée dans cette classe.
191
	 */
191
	 */
192
	public function chargerPiedGeneral() {
192
	public function chargerPiedGeneral() {
193
		$donnees['appli'] = Framework::getInfoAppli();
193
		$donnees['appli'] = Framework::getInfoAppli();
194
		$donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
194
		$donnees['i18n'] = array_merge(I18n::get('Pied'), I18n::get('General'));
195
		$donnees['courrielContact'] = Config::get('courriel_contact');
195
		$donnees['courrielContact'] = Config::get('courriel_contact');
196
 
196
 
197
		$this->setSortie(self::RENDU_PIED, $this->getVueCommune('pied_page', $donnees));
197
		$this->setSortie(self::RENDU_PIED, $this->getVueCommune('pied_page', $donnees));
198
	}
198
	}
199
 
199
 
200
	//+------------------------------------------------------------------------------------------------------+
200
	//+------------------------------------------------------------------------------------------------------+
201
	// GESTION du CHARGEMENT des CLASSES MÉTIERS
201
	// GESTION du CHARGEMENT des CLASSES MÉTIERS
202
	protected function getEfloreNoms() {
202
	protected function getEfloreNoms() {
203
		if (! isset($this->EfloreNoms)) {
203
		if (! isset($this->EfloreNoms)) {
204
			$this->EfloreNoms = new Noms();
204
			$this->EfloreNoms = new Noms();
205
		}
205
		}
206
		return $this->EfloreNoms;
206
		return $this->EfloreNoms;
207
	}
207
	}
208
 
208
 
209
	protected function getEfloreTaxons() {
209
	protected function getEfloreTaxons() {
210
		if (! isset($this->EfloreTaxons)) {
210
		if (! isset($this->EfloreTaxons)) {
211
			$this->EfloreTaxons = new Taxons();
211
			$this->EfloreTaxons = new Taxons();
212
		}
212
		}
213
		return $this->EfloreTaxons;
213
		return $this->EfloreTaxons;
214
	}
214
	}
215
 
215
 
216
	public function obtenirUrlBase() {
216
	public function obtenirUrlBase() {
217
		$url = $this->urlBase->getURL();
217
		$url = $this->urlBase->getURL();
218
		return $url;
218
		return $url;
219
	}
219
	}
220
 
220
 
221
	public function redirigerVers($url) {
221
	public function redirigerVers($url) {
222
		$url = str_replace('&amp;', '&', $url);
222
		$url = str_replace('&amp;', '&', $url);
223
		header("Location: $url");
223
		header("Location: $url");
224
	}
224
	}
225
 
225
 
226
	public function getParametresUrlListe() {
226
	public function getParametresUrlListe() {
227
		$parametres = array(
227
		$parametres = array(
228
					'referentiel' => Registre::get('parametres.referentiel'),
228
					'referentiel' => Registre::get('parametres.referentiel'),
229
					'module' => 'liste',
229
					'module' => 'liste',
230
					'action' => 'liste',
230
					'action' => 'liste',
231
					'rang' => $this->rang,
231
					'rang' => $this->rang,
232
					'lettre' => $this->lettre
232
					'lettre' => $this->lettre
233
		);
233
		);
234
		return $parametres;
234
		return $parametres;
235
	}
235
	}
236
 
236
 
237
	public function obtenirUrlListeFamille() {
237
	public function obtenirUrlListeFamille() {
238
		$parametres = $this->getParametresUrlListe();
238
		$parametres = $this->getParametresUrlListe();
239
		$parametres['rang'] = 'F';
239
		$parametres['rang'] = 'F';
240
		$this->urlBase->setRequete($parametres);
240
		$this->urlBase->setRequete($parametres);
241
		$url = $this->urlBase->getURL();
241
		$url = $this->urlBase->getURL();
242
		return $url;
242
		return $url;
243
	}
243
	}
244
 
244
 
245
	public function obtenirUrlListeGenre() {
245
	public function obtenirUrlListeGenre() {
246
		$parametres = $this->getParametresUrlListe();
246
		$parametres = $this->getParametresUrlListe();
247
		$parametres['rang'] = 'G';
247
		$parametres['rang'] = 'G';
248
		$this->urlBase->setRequete($parametres);
248
		$this->urlBase->setRequete($parametres);
249
		$url = $this->urlBase->getURL();
249
		$url = $this->urlBase->getURL();
250
		return $url;
250
		return $url;
251
	}
251
	}
252
 
252
 
253
 
253
 
254
 
254
 
255
	public function getParametresUrlResultat() {
255
	public function getParametresUrlResultat() {
256
		$parametres = array(
256
		$parametres = array(
257
					'referentiel' => Registre::get('parametres.referentiel'),
257
					'referentiel' => Registre::get('parametres.referentiel'),
258
					'module' => 'recherche',
258
					'module' => 'recherche',
259
					'action' => Registre::get('parametres.action'),
259
					'action' => Registre::get('parametres.action'),
260
					'submit' => 'Rechercher',
260
					'submit' => 'Rechercher',
261
					'type_nom' => isset($_GET['type_nom']) ? $_GET['type_nom'] : 'nom_scientifique',
261
					'type_nom' => isset($_GET['type_nom']) ? $_GET['type_nom'] : 'nom_scientifique',
262
					'nom' => isset($_GET['nom']) ? $_GET['nom'] : ''
262
					'nom' => isset($_GET['nom']) ? $_GET['nom'] : ''
263
		);
263
		);
264
		return $parametres;
264
		return $parametres;
265
	}
265
	}
266
 
266
 
267
	public function obtenirUrlResultatDetermination() {
267
	public function obtenirUrlResultatDetermination() {
268
		$parametres = $this->getParametresUrlResultat();
268
		$parametres = $this->getParametresUrlResultat();
269
		$parametres['resultat'] = 'determination';
269
		$parametres['resultat'] = 'determination';
270
		$this->urlBase->setRequete($parametres);
270
		$this->urlBase->setRequete($parametres);
271
		$url = $this->urlBase->getURL();
271
		$url = $this->urlBase->getURL();
272
		return $url;
272
		return $url;
273
	}
273
	}
274
 
274
 
275
	public function obtenirUrlResultatAlphab() {
275
	public function obtenirUrlResultatAlphab() {
276
		$parametres = $this->getParametresUrlResultat();
276
		$parametres = $this->getParametresUrlResultat();
277
		$parametres['resultat'] = 'alphab';
277
		$parametres['resultat'] = 'alphab';
278
		$this->urlBase->setRequete($parametres);
278
		$this->urlBase->setRequete($parametres);
279
		$url = $this->urlBase->getURL();
279
		$url = $this->urlBase->getURL();
280
		return $url;
280
		return $url;
281
	}
281
	}
282
 
282
 
283
	public function obtenirUrlResultatRetenu() {
283
	public function obtenirUrlResultatRetenu() {
284
		$parametres = $this->getParametresUrlResultat();
284
		$parametres = $this->getParametresUrlResultat();
285
		$parametres['resultat'] = 'retenu';
285
		$parametres['resultat'] = 'retenu';
286
		$this->urlBase->setRequete($parametres);
286
		$this->urlBase->setRequete($parametres);
287
		$url = $this->urlBase->getURL();
287
		$url = $this->urlBase->getURL();
288
		return $url;
288
		return $url;
289
	}
289
	}
290
 
290
 
291
	public function obtenirUrlResultatDecompo() {
291
	public function obtenirUrlResultatDecompo() {
292
		$parametres = $this->getParametresUrlResultat();
292
		$parametres = $this->getParametresUrlResultat();
293
		$parametres['resultat'] = 'decompo';
293
		$parametres['resultat'] = 'decompo';
294
		$this->urlBase->setRequete($parametres);
294
		$this->urlBase->setRequete($parametres);
295
		$url = $this->urlBase->getURL();
295
		$url = $this->urlBase->getURL();
296
		return $url;
296
		return $url;
297
	}
297
	}
298
 
-
 
299
	public function obtenirCache($id) {
-
 
300
		$retour = unserialize($this->cache->charger($id));
-
 
301
		if ($retour == false) {
-
 
302
			$retour = null;
-
 
303
		}
-
 
304
		return $retour;
-
 
305
	}
-
 
306
	
-
 
307
	public function mettreEnCache($id, $donnees) {
-
 
308
		$this->cache->sauver(serialize($donnees), $id);
-
 
309
	}
-
 
310
}
298
}
311
?>
299
?>