Subversion Repositories eFlore/Applications.cel

Rev

Rev 416 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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