Rev 2026 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** @package jrest* @author Aurélien Peronnet <aurelien@tela-botania.org>* @copyright 2010, 2013 Tela-Botanica* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL** Librairie de liaison d'images et d'observation à des mots clés en utilisant la méthode* path enumeration*/class GestionMotsClesChemin {private $config;private $mode;private $table_liaison;private $table_mots_cles;public function GestionMotsClesChemin($config, $mode) {$this->config = $config;//TODO: switch suivant mode$this->table_liaison = 'cel_obs_tag_path_liaison';$this->table_mots_cles = 'cel_obs_tag_path';}public function obtenirArbre($id_utilisateur, $chemin = "/") {$requete = "SELECT * FROM ".$this->table_mots_cles." "."WHERE id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." AND "."chemin LIKE = ".Cel::db()->proteger($chemin."%")." "."ORDER BY chemin"$arbre = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);usort($arbre, array('GestionMotsClesChemin', 'comparerProfNoeuds');return $arbre;}public function insererParChemin($mot_cle, $chemin, $id_utilisateur) {$chemin_mot_cle = rtrim($chemin, '/').'/'.self::simplifier($mot_cle);$requete = "INSERT INTO ".$this->table_mots_cles." (chemin, id_utilisateur, tag) "."VALUES (".Cel::db()->proteger($chemin_mot_cle).", ".Cel::db()->proteger($id_utilisateur).", ".Cel::db()->proteger($tag).", ".")";$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);return $insertion;}public function insererParIdParent($mot_cle, $id_parent, $id_utilisateur) {$mot_cle_simp = self::simplifier($mot_cle);$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." "."WHERE id_tag = "Cel::db()->proteger($id_parent).")";$requete = "INSERT INTO ".$this->table_mots_cles."(chemin, id_utilisateur, tag) "."VALUES ("."CONCAT($sous_requete_chemin.",",".Cel::db()->proteger($mot_cle_simp).",'/') ".Cel::db()->proteger($id_utilisateur).", ".Cel::db()->proteger($tag).", ".")";$insertion = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);return $insertion;}public function lierParId($id_mot_cle, $id_observation, $id_utilisateur) {$sous_requete_chemin = "(SELECT chemin FROM ".$this->table_mots_cles." "."WHERE id_tag = ".Cel::db()->proteger($id_mot_cle).") ";$requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) "."VALUES (".Cel::db()->proteger($id_observation).", ".$sous_requete_chemin.","Cel::db()->proteger($id_utilisateur)." ".") "."ON DUPLICATE KEY UPDATE id_obs = id_obs; ";$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);return $liaison;}public function lierParChemin($chemin, $id_observation, $id_utilisateur) {$requete = "INSERT INTO ".$this->table_liaison." (id_obs, chemin, id_utilisateur) "."VALUES (".Cel::db()->proteger($id_observation).", ".Cel::db()->proteger($sous_requete_chemin).", ".Cel::db()->proteger($id_utilisateur)." ".") "."ON DUPLICATE KEY UPDATE id_obs = id_obs; ";$liaison = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);return $liaison;}// Déplacer un mot clé et le renommer est une même opération, dans le cas du renommage,// seule la fin du chemin changepublic function renommerChemin($ancien_chemin, $nouveau_chemin, $id_utilisateur) {// TODO : triggers pour les tables liées ?$requete = "UPDATE ".$this->$table_mots_cles." ".// "SET tag = ""WHERE chemin LIKE ".Cel::db()->proteger($ancien_chemin."%")." AND "."id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";}public function supprimerChemin($chemin, $id_utilisateur) {// TODO : triggers pour les tables liées ?$requete = "DELETE FROM ".$this->$table_mots_cles." "."WHERE chemin LIKE ".Cel::db()->proteger($chemin."%")." AND "."id_utilisateur = ".Cel::db()->proteger($id_utilisateur)." ";$suppression = Cel::db()->executer($requete.' -- '.__FILE__.':'.__LINE__);return $suppression;}// Fonctions utilitairesstatic public function comparerProfNoeuds($a, $b) {$nb_slashs_a = substr_count($a['chemin'], '/');$nb_slashs_b = substr_count($a['chemin'], '/');$cmp = 0;if($nb_slashs_a == $nb_slashs_b) {$cmp = strcmp($a['chemin'], $b['chemin']);} else {$cmp = ($a['chemin'] > $b['chemin']) ? +1 : -1;}return $cmp;}/*CREATE TRIGGER maj_chemin BEFORE UPDATEON cel_obs_tag_path FOR EACH ROWBEGINUPDATE cel_obs_tag_path_liaisonSET cel_obs_tag_path_liaison.chemin = NEW.CHEMINWHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateurEND;CREATE TRIGGER suppr_chemin BEFORE UPDATEON cel_obs_tag_path FOR EACH ROWBEGINDELETE FROM cel_obs_tag_path_liaisonWHERE cel_obs_tag_path_liaison.chemin LIKE CONCAT(OLD.chemin,'%')AND cel_obs_tag_path_liaison.id_utilisateur = OLD.id_utilisateurEND;CREATE TRIGGER suppr_obs BEFORE DELETEON cel_obs FOR EACH ROWBEGINDELETE FROM cel_obs_tag_path_liaisonWHERE cel_obs_tag_path_liaison.id_obs = OLD.id_observationEND;*/// fonction de slugification du mot clé// http://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-stringstatic public function simplifier($text){// replace non letter or digits by -$text = preg_replace('~[^\\pL\d]+~u', '-', $text);// trim$text = trim($text, '-');// transliterate$text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);// lowercase$text = strtolower($text);// remove unwanted characters$text = preg_replace('~[^-\w]+~', '', $text);if (empty($text)){return 'n-a';}return $text;}}?>