| 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. 'œ'
|
640 |
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ'
|
| 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 |
}
|