Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
376 jpm 1
<?php
2
 
3
abstract class aModule {
4
 
5
	/*** Constantes : ***/
6
 
7
	const TPL_NULL = 'NULL';
8
	const TPL_PHP = 'PHP';
9
	const TPL_PHP_MAIL = 'PHP_MAIL';
10
	const TPL_IT = 'IT';
11
	const TPL_FPDI = 'FPDI';
12
	const SORTIE_NULL = 'NULL';
13
	const SORTIE_EXIT = 'EXIT';
14
	const SORTIE_MAIL_SMTP = 'email';
15
	const SORTIE_HTML = 'html';
16
	const SORTIE_EXIT_HTML = 'exit.html';
17
	const SORTIE_XML = 'xml';
18
	const SORTIE_PDF = 'pdf';
19
 
20
	/*** Attributs : ***/
21
	private $registre;
22
	private $cache;
23
	private $actions_chainees = null;
24
 
25
	/*** Constructeur : ***/
26
 
27
	public function __construct()
28
    {
29
    	$this->registre = Registre::getInstance();
30
		$this->registre->set('squelette_moteur', aModule::TPL_PHP);
31
		$this->registre->set('format', aModule::SORTIE_HTML);
32
		$applette_dossier = preg_replace('/([a-z])([A-Z])/', '$1_$2', get_class($this));
33
 
34
		// Nous créons automatiquement les chemins vers les différents dossier de l'application
35
		$this->registre->set('chemin_module', SC_CHEMIN_MODULE.strtolower($applette_dossier).DIRECTORY_SEPARATOR);
36
		$this->registre->set('chemin_module_config', $this->registre->get('chemin_module').'configuration'.DIRECTORY_SEPARATOR);
37
		$this->registre->set('chemin_module_squelette', $this->registre->get('chemin_module').'squelettes'.DIRECTORY_SEPARATOR);
38
 
39
		// Nous définissons si oui ou non le cache sera utilisé
40
		if (defined('SC_BOOL_STOCKAGE_CACHE')) {
41
			$this->cache_bool = SC_BOOL_STOCKAGE_CACHE;
42
		} else {
43
			$this->cache_bool = false;
44
			$e = 'La constante SC_BOOL_STOCKAGE_CACHE est indéfinie. Le cache a été désactivé!';
45
			trigger_error($e, E_USER_WARNING);
46
		}
47
 
48
		// Nous chargeons le fichier de config de l'appli s'il existe
49
		if ($this->getConfigFichier()) {
50
			require_once $this->getConfigFichier();
51
		}
52
    }
53
 
54
    /*** Accesseurs : ***/
55
    public function getRegistre()
56
    {
57
    	return $this->registre;
58
    }
59
 
60
    public function setCacheBool($cb)
61
    {
62
    	return $this->cache_bool = $cb;
63
    }
64
 
65
    /*** Méthodes : ***/
66
 
67
    public function getCacheId()
68
    {
69
    	if ($this->getActionNom() != null) {
70
    		$methode_cache_id = 'getCacheId'.$this->getActionNom();
71
    		if (method_exists($this, $methode_cache_id) && !is_null($this->$methode_cache_id())) {
72
    			return call_user_func(array($this, $methode_cache_id));
73
    		}
74
    	}
75
    	return null;
76
    }
77
 
78
    public function getCacheFichier()
79
    {
80
    	$fichier_cache = EF_CHEMIN_STOCKAGE_CACHE.$this->getCacheId();
81
    	if (!is_null($this->getCacheDuree())) {
82
    		$fichier_cache .= '_['.$this->getCacheDuree().']';
83
    	}
84
    	$fichier_cache .= '.cache.'.$this->registre->get('format');
85
 
86
    	return $fichier_cache;
87
    }
88
 
89
    public function getCacheDuree()
90
    {
91
    	$dlc = null;
92
    	$methode_cache_dlc = 'getCacheDlc'.ucfirst($this->registre->get('action'));
93
    	if (method_exists($this, $methode_cache_dlc) && !is_null($this->$methode_cache_dlc())) {
94
    		$dlc = call_user_func(array($this, $methode_cache_dlc)); // dlc en seconde
95
    	}
96
    	return $dlc;
97
    }
98
 
99
    public function getActionNom()
100
    {
101
		if ($this->getRegistre()->get('action') != null) {
102
			return $action = str_replace(' ', '', ucwords(str_replace('_', ' ', $this->registre->get('action'))));
103
		}
104
		return null;
105
    }
106
 
107
    public function setDebogage($d, $e = E_USER_NOTICE)
108
    {
109
    	if (is_array($d) || is_object($d)) {
110
    		trigger_error(print_r($d, true), $e);
111
    	} else {
112
    		trigger_error($d, $e);
113
    	}
114
    }
115
 
116
    public function setChrono($balise)
117
    {
118
		// Mesure du temps d'éxecution
119
		$class = new ReflectionClass($this);
120
		$GLOBALS['_SCRIPT_']['chrono']->setTemps(array($class->getName().'-'.$balise => microtime()));
121
    }
122
 
123
    public function getSqueletteFichier()
124
    {
125
		// Par défaut le nom du fichier de squelette est construit à partir du nom de l'action.
126
		if (is_null($this->getRegistre()->get('squelette_fichier'))) {
127
			$this->getRegistre()->set('squelette_fichier', $this->getRegistre()->get('action'));
128
		}
129
 
130
		// Nous recherchons s'il existe un squelette spécifique à la distribution
131
		$fichier_tpl_defaut =  	$this->getRegistre()->get('chemin_module_squelette').
132
								$this->getRegistre()->get('squelette_fichier').'.tpl.'.$this->registre->get('format');
133
		if (defined('SC_DISTRIBUTION') && SC_DISTRIBUTION != ''&& !is_null(SC_DISTRIBUTION)) {
134
			$fichier_tpl_projet =  	$this->getRegistre()->get('chemin_module_squelette').
135
									strtolower(SC_DISTRIBUTION).DIRECTORY_SEPARATOR.
136
									$this->getRegistre()->get('squelette_fichier').'.tpl.'.$this->getRegistre()->get('format');
137
			if (file_exists($fichier_tpl_projet)) {
138
				return $fichier_tpl_projet;
139
			}
140
		}
141
		if (file_exists($fichier_tpl_defaut)) {
142
			return $fichier_tpl_defaut;
143
		}
144
		return false;
145
    }
146
 
147
    public function getConfigFichier()
148
    {
149
		$fichier_conf_defaut = $this->getRegistre()->get('chemin_module_config').'config.inc.php';
150
		if (defined('SC_DISTRIBUTION') && SC_DISTRIBUTION != '') {
151
 
152
			$fichier_conf_projet = 	$this->getRegistre()->get('chemin_module_config').
153
									'config.'.strtolower(SC_DISTRIBUTION).'.inc.php';
154
			if (file_exists($fichier_conf_projet)) {
155
				return $fichier_conf_projet;
156
			}
157
		}
158
		if (file_exists($fichier_conf_defaut)) {
159
			return $fichier_conf_defaut;
160
		}
161
		return false;
162
    }
163
 
164
    public function getActionsChainees()
165
    {
166
    	// Création du tableau si nécessaire
167
		if (is_null($this->actions_chainees)) {
168
			$this->actions_chainees = array();
169
			$this->actions_chainees[] = $this->getRegistre()->get('action');
170
		}
171
		return $this->actions_chainees;
172
    }
173
 
174
    public function poursuivreVers($action)
175
    {
176
		// Ajout de l'action suivante
177
   		$this->actions_chainees[] = $action;
178
    }
179
 
180
	public function traiterAction()
181
    {
182
		// Gestion des actions chainées si nécessaire
183
		$sortie = '';
184
		$module_nom = strtolower(get_class($this));
185
		$i = 0;
186
		while ($i < count($this->getActionsChainees())) {
187
			// Initialisation de variables
188
			$actions = $this->getActionsChainees();
189
			$action = $actions[$i++];
190
 
191
			// Remise à défaut des valeurs du Registre pour la prochaine action
192
			$this->getRegistre()->set('action', $action);
193
			$this->getRegistre()->set('format', aModule::SORTIE_HTML);
194
			$this->getRegistre()->set('squelette_fichier', null);
195
			$this->getRegistre()->set('squelette_moteur', aModule::TPL_PHP);
196
 
197
			// Gestion du multilinguisme
198
			//if (isset($GLOBALS['_EF_']['i18n'][$module_nom][$action])) {
199
				//$this->getRegistre()->set('module_i18n', $GLOBALS['_EF_']['i18n'][$module_nom][$action]);
200
			//}
201
 
202
			// Exécution du rendu de l'action
203
			$sortie .= $this->traiterRendu($action);
204
		}
205
 
206
		// Gestion de la sortie finale
207
		return $sortie;
208
    }
209
 
210
	private function traiterRendu()
211
    {
212
		// Gestion du cache : avant toute chose, retour du cache s'il existe
213
    	if ($this->cache_bool) {
214
			//$this->setDebogage($this->getCacheId());
215
			if (!is_null($this->getCacheId())) {
216
				if (file_exists($this->getCacheFichier())) {
217
					// Gestion de la DLC
218
					if (	(is_null($this->getCacheDuree())) ||
219
							(!is_null($this->getCacheDuree()) && (time() < (filemtime($this->getCacheFichier()) + $this->getCacheDuree())))) {
220
						$this->registre->set('sortie', file_get_contents($this->getCacheFichier()));
221
						return $this->traiterSortie();
222
					}
223
				}
224
			}
225
		}
226
 
227
		// Attribution si nécessaire de l'encodage de sortie
228
		if (!$this->registre->get('charset')) {
229
			$this->registre->set('charset', 'ISO-8859-1');
230
		}
231
 
232
    	// Execution de l'action
233
		$methode_action = 'executer';
234
		if ($this->getActionNom() != null) {
235
			$methode_action .= $this->getActionNom();
236
		}
237
    	if (method_exists($this, $methode_action)) {
238
    		call_user_func(array($this, $methode_action));
239
    	} else {
240
    		$e = 'La méthode '.$methode_action.' pour l\'action '.$this->registre->get('action').' n\'existe pas!';
241
    		trigger_error($e, E_USER_WARNING);
242
    		return null;
243
    	}
244
 
245
    	// Gestion du rendu en fonction du type de template
246
    	switch($this->registre->get('squelette_moteur')) {
247
			case aModule::TPL_PHP_MAIL :
248
			case aModule::TPL_PHP :
249
				$aso_donnees = $this->registre->get('squelette_donnees');
250
				//$aso_donnees['i18n'] = $this->registre->get('module_i18n');
251
				$Squelette = new SquelettePhp();
252
				$Squelette->set($aso_donnees);
253
				if ($this->getSqueletteFichier()) {
254
					$sortie = $Squelette->analyser($this->getSqueletteFichier());
255
					if ($this->registre->get('squelette_moteur') == aModule::TPL_PHP_MAIL) {
256
						// Traitement spécial pour les mails
257
						if (preg_match_all('/<(html|txt|file)(?:>(.*?)<\/\\1>|\s+src="(.*)"\s+type="(.*)"\s*\/>\s*$)/ism', $sortie, $decoupage, PREG_SET_ORDER)) {
258
							$this->registre->set('sortie_mail_mime', $decoupage);
259
						}
260
					} else {
261
						$this->registre->set('sortie', $sortie);
262
					}
263
				} else {
264
					$e = 'Action : '.$this->getRegistre()->get('action').' fichier de squelette introuvable !';
265
					trigger_error($e, E_USER_WARNING);
266
					return null;
267
				}
268
				break;
269
    		case aModule::TPL_NULL :
270
    			// Nous ne faisons rien, nous passons à la gestion du type de sortie
271
    			break;
272
    		default :
273
    			trigger_error('Moteur de squelette inconnu', E_USER_WARNING);
274
    			return null;
275
    	}
276
 
277
    	// Gestion du cache : écriture du fichier
278
		if ($this->cache_bool) {
279
			if (!is_null($this->getCacheId())) {
280
				$fp = fopen($this->getCacheFichier(), 'w');
281
				fwrite($fp, $this->registre->get('sortie'));
282
				fclose($fp);
283
			 }
284
		}
285
 
286
		// Gestion du format de sortie
287
		return $this->traiterSortie();
288
    }
289
 
290
    private function traiterSortie()
291
    {
292
    	switch($this->getRegistre()->get('format')) {
293
			case aModule::SORTIE_HTML :
294
				// +--------------------------------------------------------------------------------------------------+
295
				// A FAIRE : Gestion des statistiques
296
 
297
				// +--------------------------------------------------------------------------------------------------+
298
				// Gestion du cache : affichage de la date du cache
299
				if ($this->cache_bool) {
300
					if (!is_null($this->getCacheId())) {
301
						$e = 	'Cache, généré le '.date('D d M Y à H:i:s', filemtime($this->getCacheFichier())).
302
								' sera généré à nouveau le '.
303
								date('D d M Y à H:i:s', (filemtime($this->getCacheFichier()) + $this->getCacheDuree()))." \n";
304
						trigger_error($e, E_USER_NOTICE);
305
					}
306
				}
307
				return $this->getRegistre()->get('sortie');
308
				break;
309
			case aModule::SORTIE_EXIT_HTML :
310
				echo $this->registre->get('sortie');
311
				exit();
312
				break;
313
			case aModule::SORTIE_XML :
314
				header('Content-Type: application/xhtml+xml; charset='.$this->registre->get('charset'));
315
				echo $this->registre->get('sortie');
316
				exit();
317
				break;
318
			case aModule::SORTIE_PDF :
319
				header('Content-type: application/pdf');
320
				header('Content-Length: '.strlen($this->getRegistre()->get('sortie')));
321
				header('Content-Disposition: inline; filename='.str_replace(' ', '_', $GLOBALS['_SCRIPT_']['titre_fichier']).'.pdf');//
322
				echo $this->registre->get('sortie');
323
				break;
324
			case aModule::SORTIE_MAIL_SMTP :
325
				//trigger_error(print_r($this->getRegistre()->get('sortie_mail_mime'), true), E_USER_NOTICE);
326
				// TODO : réseoudre le problème de l'autoload pour les fichiers PEAR ci-dessous
327
				include_once 'Mail.php';
328
				include_once 'Mail/smtp.php';
329
				$sortie_mail = '';
330
				// Nous vérifions si nous avons à faire à un mail mime ou pas
331
				if (is_null($this->getRegistre()->get('sortie_mail_mime'))) {
332
					$sortie_mail = $this->getRegistre()->get('sortie');
333
				} else {
334
					// Pour l'instant supporte du html et son alternative en txt plus des fichiers attachés
335
					// TODO : Les mails multiparts contenant des imbrications de html et de txt ne sont pas encore pris en compte...
336
					include_once 'Mail/mime.php';
337
					$MailMime = new Mail_mime("\n");
338
					foreach ($this->getRegistre()->get('sortie_mail_mime') as $valeur) {
339
						switch (strtolower($valeur[1])) {
340
							case 'txt' :
341
								// Syntaxe multiligne: <txt>mettre ici du texte brute</txt>
342
								$MailMime->setTXTBody($valeur[2]);
343
								break;
344
							case 'html' :
345
								// Syntaxe multiligne: <html>mettre ici votre html</html>
346
								$MailMime->setHTMLBody($valeur[2]);
347
								break;
348
							case 'file' :
349
								// Syntaxe sur une ligne: <file src="/tmp/un_test.txt" type="text/plain" />
350
								$e = $MailMime->addAttachment($valeur[3], $valeur[4]);
351
								if ($e instanceof PEAR_Error) {
352
									trigger_error($e->getMessage(), E_USER_NOTICE);
353
								}
354
								break;
355
							default :
356
								trigger_error('Type de balise inconnue :'.$valeur[1], E_USER_WARNING);
357
						}
358
					}
359
					//do not ever try to call these lines in reverse order
360
					$sortie_mail = $MailMime->get();
361
					$this->getRegistre()->set('sortie_mail_smtp_entete', $MailMime->headers($this->getRegistre()->get('sortie_mail_smtp_entete')));
362
				}
363
				$mail_object = new Mail_smtp($this->getRegistre()->get('sortie_mail_smtp_params'));
364
				$message = $mail_object->send(	$this->getRegistre()->get('sortie_mail_smtp_destinataire'),
365
												$this->getRegistre()->get('sortie_mail_smtp_entete'),
366
												$sortie_mail);
367
				$this->getRegistre()->set('sortie_mail_smtp_info', $message);
368
				return null;
369
				break;
370
			case aModule::SORTIE_EXIT :
371
    			// Nous ne faisons rien, nous terminons seulement le programme ici
372
    			exit();
373
    			break;
374
			case aModule::SORTIE_NULL :
375
    			// Nous ne faisons rien, nous retournons null
376
    			return null;
377
    			break;
378
			default :
379
    			trigger_error('Type de sortie inconnu', E_USER_ERROR);
380
		}
381
    }
382
}
383
?>