Subversion Repositories eFlore/Applications.cel

Rev

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

Rev 2459 Rev 2462
Line 1... Line 1...
1
<?php
1
<?php
-
 
2
// declare(encoding='UTF-8');
2
/**
3
/**
-
 
4
 * Classe de liaison d'images et d'observation à des mots clés en utilisant la méthode path enumeration.
-
 
5
 *
-
 
6
 * @internal   Mininum PHP version : 5.2
-
 
7
 * @category   CEL
3
* @package   jrest
8
 * @package    Services
-
 
9
 * @subpackage Bibliothèques
-
 
10
 * @version    0.1
4
* @author    Aurélien Peronnet <aurelien@tela-botania.org>
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
5
* @copyright 2010, 2013 Tela-Botanica
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
6
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
7
*
-
 
8
* Librairie de liaison d'images et d'observation à des mots clés en utilisant la méthode
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
* path enumeration
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
10
*/
17
 */
11
 
-
 
12
class GestionMotsClesChemin {
18
class GestionMotsClesChemin {
Line 13... Line 19...
13
 
19
 
14
	private $config;
20
	private $config;
Line 52... Line 58...
52
 
58
 
53
		$sousRequete = "SELECT chemin FROM {$this->table_mots_cles} WHERE id_mot_cle = $idMotCleP ";
59
		$sousRequete = "SELECT chemin FROM {$this->table_mots_cles} WHERE id_mot_cle = $idMotCleP ";
54
		$requete = 'SELECT id_mot_cle '.
60
		$requete = 'SELECT id_mot_cle '.
55
			"FROM {$this->table_mots_cles} ".
61
			"FROM {$this->table_mots_cles} ".
56
			"WHERE chemin LIKE CONCAT(($sousRequete), '%') ".
62
			"WHERE chemin LIKE CONCAT(($sousRequete), '%') ".
57
			"AND id_utilisateur = ".$idUtilisateurP." ".
63
			"AND id_utilisateur = $idUtilisateurP ".
58
			' -- '.__FILE__.':'.__LINE__;
-
 
59
 
64
			' -- '.__FILE__.':'.__LINE__;
60
		$ids_enfants = Cel::db()->requeter($requete);
-
 
61
 
-
 
62
		return $ids_enfants;
65
		return Cel::db()->requeter($requete);
Line 63... Line 66...
63
	}
66
	}
64
 
67
 
65
	/**
68
	/**
66
	 * Retourne la liste des mots clés pour l'élément lié fourni. Ne tient pas compte de l'utilisateur
69
	 * Retourne la liste des mots clés pour l'élément lié fourni. Ne tient pas compte de l'utilisateur
67
	 * car seul le propriétaire d'un élément lié peut y lier des mots clés
70
	 * car seul le propriétaire d'un élément lié peut y lier des mots clés
68
	 */
71
	 */
Line 69... Line 72...
69
	public function obtenirIdsMotsClesParIdElementLie($id_element_lie) {
72
	public function obtenirIdsMotsClesParIdElementLie($id_element_lie) {
-
 
73
		$idElementLieP = Cel::db()->proteger($id_element_lie);
70
		$idElementLieP = Cel::db()->proteger($id_element_lie);
74
 
71
 
-
 
72
		$requete = "SELECT id_mot_cle FROM {$this->table_liaison} WHERE id_element_lie = $idElementLieP" .
75
		$requete = "SELECT id_mot_cle FROM {$this->table_liaison} ".
73
			' -- '.__FILE__.':'.__LINE__;
-
 
74
 
-
 
75
		$ids_mots_cles = Cel::db()->requeter($requete);
76
			"WHERE id_element_lie = $idElementLieP ".
Line 76... Line 77...
76
 
77
			' -- '.__FILE__.':'.__LINE__;
77
		return $ids_mots_cles;
78
		return Cel::db()->requeter($requete);
78
	}
79
	}
Line 86... Line 87...
86
		$requete = 'SELECT id_mot_cle '.
87
		$requete = 'SELECT id_mot_cle '.
87
			"FROM {$this->table_mots_cles} ".
88
			"FROM {$this->table_mots_cles} ".
88
			"WHERE chemin = $cheminMotCleP ".
89
			"WHERE chemin = $cheminMotCleP ".
89
			"AND id_utilisateur = $idUtilisateurP ".
90
			"AND id_utilisateur = $idUtilisateurP ".
90
			' -- '.__FILE__.':'.__LINE__;
91
			' -- '.__FILE__.':'.__LINE__;
91
 
-
 
92
		$infosMotCle = Cel::db()->requeter($requete);
92
		$infosMotCle = Cel::db()->requeter($requete);
Line 93... Line 93...
93
 
93
 
94
		if (!empty($infosMotCle)) {
94
		if (!empty($infosMotCle)) {
95
			$idMotCle = $infosMotCle[0]['id_mot_cle'];
95
			$idMotCle = $infosMotCle[0]['id_mot_cle'];
Line 108... Line 108...
108
 
108
 
109
		$requete = "INSERT INTO {$this->table_mots_cles} ".
109
		$requete = "INSERT INTO {$this->table_mots_cles} ".
110
			'(chemin, id_utilisateur, mot_cle) '.
110
			'(chemin, id_utilisateur, mot_cle) '.
111
			"VALUES ($cheminMotCleP, $idUtilisateurP, $motCleP ) ".
111
			"VALUES ($cheminMotCleP, $idUtilisateurP, $motCleP ) ".
112
			' -- '.__FILE__.':'.__LINE__;
-
 
113
 
112
			' -- '.__FILE__.':'.__LINE__;
-
 
113
		$insertion = Cel::db()->executer($requete);
114
		$insertion = Cel::db()->executer($requete);
114
 
115
		$resultat = false;
115
		$resultat = false;
116
		if ($insertion !== false) {
116
		if ($insertion !== false) {
117
			$resultat = Cel::db()->obtenirDernierId();
117
			$resultat = Cel::db()->obtenirDernierId();
118
		}
118
		}
Line 135... Line 135...
135
		}
135
		}
Line 136... Line 136...
136
 
136
 
137
		$requete = "INSERT INTO {$this->table_mots_cles} (chemin, id_utilisateur, mot_cle) ".
137
		$requete = "INSERT INTO {$this->table_mots_cles} (chemin, id_utilisateur, mot_cle) ".
138
			"VALUES (CONCAT($sousRequete, $motCleSimpleP, '/'), $idUtilisateurP, $motCleP ) ".
138
			"VALUES (CONCAT($sousRequete, $motCleSimpleP, '/'), $idUtilisateurP, $motCleP ) ".
139
			' -- '.__FILE__.':'.__LINE__;
-
 
140
 
139
			' -- '.__FILE__.':'.__LINE__;
-
 
140
		$insertion = Cel::db()->executer($requete);
141
		$insertion = Cel::db()->executer($requete);
141
 
142
		if ($insertion !== false) {
142
		if ($insertion !== false) {
143
			$resultat = Cel::db()->obtenirDernierId();
143
			$resultat = Cel::db()->obtenirDernierId();
144
		}
144
		}
145
		return $resultat;
145
		return $resultat;
Line 151... Line 151...
151
 
151
 
152
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
152
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
153
			"VALUES ($idElementLieP, $idMotCleP) ".
153
			"VALUES ($idElementLieP, $idMotCleP) ".
154
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
154
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
155
			' -- '.__FILE__.':'.__LINE__;
-
 
156
 
155
			' -- '.__FILE__.':'.__LINE__;
157
		$liaison = Cel::db()->executer($requete);
-
 
158
		return $liaison;
156
		return Cel::db()->executer($requete);
Line 159... Line 157...
159
	}
157
	}
160
 
158
 
161
	public function lierParChemin($chemin, $id_element_lie, $id_utilisateur) {
159
	public function lierParChemin($chemin, $id_element_lie, $id_utilisateur) {
Line 170... Line 168...
170
			')';
168
			')';
171
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
169
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
172
			"VALUES ($idElementLieP, $sousRequete) ".
170
			"VALUES ($idElementLieP, $sousRequete) ".
173
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
171
			'ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie '.
174
			' -- '.__FILE__.':'.__LINE__;
172
			' -- '.__FILE__.':'.__LINE__;
175
 
-
 
176
		$liaison = Cel::db()->executer($requete);
173
		return Cel::db()->executer($requete);
177
		return $liaison;
-
 
178
	}
174
	}
Line 179... Line 175...
179
 
175
 
180
	public function lierParTableaux($ids_mots_cles, $ids_elements_lies) {
176
	public function lierParTableaux($ids_mots_cles, $ids_elements_lies) {
181
		$combinaisons = array();
177
		$combinaisons = array();
Line 190... Line 186...
190
		$valeursGroupees = implode(', ', $combinaisons);
186
		$valeursGroupees = implode(', ', $combinaisons);
191
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
187
		$requete = "INSERT INTO {$this->table_liaison} (id_element_lie, id_mot_cle) ".
192
			"VALUES $valeursGroupees ".
188
			"VALUES $valeursGroupees ".
193
			"ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie ".
189
			"ON DUPLICATE KEY UPDATE id_element_lie = id_element_lie ".
194
			' -- '.__FILE__.':'.__LINE__;
190
			' -- '.__FILE__.':'.__LINE__;
195
		$liaison = Cel::db()->executer($requete);
191
		return Cel::db()->executer($requete);
196
 
-
 
197
		return $liaison;
-
 
198
	}
192
	}
Line 199... Line 193...
199
 
193
 
200
	/**
194
	/**
201
	 * Modifie les liaisons aux mots clés pour chaque element lié, en supprimant et ajoutant seulement les
195
	 * Modifie les liaisons aux mots clés pour chaque element lié, en supprimant et ajoutant seulement les
202
	 * mots clés qui ont changé, sans toucher à ceux qui sont conservés. Ça évite de tout supprimer avant,
196
	 * mots clés qui ont changé, sans toucher à ceux qui sont conservés. Ça évite de tout supprimer avant,
203
	 * et ainsi de perdre la date de liaison des mots clés conservés.
197
	 * et ainsi de perdre la date de liaison des mots clés conservés.
204
	 * Si $supprimer est true, les mots clefs existant mais non spécifiés dans le POST seront supprimés,
198
	 * Si $supprimer est true, les mots clefs existant mais non spécifiés dans le POST seront supprimés,
205
	 * sinon ils seront laissés en l'état.
199
	 * sinon ils seront laissés en l'état.
206
	 */ 
200
	 */
207
	public function modifierLiaisonParTableaux($ids_mots_cles, $ids_elements_lies, $supprimer) {
201
	public function modifierLiaisonParTableaux($ids_mots_cles, $ids_elements_lies, $supprimer) {
208
		$reussi = true;
-
 
209
 
202
		$reussi = true;
210
		foreach ($ids_elements_lies as $id_element_lie) {
203
		foreach ($ids_elements_lies as $id_element_lie) {
211
			$idElementLieP = Cel::db()->proteger($id_element_lie);
204
			$idElementLieP = Cel::db()->proteger($id_element_lie);
212
			// trouver les mots clés actuels
205
			// trouver les mots clés actuels
213
			$ids_mots_cles_actuels = $this->obtenirIdsMotsClesParIdElementLie($id_element_lie);
206
			$ids_mots_cles_actuels = $this->obtenirIdsMotsClesParIdElementLie($id_element_lie);
Line 255... Line 248...
255
					' -- '.__FILE__.':'.__LINE__;
248
					' -- '.__FILE__.':'.__LINE__;
256
				$resultat = Cel::db()->executer($requete);
249
				$resultat = Cel::db()->executer($requete);
257
				$reussi = ($reussi && $resultat);
250
				$reussi = ($reussi && $resultat);
258
			}
251
			}
259
		}
252
		}
260
 
-
 
261
		return $reussi;
253
		return $reussi;
262
	}
254
	}
Line 263... Line 255...
263
 
255
 
264
	public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
256
	public function supprimerLiaisonsMotsCles($ids_mots_cles, $ids_elements_lies, $id_utilisateur) {
Line 273... Line 265...
273
		$clauseWhere = implode(' OR ', $combinaisons);
265
		$clauseWhere = implode(' OR ', $combinaisons);
Line 274... Line 266...
274
 
266
 
275
		$requete = "DELETE FROM {$this->table_liaison} ".
267
		$requete = "DELETE FROM {$this->table_liaison} ".
276
			"WHERE $clauseWhere ".
268
			"WHERE $clauseWhere ".
277
			' -- '.__FILE__.':'.__LINE__;
-
 
278
 
269
			' -- '.__FILE__.':'.__LINE__;
279
		$suppression = Cel::db()->executer($requete);
-
 
280
		return $suppression;
270
		return Cel::db()->executer($requete);
Line 281... Line 271...
281
	}
271
	}
282
 
272
 
283
	public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies) {
273
	public function supprimerToutesLiaisonsPourIdsElementsLies($ids_elements_lies) {
Line 608... Line 598...
608
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
598
		list($table_liaison, $table_mots_cles) = self::getTablesMotsClesEtLiaisons($mode);
609
		$requeteTpl = "SELECT id_element_lie FROM $table_liaison WHERE id_mot_cle IN (%s) ";
599
		$requeteTpl = "SELECT id_element_lie FROM $table_liaison WHERE id_mot_cle IN (%s) ";
610
		return $requeteTpl;
600
		return $requeteTpl;
611
	}
601
	}
Line 612... Line 602...
612
 
602
 
Line 613... Line 603...
613
	// Fonctions utilitaires
603
	// Méthodes utilitaires
614
 
604
 
615
	/**
605
	/**
616
	 * La profondeur d'un noeud est déterminée par le nombre de slashs
606
	 * La profondeur d'un noeud est déterminée par le nombre de slashs
Line 635... Line 625...
635
 
625
 
636
	static public function harmoniserChemin($chemin) {
626
	static public function harmoniserChemin($chemin) {
637
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
627
		$chemin = self::startsWith($chemin,'/') ? $chemin : '/'.$chemin;
638
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
628
		$chemin = self::endsWith($chemin,'/') ? $chemin : $chemin.'/';
639
		$chemin = str_replace('//', '/', $chemin);
629
		$chemin = str_replace('//', '/', $chemin);
640
		// mise en minuscule du chemin afin d'éviter des cas où l'on aurait 
630
		// mise en minuscule du chemin afin d'éviter des cas où l'on aurait
641
		// des même mots clés avec minuscule et majuscule
631
		// des même mots clés avec minuscule et majuscule
642
		$chemin = strtolower($chemin);
632
		$chemin = strtolower($chemin);
643
		$chemin = self::supprimerAccents($chemin);
633
		$chemin = self::supprimerAccents($chemin);
644
		return $chemin;
634
		return $chemin;
645
	}
635
	}
646
	
636
 
647
	function supprimerAccents($str, $charset='utf-8')
-
 
648
	{
637
	static function supprimerAccents($str, $charset='utf-8') {
649
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
-
 
650
	
638
		$str = htmlentities($str, ENT_NOQUOTES, $charset);
651
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
639
		$str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str);
652
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
640
		$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. '&oelig;'
653
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
-
 
654
	
641
		$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères
655
		return $str;
642
		return $str;
Line 656... Line 643...
656
	}
643
	}
657
 
644
 
Line 676... Line 663...
676
		$valeur = str_replace('null', '', $chaine);
663
		$valeur = str_replace('null', '', $chaine);
677
		$valeur = trim($valeur, ';;');
664
		$valeur = trim($valeur, ';;');
678
		return $valeur;
665
		return $valeur;
679
	}
666
	}
Line 680... Line 667...
680
 
667
 
681
	static public function startsWith($haystack, $needle) {
668
	public static function startsWith($haystack, $needle) {
682
		return $needle === '' || strpos($haystack, $needle) === 0;
669
		return $needle === '' || strpos($haystack, $needle) === 0;
Line 683... Line 670...
683
	}
670
	}
684
 
671
 
685
	static public function endsWith($haystack, $needle) {
672
	public  static function endsWith($haystack, $needle) {
Line 686... Line 673...
686
		return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
673
		return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
687
	}
674
	}
Line 713... Line 700...
713
 
700
 
714
		$migration = Cel::db()->executer($requete_migration_mc);
701
		$migration = Cel::db()->executer($requete_migration_mc);
715
		$migration = ($migration !== false) ? true : false;
702
		$migration = ($migration !== false) ? true : false;
716
		return $migration;
703
		return $migration;
717
	}
704
	}
718
}
-
 
719
?>
705
}