Subversion Repositories Applications.referentiel

Rev

Rev 38 | Rev 53 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
* Classe modèle spécifique à l'application, donc d'accés au données, elle ne devrait pas être appelée de l'extérieur.
5
* Elle est abstraite donc doit obligatoirement être étendue.
6
*
7
* @category		Php5
8
* @package 		Referentiel
9
* @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
* @copyright	2010 Tela-Botanica
11
* @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
* @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
* @version		SVN: $Id$
14
*/
20 jpm 15
abstract class Dao {
52 jpm 16
	const ORDRE_ASCENDANT = 'ASC';
17
	const ORDRE_DESCENDANT = 'DESC';
36 jpm 18
	const HTTP_REQUETE_SEPARATEUR = '&';
6 jpm 19
	protected $distinction = '0';
20
	protected $limite_debut = null;
21
	protected $limite_nbre = null;
22
	protected $url_jrest = null;
23
 
24
	public function __construct() {
26 jpm 25
		$this->url_jrest = Config::get('url_jrest');
6 jpm 26
	}
27
 
23 jpm 28
	//+----------------------------------------------------------------------------------------------------------------+
29
	// ACCESSEURS
30
 
52 jpm 31
	public function setDistinction($distinct) {
32
		$this->distinction = $distinct;
33
	}
34
	public function getDistinction() {
35
		return $this->distinction;
36
	}
37
	public function viderDistinction() {
38
		$this->distinction = null;
39
	}
40
 
6 jpm 41
	public function avoirLimitation() {
42
		$limitation = false;
43
		if (!is_null($this->limite_debut) && !is_null($this->limite_nbre)) {
44
			$limitation = true;
45
		}
46
		return $limitation;
47
	}
48
	public function setLimitation($limite_debut, $limite_nbre) {
49
		$this->limite_debut = $limite_debut;
50
		$this->limite_nbre = $limite_nbre;
51
	}
52
	public function getLimiteDebut() {
53
		return $this->limite_debut;
54
	}
55
	public function getLimiteNbre() {
56
		return $this->limite_nbre;
57
	}
52 jpm 58
	public function viderLimite() {
59
		$this->limite_debut = null;
60
		$this->limite_nbre = null;
61
	}
23 jpm 62
 
52 jpm 63
	public function addOrdre($champ, $trie = self::ORDRE_ASCENDANT) {
64
		if (!isset($this->ordre[$champ])) {
65
			if (self::ORDRE_ASCENDANT == $trie || self::ORDRE_DESCENDANT == $trie) {
66
				$this->ordre[$champ] = $trie;
67
			} else {
68
				$e = "La valeur pour le trie doit être : {self::ORDRE_ASCENDANT} ou {self::ORDRE_DESCENDANT}.";
69
				trigger_error($e, E_USER_WARNING);
70
			}
71
		} else {
72
			$e = "Le champ $champ existe déjà dans le tableau des ordres.";
73
			trigger_error($e, E_USER_WARNING);
74
		}
75
	}
76
	public function getOrdre() {
77
		$champs = array();
78
		foreach ($this->ordre as $champ => $trie) {
79
			$champs[] = "$champ $trie";
80
		}
81
		return implode(', ', $champs);
82
	}
83
	public function viderOrdre() {
84
		$this->ordre = null;
85
	}
86
 
23 jpm 87
	//+----------------------------------------------------------------------------------------------------------------+
88
	// MÉTHODES
24 jpm 89
 
90
	protected function envoyerRequeteConsultation($url) {
38 jpm 91
		$url = $this->traiterUrlParametres($url);
24 jpm 92
		$retour = $this->envoyerRequete($url, 'GET');
93
		return $retour;
94
	}
95
 
23 jpm 96
	protected function envoyerRequeteAjout($url, Array $donnees) {
24 jpm 97
		$retour = $this->envoyerRequete($url, 'PUT', $donnees);
23 jpm 98
		return $retour;
99
	}
100
 
26 jpm 101
	protected function envoyerRequeteModif($url, Array $donnees) {
24 jpm 102
		$retour = $this->envoyerRequete($url, 'POST', $donnees);
23 jpm 103
		return $retour;
104
	}
105
 
106
	protected function envoyerRequeteSuppression($url) {
36 jpm 107
		$retour = $this->envoyerRequete($url, 'DELETE');
23 jpm 108
		return $retour;
109
	}
110
 
24 jpm 111
	private function envoyerRequete($url, $mode, Array $donnees = array()) {
112
		$contenu = false;
113
		if ($mode != 'GET' && $mode != 'PUT' && $mode != 'POST' && $mode != 'DELETE') {
23 jpm 114
			$e = "Le mode de requête '$mode' n'est pas accepté!";
115
			trigger_error($e, E_USER_WARNING);
116
		} else {
24 jpm 117
			$contexte = stream_context_create(array(
118
				'http' => array(
119
      				'method' => $mode,
23 jpm 120
					'header' => "Content-type: application/x-www-form-urlencoded\r\n",
37 jpm 121
      				'content' => http_build_query($donnees, null, self::HTTP_REQUETE_SEPARATEUR))));
24 jpm 122
			$flux = @fopen($url, 'r', false, $contexte);
123
			if (!$flux) {
124
				$this->traiterEntete($http_response_header, $url);
125
				$e = "L'ouverture de l'url '$url' a échoué!";
126
				trigger_error($e, E_USER_WARNING);
127
			} else {
128
				// Informations sur les en-têtes et métadonnées du flux
129
				$entetes = stream_get_meta_data($flux);
130
				$this->traiterEntete($entetes, $url);
131
 
132
				// Contenu actuel de $url
133
				$contenu = stream_get_contents($flux);
134
 
135
				fclose($flux);
136
			}
23 jpm 137
		}
52 jpm 138
		$this->reinitialiser();
24 jpm 139
		return $contenu;
23 jpm 140
	}
24 jpm 141
 
38 jpm 142
	private function traiterUrlParametres($url) {
143
		$parametres = array();
144
		if (! is_null($this->getLimiteDebut())) {
145
			$parametres[] = 'start='.$this->getLimiteDebut();
146
		}
147
		if (! is_null($this->getLimiteNbre())) {
148
			$parametres[] = 'limit='.$this->getLimiteNbre();
149
		}
52 jpm 150
		if (! is_null($this->ordre)) {
151
			$parametres[] = 'orderby='.urlencode($this->getOrdre());
152
		}
38 jpm 153
		if ($this->getDistinction() != 0) {
154
			$parametres[] = 'distinct='.$this->getDistinction();
155
		}
156
		if (count($parametres) > 0) {
157
			$url_parametres = implode('&', $parametres);
158
			$url = $url.'?'.$url_parametres;
159
		}
160
		return $url;
161
	}
162
 
24 jpm 163
	private function traiterEntete($entetes, $uri) {
164
		$infos = $this->analyserEntete($entetes, $uri);
165
		$this->traiterEnteteDebug($infos);
166
		$this->traiterEnteteMessage($infos);
167
	}
168
 
169
	private function analyserEntete($entetes, $uri) {
170
		$infos = array('date' => null, 'uri' => $uri, 'debugs' => null, 'messages' => null);
171
 
172
		if (isset($entetes['wrapper_data'])) {
173
			$entetes = $entetes['wrapper_data'];
174
		}
175
		foreach ($entetes as $entete) {
176
			if (preg_match('/^X-DebugJrest-Data: (.+)$/', $entete, $match)) {
177
				$infos['debugs'] = json_decode($match[1]);
178
			}
179
			if (preg_match('/^X-MessageJrest-Data: (.+)$/', $entete, $match)) {
180
				$infos['messages'] = json_decode($match[1]);
181
			}
182
			if (preg_match('/^Date: .+ ([012][0-9]:[012345][0-9]:[012345][0-9]) .*$/', $entete, $match)) {
183
				$infos['date'] = $match[1];
184
			}
185
		}
186
		return $infos;
187
	}
188
 
189
	private function traiterEnteteDebug($entetes) {
190
		if (isset($entetes['debugs'])) {
191
			$date = $entetes['date'];
192
			$uri = $entetes['uri'];
193
			$debugs = $entetes['debugs'];
194
			foreach ($debugs as $debug) {
195
				Debug::printr("DEBUG : $date - $uri :\n$debug");
196
			}
197
		}
198
	}
199
 
200
	private function traiterEnteteMessage($entetes) {
201
		if (isset($entetes['messages'])) {
202
			$date = $entetes['date'];
203
			$uri = $entetes['uri'];
204
			$messages = $entetes['messages'];
205
			foreach ($messages as $message) {
206
				Debug::printr("MESSAGE : $date - $uri :\n$message");
207
			}
208
		}
209
	}
52 jpm 210
 
211
	private function reinitialiser() {
212
		$this->viderDistinction();
213
		$this->viderLimite();
214
		$this->viderOrdre();
215
	}
6 jpm 216
}