* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ class InventoryImageLink extends Cel { public function createElement($pairs) { // Controle detournement utilisateur $this->controleUtilisateur($pairs['ce_utilisateur']); $id_utilisateur = $pairs['ce_utilisateur']; if (!isset($pairs['id_image'])) { die('err'); } // filtrage des entiers $ids_observations = self::filterInt($pairs['id_observation']); $ids_images = self::filterInt($pairs['id_image']); if (empty($ids_images) || empty($ids_observations)) { die('err'); } // filtrage des entiers à partir des ids existant réellement en DB $ids_images_filtrees = $this->filtrerImgUtilisateur($ids_images, $id_utilisateur); $infos_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur); $ids_observations_filtrees = self::extraireValeurs($infos_observations_filtrees, 'id_observation'); if (empty($ids_images_filtrees) || empty($ids_observations_filtrees)) { die('err'); } $values = array(); foreach ($ids_images_filtrees as $id_img) { foreach ($infos_observations_filtrees as $infos_obs) { $id_obs = $infos_obs['id_observation']; $dateTransmission = ($infos_obs['date_transmission'] != '') ? Cel::db()->proteger($infos_obs['date_transmission']) : 'NULL' ; $transmission = $infos_obs['transmission']; $values[] = "($id_img, $id_obs, NOW(), NOW(), $dateTransmission, $transmission)"; } } $clauseValues = implode(',', $values); // ceci n'est pas un INSERT, c'est un UPDATE multiple en une seule requête $requete = 'INSERT INTO cel_images (id_image, ce_observation, date_modification, date_liaison, date_transmission, transmission) '. "VALUES $clauseValues ". 'ON DUPLICATE KEY UPDATE '. ' ce_observation = VALUES(ce_observation), '. ' date_modification = NOW(), '. ' date_liaison = NOW(), '. ' date_transmission = VALUES(date_transmission), '. ' transmission = VALUES(transmission) '. ' -- ' . __FILE__ . ':' . __LINE__; $resultat = Cel::db()->executer($requete); if ($resultat) { // mise à jour de la date de modification de l'observation $idsObsConcat = implode(', ', $ids_observations); $requete = "UPDATE cel_obs SET date_modification = NOW() ". "WHERE id_observation IN ($idsObsConcat) ". ' -- ' . __FILE__ . ':' . __LINE__; $resultat = Cel::db()->executer($requete); // @TODO faudrait faire une transaction et retourner false si l'UPDATE de cel_obs échoue exit('OK'); } exit(); // peut-être qu'aucune mise à jour n'a eu lieu (ON DUPLICATE KEY) } /** * Retourne les identifiants des images liées à une observation ou l'identifiant de l'obs liée à une image, suivant le paramètre : * uid[0] : utilisateur obligatoire * uid[1] : id_observation=valeur ou bien id_image=valeur */ public function getElement($uid) { // Controle detournement utilisateur $this->controleUtilisateur($uid[0]); if ($uid) { $param = $uid[1] ; //TODO utiliser le GET plutôt pour récuperer id image ou observation list($field, $value) = explode('=', $param); $valueP = Cel::db()->proteger($value); if ($field == 'id_observation') { $requete = 'SELECT id_image, hauteur , largeur '. 'FROM cel_images '. "WHERE ce_observation = $valueP ". ' -- '.__FILE__.':'.__LINE__; } else if ($field == 'id_image') { $requete = 'SELECT co.* '. 'FROM cel_obs AS co INNER JOIN cel_images AS ci ON (co.id_observation = ci.ce_observation) '. "WHERE id_image = $valueP ". ' -- '.__FILE__.':'.__LINE__; } } $resultats = Cel::db()->requeter($requete); $liaisons = array(); if (is_array($resultats) && count($resultats) > 0) { $liaisons = $resultats; if ($field == 'id_image') { foreach ($liaisons as &$liaison) { $liaison['ce_zone_geo'] = $this->convertirCodeZoneGeoVersCodeInsee($liaison['ce_zone_geo']); } } } $this->envoyerJson($liaisons); return true; } public function updateElement($uid, $pairs) { } /** * Supprimme une ou plusieurs liaisons entre images et observations * uid[0] : utilisateur obligatoire * uid[1] : identifiant(s) image(s) obligatoire(s) * uid[2] : identifiant(s) observations */ public function deleteElement($uid) { // Controle detournement utilisateur $this->controleUtilisateur($uid[0]); $id_utilisateur = $uid[0]; $ids_images = self::filterInt($uid[1]); $ids_observations = self::filterInt($uid[2]); if (empty($ids_images) || empty($ids_observations) || ! $id_utilisateur) { die('err'); } $ids_images_filtrees = $this->filtrerImgUtilisateur($ids_images, $id_utilisateur); $infos_observations_filtrees = $this->filtrerObsUtilisateur($ids_observations, $id_utilisateur); $ids_observations_filtrees = self::extraireValeurs($infos_observations_filtrees, 'id_observation'); if (empty($ids_images_filtrees) || empty($ids_observations_filtrees)) { die('err'); } $idsImgConcat = implode(',', $ids_images_filtrees); $idsObsConcat = implode(',', $ids_observations_filtrees); $requete = 'UPDATE cel_images '. 'SET ce_observation = NULL, date_liaison = NULL, date_transmission = NULL, transmission = 0 '. "WHERE id_image IN ($idsImgConcat) AND ce_observation IN ($idsObsConcat)". ' -- '.__FILE__.':'.__LINE__; $resultats = Cel::db()->executer($requete); ($resultats) ? exit('OK') : die('err'); } private function filtrerImgUtilisateur($ids_images, $id_utilisateur) { $idsImgConcat = implode(',', $ids_images); $requete = 'SELECT id_image '. 'FROM cel_images '. "WHERE id_image IN ($idsImgConcat) ". "AND ce_utilisateur = $id_utilisateur ". ' -- '.__FILE__.':'.__LINE__; $resultats = Cel::db()->requeter($requete); return self::extraireValeurs($resultats, 'id_image'); } private function filtrerObsUtilisateur($ids_observations, $id_utilisateur) { $idsObsConcat = implode(',', $ids_observations); $requete = 'SELECT id_observation, transmission, date_transmission '. 'FROM cel_obs '. "WHERE id_observation IN ($idsObsConcat) ". "AND ce_utilisateur = $id_utilisateur ". ' -- '.__FILE__.':'.__LINE__; $resultats = Cel::db()->requeter($requete); $valeurs = (is_array($resultats) && count($resultats) > 0) ? $resultats : array(); return $valeurs; } private static function filterInt($str_liste) { return array_filter(array_map('intval', explode(',', $str_liste))); } /** * Extrait les valeurs d'un champ donné. Utile pour renvoyer un tableau de simples valeurs * à partir des résultats d'une requête effectuée sur un seul champ. */ private static function extraireValeurs($resultats, $champNom) { $valeurs = array(); if (is_array($resultats) && count($resultats) > 0) { foreach ($resultats as $infos) { $valeurs[] = $infos[$champNom]; } } return $valeurs; } }