Completed
Push — master ( 1557b4...af6f2f )
by Jean-Christophe
01:17
created

Jquery::_getResponseElement()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
3
namespace micro\js;
4
5
use micro\utils\StrUtils;
6
use micro\utils\JArray;
7
use micro\controllers\Startup;
8
9
/**
10
 * Utilitaires d'insertion de scripts côté client (JQuery)
11
 * @author jc
12
 * @version 1.0.0.3
13
 */
14
class Jquery {
15
	private static $codes=array ();
16
	private static $condition=NULL;
17
	private static $else=NULL;
18
	private static $persists=false;
19
20
	private static function _prep_element($element) {
21
		if (strrpos($element, 'this') === false && strrpos($element, 'event') === false) {
22
			$element='"' . $element . '"';
23
		}
24
		return $element;
25
	}
26
27
	private static function _prep_value($value) {
28
		if (is_array($value)) {
29
			$array=array_map("micro\js\self::_prep_value", $value);
30
			$value=implode(",", $array);
31
		} else if (strrpos($value, 'this') === false && strrpos($value, 'event') === false && is_numeric($value) === false) {
32
			$value='"' . $value . '"';
33
		}
34
		return $value;
35
	}
36
37
	/**
38
	 * Ajoute $code à la liste des codes à exécuter
39
	 */
40
	private static function addToCodes($code) {
41
		$codeObject=new JsCode($code);
42
		self::$codes[]=$codeObject;
43
		return $codeObject;
44
	}
45
46
	private static function addScript($code) {
47
		$code="$( document ).ready(function() {\n" . $code . "}\n);";
48
		return preg_filter("/(\<script[^>]*?\>)?(.*)(\<\/script\>)?/si", "<script>$2 </script>\n", $code, 1);
49
	}
50
51
	protected static function _getAjaxUrl($url, $attr) {
52
		$url=self::_correctAjaxUrl($url);
53
		$retour="url='" . $url . "';\n";
54
		$slash="/";
55
		if (StrUtils::endsWith($url, "/"))
56
			$slash="";
57
		if (StrUtils::isNotNull($attr)) {
58
			if ($attr == "value")
59
				$retour.="url=url+'" . $slash . "'+$(this).val();\n";
60
			else if ($attr !== null && $attr !== "")
61
				$retour.="url=url+'" . $slash . "'+($(this).attr('" . $attr . "')||'');\n";
62
		}
63
		return $retour;
64
	}
65
66
	protected static function _getResponseElement($responseElement) {
67
		if ($responseElement !== "") {
68
			$responseElement=self::_prep_value($responseElement);
69
		}
70
		return $responseElement;
71
	}
72
73
	protected static function _correctAjaxUrl($url) {
74
		if (StrUtils::endsWith($url, "/"))
75
			$url=substr($url, 0, strlen($url) - 1);
76
		if (strncmp($url, 'http://', 7) != 0 && strncmp($url, 'https://', 8) != 0) {
77
			$url=Startup::getConfig()["siteUrl"] . $url;
78
		}
79
		return $url;
80
	}
81
82
	public static function addParam($parameter, $params) {
83
		$params=preg_filter("/[\{]?([^\\}]*)[\}]?/si", "$1", $params, 1);
84
		$values=explode(",", $params);
85
		$values[]=$parameter;
86
		return "{" . implode(",", $values) . "}";
87
	}
88
89
	/**
90
	 * Associe du code javascript à exécuter sur l'évènement $event d'un élément DOM $element
91
	 */
92
	public static function bindToElement($element, $event, $jsCode, $parameters=array()) {
93
		$preventDefault=JArray::getDefaultValue($parameters, "preventDefault", true);
94
		$stopPropagation=JArray::getDefaultValue($parameters, "stopPropagation", true);
95
		$function="function(event){";
96
		if ($preventDefault) {
97
			$function.="event.preventDefault();";
98
		}
99
		if ($stopPropagation) {
100
			$function.="event.stopPropagation();";
101
		}
102
		if (isset(self::$condition)) {
103
			$jsCode="if(" . self::$condition . "){" . $jsCode . "}";
104
			if (isset(self::$else)) {
105
				$jsCode.=" else{" . self::$else . "}";
106
			}
107
		}
108
		if (!self::$persists) {
109
			self::$condition=NULL;
110
			self::$else=NULL;
111
		}
112
		$function.=$jsCode . "}";
113
		return self::addToCodes("$(" . self::_prep_element($element) . ").bind('" . $event . "'," . $function . ");");
114
	}
115
116
	/**
117
	 * Exécute le script passé en paramètre, sur l'évènement $event généré sur $element
118
	 * @param String $script
119
	 * @param String $event
120
	 * @param String $element
121
	 * @return mixed
122
	 */
123
	public static function executeOn($element, $event, $script, $parameters=array("preventDefault"=>false,"stopPropagation"=>false)) {
124
		return self::bindToElement($element, $event, $script, $parameters);
125
	}
126
127
	/**
128
	 * Exécute le script passé en paramètre
129
	 * @param String $script
130
	 * @return mixed
131
	 */
132
	public static function execute($script) {
133
		return self::addToCodes($script);
134
	}
135
136
	/**
137
	 * Effectue une requête en ajax (POST ou GET)
138
	 * @param string $url Adresse de la requête
139
	 * @param string $responseElement id de l'élément HTML affichant la réponse
140
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
141
	 */
142
	protected static function _ajax($url, $responseElement="", $method="get", $parameters=array()) {
143
		$jsCallback=JArray::getDefaultValue($parameters, "jsCallback", null);
144
		$attr=JArray::getDefaultValue($parameters, "attr", "id");
145
		$params=JArray::getDefaultValue($parameters, "params", "{}");
146
147
		$retour=self::_getAjaxUrl($url, $attr);
148
149
		$retour.="$." . $method . "(url," . $params . ").done(function( data ) {\n";
150
		if ($responseElement !== "")
151
			$retour.="\t$('" . $responseElement . "').html( data );\n";
152
		$retour.="\t" . $jsCallback . "\n
153
		});\n";
154
		return $retour;
155
	}
156
157
	/**
158
	 * Effectue un GET en ajax
159
	 * @param string $url Adresse de la requête
160
	 * @param string $responseElement id de l'élément HTML affichant la réponse
161
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
162
	 */
163
	public static function _get($url, $responseElement="", $parameters=array()) {
164
		return self::_ajax($url, $responseElement, "get", $parameters);
165
	}
166
167
	/**
168
	 * Effectue un GET en ajax
169
	 * @param string $url Adresse de la requête
170
	 * @param string $responseElement id de l'élément HTML affichant la réponse
171
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
172
	 */
173
	public static function get($url, $responseElement="", $parameters=array()) {
174
		return self::addToCodes(self::_get($url, $responseElement, $parameters));
175
	}
176
177
	/**
178
	 * Effectue un POST en ajax
179
	 * @param string $url Adresse de la requête
180
	 * @param string $responseElement id de l'élément HTML affichant la réponse
181
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
182
	 */
183
	public static function _post($url, $responseElement="", $parameters=array()) {
184
		return self::_ajax($url, $responseElement, "post", $parameters);
185
	}
186
187
	/**
188
	 * Effectue un POST en ajax
189
	 * @param string $url Adresse de la requête
190
	 * @param string $responseElement id de l'élément HTML affichant la réponse
191
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
192
	 */
193
	public static function post($url, $responseElement="", $parameters=array()) {
194
		return self::addToCodes(self::_post($url, $responseElement, $parameters));
195
	}
196
197
	/**
198
	 * Effectue un POST d'un formulaire en ajax
199
	 * @param string $url Adresse de la requête
200
	 * @param string $form id du formulaire à poster
201
	 * @param string $responseElement id de l'élément HTML affichant la réponse
202
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","validation"=>false)
203
	 */
204
	public static function _postForm($url, $form, $responseElement, $parameters=array()) {
205
		$jsCallback=JArray::getDefaultValue($parameters, "jsCallback", null);
206
		$attr=JArray::getDefaultValue($parameters, "attr", "id");
207
		$validation=JArray::getDefaultValue($parameters, "validation", false);
208
209
		$retour="url='" . $url . "';\n";
210
		if ($attr == "value")
211
			$retour.="url=url+'/'+$(this).val();\n";
212
		else
213
			$retour.="url=url+'/'+$(this).attr('" . $attr . "');\n";
214
		$retour.="$.post(url,$(" . $form . ").serialize()).done(function( data ) {\n";
215
		if ($responseElement !== "")
216
			$retour.="\t$('" . $responseElement . "').html( data );\n";
217
		$retour.="\t" . $jsCallback . "\n
218
		});\n";
219
		if ($validation) {
220
			$retour="$('#" . $form . "').validate({submitHandler: function(form) {
221
			" . $retour . "
222
			}});\n";
223
			$retour.="$('#" . $form . "').submit();\n";
224
		}
225
		return $retour;
226
	}
227
228
	/**
229
	 * Effectue un POST d'un formulaire en ajax
230
	 * @param string $url Adresse de la requête
231
	 * @param string $form id du formulaire à poster
232
	 * @param string $responseElement id de l'élément HTML affichant la réponse
233
	 * @param array $parameters default : array("jsCallback"=>NULL,"attr"=>"id","validation"=>false)
234
	 */
235
	public static function postForm($url, $form, $responseElement, $parameters=array()) {
236
		return self::addToCodes(self::_postForm($url, $form, $responseElement, $parameters));
237
	}
238
239
	/**
240
	 * Affecte une valeur à un élément HTML
241
	 * @param string $element
242
	 * @param string $value
243
	 */
244
	public static function _setVal($element, $value, $jsCallback="") {
245
		return "$(" . self::_prep_element($element) . ").val(" . $value . ");\n" . $jsCallback;
246
	}
247
248
	/**
249
	 * Affecte une valeur à un élément HTML
250
	 * @param string $element
251
	 * @param string $value
252
	 */
253
	public static function setVal($element, $value, $jsCallback="") {
254
		return self::addToCodes(self::_setVal($element, $value, $jsCallback));
255
	}
256
257
	public static function _setHtml($element, $html="", $jsCallback="") {
258
		return "$(" . self::_prep_element($element) . ").html('" . $html . "');\n" . $jsCallback;
259
	}
260
261
	/**
262
	 * Affecte du html à un élément
263
	 * @param string $element
264
	 * @param string $html
265
	 */
266
	public static function setHtml($element, $html="", $jsCallback="") {
267
		return self::addToCodes(self::_setHtml($element, $html, $jsCallback));
268
	}
269
270
	private static function _setAttr($element, $attr, $value="", $jsCallback="") {
271
		return "$('" . $element . "').attr('" . $attr . "'," . $value . ");\n" . $jsCallback;
272
	}
273
274
	/**
275
	 * Modifie l'attribut $attr d'un élément html
276
	 * @param string $element
277
	 * @param string $attr attribut à modifier
278
	 * @param string $value nouvelle valeur
279
	 */
280
	public static function setAttr($element, $attr, $value="", $jsCallback="") {
281
		return self::addToCodes(self::_setAttr($element, $attr, $value, $jsCallback));
282
	}
283
284
	/**
285
	 * Appelle la méthode JQuery $someThing sur $element avec passage éventuel du paramètre $param
286
	 * @param string $element
287
	 * @param string $someThing
288
	 * @param string $param
289
	 * @return mixed
290
	 */
291
	public static function _doJquery($element, $someThing, $param="", $jsCallback="") {
292
		return "$(" . self::_prep_element($element) . ")." . $someThing . "(" . self::_prep_value($param) . ");\n" . $jsCallback;
293
	}
294
295
	/**
296
	 * Appelle la méthode JQuery $someThing sur $element avec passage éventuel du paramètre $param
297
	 * @param string $element
298
	 * @param string $someThing
299
	 * @param string $param
300
	 * @return mixed
301
	 */
302
	public static function doJquery($element, $someThing, $param="", $jsCallback="") {
303
		return self::addToCodes(self::_doJquery($element, $someThing, $param, $jsCallback));
304
	}
305
306
	/**
307
	 * Effectue un get vers $url sur l'évènement $event de $element en passant les paramètres $params
308
	 * puis affiche le résultat dans $responseElement
309
	 * @param string $event
310
	 * @param string $element
311
	 * @param string $url
312
	 * @param string $responseElement
313
	 * @param array $parameters default : array("preventDefault"=>true,"stopPropagation"=>true,"jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
314
	 */
315
	public static function getOn($event, $element, $url, $responseElement="", $parameters=array()) {
316
		return self::bindToElement($element, $event, self::_get($url, $responseElement, $parameters), $parameters);
317
	}
318
319
	/**
320
	 * Effectue un post vers $url sur l'évènement $event de $element en passant les paramètres $params
321
	 * puis affiche le résultat dans $responseElement
322
	 * @param string $event
323
	 * @param string $element
324
	 * @param string $url
325
	 * @param string $responseElement
326
	 * @param array $parameters default : array("preventDefault"=>true,"stopPropagation"=>true,"jsCallback"=>NULL,"attr"=>"id","params"=>"{}")
327
	 */
328
	public static function postOn($event, $element, $url, $responseElement="", $parameters=array()) {
329
		return self::bindToElement($element, $event, self::_post($url, $responseElement, $parameters), $parameters);
330
	}
331
332
	/**
333
	 * Effectue un post vers $url sur l'évènement $event de $element en passant les paramètres du formulaire $form
334
	 * puis affiche le résultat dans $responseElement
335
	 * @param string $event
336
	 * @param string $element
337
	 * @param string $url
338
	 * @param string $form
339
	 * @param string $responseElement
340
	 * @param array $parameters default : array("preventDefault"=>true,"stopPropagation"=>true,"jsCallback"=>NULL,"attr"=>"id","validation"=>false)
341
	 */
342
	public static function postFormOn($event, $element, $url, $form, $responseElement="", $parameters=array()) {
343
		return self::bindToElement($element, $event, self::_postForm($url, $form, $responseElement, $parameters), $parameters);
344
	}
345
346
	/**
347
	 * Modifie la valeur de $elementToModify et lui affecte $valeur sur l'évènement $event de $element
348
	 * @param string $event
349
	 * @param string $element
350
	 * @param string $elementToModify
351
	 * @param string $value
352
	 * @param array $parameters default : array("preventDefault"=>true,"stopPropagation"=>true,"jsCallback"=>NULL)
353
	 * @return mixed
354
	 */
355
	public static function setOn($event, $element, $elementToModify, $value="", $parameters=array("preventDefault"=>false,"stopPropagation"=>false)) {
356
		$jsCallback=JArray::getDefaultValue($parameters, "jsCallback", null);
357
		return self::bindToElement($element, $event, self::_setVal($elementToModify, $value, $jsCallback), $parameters);
358
	}
359
360
	/**
361
	 * Modifie la valeur de $elementToModify et lui affecte $valeur sur l'évènement $event de $element
362
	 * @param string $event
363
	 * @param string $element
364
	 * @param string $elementToModify
365
	 * @param string $value
366
	 * @param string $jsCallback
367
	 * @return mixed
368
	 */
369
	public static function setHtmlOn($event, $element, $elementToModify, $value="", $jsCallback="") {
370
		return self::bindToElement($element, $event, self::_setHtml($elementToModify, $value, $jsCallback));
371
	}
372
373
	/**
374
	 * Appelle la méthode JQuery $someThing sur $elementToModify avec passage éventuel du paramètre $param, sur l'évènement $event généré sur $element
375
	 * @param string $element
376
	 * @param string $event
377
	 * @param string $element
378
	 * @param string $someThing
379
	 * @param string $param
380
	 */
381
	public static function doJqueryOn($element, $event, $elementToModify, $someThing, $param="", $jsCallback="") {
382
		return self::bindToElement($element, $event, self::_doJquery($elementToModify, $someThing, $param, $jsCallback));
383
	}
384
385
	public static function setChecked($elementPrefix, $values) {
386
		$retour="";
387
		if (is_array($values)) {
388
			foreach ( $values as $value ) {
389
				$retour.="$('#" . $elementPrefix . $value . "').attr('checked', true);\n";
390
			}
391
		} else
392
			$retour="$('#" . $elementPrefix . "').attr('checked', " . StrUtils::getBooleanStr($values) . ");\n";
393
		return self::addToCodes($retour);
394
	}
395
396
	/**
397
	 * Retourne l'ensemble du code js à exécuter, entouré des balises script
398
	 * @return string le code à exécuter
399
	 */
400
	public static function compile() {
401
		$result="";
402
		foreach ( self::$codes as $c ) {
403
			$result.=$c->getCode();
404
		}
405
		return self::addScript($result);
406
	}
407
408
	/**
409
	 * Efface les codes js à exécuter
410
	 */
411
	public static function clearCodes() {
412
		self::$codes=array ();
413
	}
414
415
	/**
416
	 * Pose une condition sur l'exécution du code associé à des évènements
417
	 * @param string $condition condition javascript à poser
418
	 * @param string $else code javascript à exécuter si la condition est fausse
419
	 * @param boolean $persists détermine si la condition est persistante.<br> Si vrai, elle sera appliquée également pour les évènements suivants
420
	 */
421
	public static function startCondition($condition, $else=NULL, $persists=true) {
422
		self::$condition=$condition;
423
		self::$else=$else;
424
		self::$persists=$persists;
425
	}
426
427
	/**
428
	 * Désactive une condition activée avec l'option $persists à true
429
	 */
430
	public static function endCondition() {
431
		self::$condition=NULL;
432
		self::$else=NULL;
433
		self::$persists=false;
434
	}
435
}
436