Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1564 → Rev 1565

/trunk/doc/bdd/schema_bdd_cel_v2.mwb
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/trunk/doc/bdd/cel_v2.sql
208,8 → 208,9
 
CREATE TABLE IF NOT EXISTS `cel_obs_etendues` (
`id_observation` BIGINT NOT NULL ,
`cle` VARCHAR(255) NOT NULL ,
`valeur` VARCHAR(255) NOT NULL ,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle' ,
`label` VARCHAR(255) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.' ,
`valeur` VARCHAR(255) NOT NULL COMMENT 'Valeur du champ.' ,
PRIMARY KEY (`id_observation`, `cle`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
291,8 → 292,9
 
CREATE TABLE IF NOT EXISTS `cel_images_etendues` (
`id_observation` BIGINT NOT NULL ,
`cle` VARCHAR(255) NOT NULL ,
`valeur` VARCHAR(255) NOT NULL ,
`cle` VARCHAR(255) NOT NULL COMMENT 'Clé du champ au format chat mot (sans accents).\nEx. : maCle, uneAutreCle' ,
`label` VARCHAR(45) NOT NULL COMMENT 'Intitulé du champ à afficher dans les formulaires.' ,
`valeur` VARCHAR(255) NOT NULL COMMENT 'Valeur du champ.' ,
PRIMARY KEY (`id_observation`, `cle`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
/trunk/jrest/lib/GestionChampsEtendus.php
1,7 → 1,8
<?php
 
/**
* PHP Version 5
* in=utf8
* out=utf8
*
* @category PHP
* @package jrest
14,34 → 15,30
 
/**
* Classe de gestion de l'ajout, modification et suppression des champs supplémentaires des obs et images
*
* in=utf8
* out=utf8
*
*/
*/
class GestionChampsEtendus extends Cel {
 
private $mode = null;
private $table_champs_etendus = null;
private $champ_id = null;
 
public function GestionChampsEtendus($config, $mode) {
parent::__construct($config);
$this->mode = $mode;
if($this->mode == 'obs') {
 
if ($this->mode == 'obs') {
$this->mode = 'obs';
$this->table_champs_etendus = 'cel_obs_etendues';
$this->champ_id = 'id_observation';
} else if($this->mode == 'image') {
} else if ($this->mode == 'image') {
$this->mode = 'image';
$this->table_champs_etendus = 'cel_images_etendues';
$this->champ_id = 'id_image';
} else {
throw new Exception('Mode inconnu, les modes autorisés sont "obs" et "image"');
}
}
}
 
/**
* Renvoie true ou false suivant que l'element indiqué possède une valeur
* pour la clé indiquée
51,166 → 48,155
* @param string $valeur
* @return bool
*/
public function champEtenduExistePourElement($id_element_lie, $cle) {
$requete = "SELECT COUNT(*) >= 1 as existe FROM ".$this->table_champs_etendus." ".
"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ".
"AND cle = ".$this->proteger($cle);
public function existe($id_element_lie, $cle) {
$id = $this->proteger($id_element_lie);
$cle = $this->proteger($cle);
$requete = 'SELECT COUNT(*) >= 1 AS existe '.
"FROM {$this->table_champs_etendus} ".
"WHERE {$this->champ_id} = $id ".
" AND cle = $cle ";
 
$resultat = $this->executerRequete($requete);
return ($resultat[0]['existe'] == "1");
return ($resultat[0]['existe'] == '1');
}
 
/**
* Renvoie tous les champs étendus associé à l'élément passé en paramètre
*
* @param int $id_element_lie
* @return array
* @return array tableau associatif des champs de la table etendu
*/
public function obtenirChampsEtendusPourElement($id_element_lie) {
$requete = "SELECT * FROM ".$this->table_champs_etendus." ".
"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie)." ";
public function consulter($id_element_lie) {
$id = $this->proteger($id_element_lie);
$requete = "SELECT * FROM {$this->table_champs_etendus} WHERE {$this->champ_id} = $id ";
$resultat = $this->executerRequete($requete);
return $resultat;
}
 
/**
* Renvoie tous les champs étendus associés aux éléments passés en paramètre
* Sous forme tableau de tableaux associatifs clé valeur regroupé par id d'élement
* Renvoie tous les champs étendus associés aux éléments passés en paramètre.
* Retour sous forme de tableau associatif de tableau d'objets ChampEtendu.
* Les objets ChampEtendu sont regroupés par id d'élement.
*
* @param array $ids_element_lies
* @return array
* @param array $ids_element_lies tableau d'id des éléments liés (obs ou image).
* @return array tableau associatif de tableau d'objets ChampEtendu.
*/
public function obtenirChampsEtendusPourElementsMultiples($ids_element_lies) {
public function consulterParLots(Array $ids_element_lies) {
$champs_etendus_par_element = array();
if(!empty($ids_element_lies)) {
if (!empty($ids_element_lies)) {
$ids_element_lies = array_map(array($this, 'proteger'),$ids_element_lies);
$requete = "SELECT * FROM ".$this->table_champs_etendus." ".
"WHERE ".$this->champ_id." IN (".implode(',',$ids_element_lies).") ";
$ids = implode(',', $ids_element_lies);
 
$requete = "SELECT * FROM {$this->table_champs_etendus} WHERE {$this->champ_id} IN ($ids) ";
$resultats = $this->executerRequete($requete);
$champs_etendus_par_element = array();
 
foreach ($resultats as &$ligne) {
$id_element = $ligne[$this->champ_id];
if(!isset($champs_etendus_par_element[$id_element])) {
if (!isset($champs_etendus_par_element[$id_element])) {
$champs_etendus_par_element[$id_element] = array();
}
$champs_etendus_par_element[$id_element][$ligne['cle']] = $ligne['valeur'];
$champ_etendu = new ChampEtendu();
$champ_etendu->id = $id_element;
$champ_etendu->cle = $ligne['cle'];
$champ_etendu->label = $ligne['label'];
$champ_etendu->valeur = $ligne['valeur'];
 
$champs_etendus_par_element[$id_element][] = $champ_etendu;
}
}
return $champs_etendus_par_element;
}
 
/**
* Ajoute un champ étendu à l'élément passé en paramètre,
* si la clé existe déjà, seule valeur du champ est mise à jour
* Ajoute un champ étendu.
* Si la clé existe déjà, seule valeur du champ est mise à jour
*
* @param int $id_element_lie
* @param string $cle
* @param string $valeur
* @return bool
* @param ChampEtendu $champ_etendu
* @return bool true si l'ajout a eu lieu
*/
public function ajouterChampEtendu($id_element_lie, $cle, $valeur) {
$requete = "INSERT INTO ".$this->table_champs_etendus." ".
"(".$this->champ_id.", cle, valeur) ".
"VALUES (".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).") ".
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
public function ajouter(ChampEtendu $champ_etendu) {
$id = $this->proteger($champ_etendu->id);
$cle = $this->proteger($champ_etendu->cle);
$label = $this->proteger($champ_etendu->label);
$valeur = $this->proteger($champ_etendu->valeur);
 
// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
// où l'on change de sgbd
$ajout = $this->executerRequeteSimple($requete);
return ($ajout !== false);
}
/**
* Ajoute des champs étendus à l'élément passé en paramètre,
* si la clé existe déjà, seule la valeur du champ est mise à jour
*
* @param int $id_element_lie
* @param array $cles_valeurs tableau de clés => valeurs à associer à l'élément
* @return bool
*/
public function ajouterChampsEtendusMultiples($id_element_lie, $cles_valeurs) {
$lignes = array();
foreach($cles_valeurs as $cle => $valeur) {
$lignes[] = "(".$this->proteger($id_element_lie).",".$this->proteger($cle).",".$this->proteger($valeur).")";
}
$requete = "INSERT INTO ".$this->table_champs_etendus." ".
"(".$this->champ_id.", cle, valeur) ".
"VALUES ".implode(',', $lignes)." ".
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
$requete = "INSERT INTO {$this->table_champs_etendus} ".
"( {$this->champ_id}, cle, label, valeur) ".
"VALUES ($id, $cle, $label, $valeur) ".
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
 
// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
// où l'on change de sgbd
$ajout = $this->executerRequeteSimple($requete);
return ($ajout !== false);
}
 
/**
* Ajoute des champs étendus aux éléments passés en paramètre,
* si la clé existe déjà, seule la valeur du champ est mise à jour
* Ajoute plusieurs champs étendus à la fois.
* Si la clé existe déjà, seule la valeur du champ est mise à jour
*
* @param array $elements_cles_valeurs tableau associatif de la forme id, cle, valeur
* @return bool
* @param array $champs_etendus tableau d'objets ChampEtendu
* @return bool true si l'ajout a eu lieu
*/
public function ajouterChampsEtendusMultiplesAElementsMultiples($elements_cles_valeurs) {
public function ajouterParLots(Array $champs_etendus) {
$lignes = array();
foreach($elements_cles_valeurs as &$element) {
$lignes[] = "(".$this->proteger($element['id']).",".$this->proteger($element['cle']).",".$this->proteger($element['valeur']).")";
foreach ($champs_etendus as $champ_etendu) {
$id = $this->proteger($champ_etendu->id);
$cle = $this->proteger($champ_etendu->cle);
$label = $this->proteger($champ_etendu->label);
$valeur = $this->proteger($champ_etendu->valeur);
 
$lignes[] = "($id, $cle, $label, $valeur)";
}
$requete = "INSERT INTO ".$this->table_champs_etendus." ".
"(".$this->champ_id.", cle, valeur) ".
"VALUES ".implode(',', $lignes)." ".
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
$values = implode(',', $lignes);
 
$requete = "INSERT INTO {$this->table_champs_etendus} ".
"({$this->champ_id}, cle, label, valeur) ".
"VALUES $values ".
"ON DUPLICATE KEY UPDATE valeur = VALUES(valeur)";
 
// la partie on duplicate key est spécifique mysql mais il sera facile de s'en passer le jour
// où l'on change de sgbd
$ajout = $this->executerRequeteSimple($requete);
return ($ajout !== false);
}
 
/**
* Modifie un champ étendu associé à l'élément passé en paramètre
*
* @param int $id_element_lie
* @param string $cle
* @param string $valeur
* @return bool
* @param ChampEtendu $champ_etendu
* @return bool true si la modification a eu lieu
*/
public function modifierChampEtendu($id_element_lie, $cle, $valeur) {
$requete = "UPDATE ".$this->table_champs_etendus." ".
"SET valeur = ".$this->proteger($valeur)." ".
"WHERE cle = ".$this->proteger($cle)." AND ".
$this->champ_id." = ".$this->proteger($id_element_lie);
public function modifier(ChampEtendu $champ_etendu) {
$id = $this->proteger($champ_etendu->id);
$cle = $this->proteger($champ_etendu->cle);
$label = $this->proteger($champ_etendu->label);
$valeur = $this->proteger($champ_etendu->valeur);
 
$requete = "UPDATE {$this->table_champs_etendus} ".
"SET label = $label, valeur = $valeur ".
"WHERE cle = $cle".
" AND {$this->champ_id} = $id ";
 
$modif = $this->executerRequeteSimple($requete);
return ($modif !== false);
}
 
/**
* Supprime le champ champ étendu associé à l'élément et au nom de clé passés en paramètre
* Supprime le champ champ étendu associé à l'élément et au nom de clé passés en paramètre
*
* @param int $id_element_lie
* @param string $cle
* @return bool
*/
public function supprimerChampEtendu($id_element_lie, $cle) {
$requete = "DELETE FROM ".$this->table_champs_etendus." ".
"WHERE cle = ".$this->proteger($cle)." AND ".
$this->champ_id." = ".$this->proteger($id_element_lie);
public function supprimer($id_element_lie, $cle) {
$id = $this->proteger($id_element_lie);
$cle = $this->proteger($cle);
$requete = "DELETE FROM {$this->table_champs_etendus} WHERE cle = $cle AND {$this->champ_id} = $id ";
$suppr = $this->executerRequeteSimple($requete);
return ($suppr !== false);
}
 
/**
* Supprime tous les champs champ étendu associés à l'élément passés en paramètre
*
217,12 → 203,46
* @param int $id_element_lie
* @return bool
*/
public function supprimerChampsEtendusAElement($id_element_lie) {
$requete = "DELETE FROM ".$this->table_champs_etendus." ".
"WHERE ".$this->champ_id." = ".$this->proteger($id_element_lie);
public function vider($id_element_lie) {
$id = $this->proteger($id_element_lie);
$requete = "DELETE FROM {$this->table_champs_etendus} WHERE {$this->champ_id} = $id ";
$suppr = $this->executerRequeteSimple($requete);
return ($suppr !== false);
}
 
/**
* Transforme un label en clé.
* Supprime tous les accents et caractères spéciaux.
* Accole les mots pour créer un chatmot.
*
* @param string le label.
* @return string la clé correspondante
*/
public function transformerLabelEnCle($label) {
$cle = strtolower(trim($label));
 
// Suppression des mots inutiles
$mots_a_remplacer = array(' le ', ' la ', ' les ', ' des ', ' de ', " l'", " d'", ' à ', ' au ');
$cle = str_replace($mots_a_remplacer, ' ', $cle);
 
// Remplacement parenthèses et crochets et leurs contenus
$cle = preg_replace('/\([^)]+\)/', '', $cle);
$cle = preg_replace('/\[[^\]]+\]/', '', $cle);
 
// Remplacement des accents (voir : http://www.weirdog.com/blog/php/supprimer-les-accents-des-caracteres-accentues.html )
$cle = htmlentities($cle, ENT_NOQUOTES, 'utf-8');
$cle = preg_replace('/&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);/', '\1', $cle);
$cle = preg_replace('/&([A-za-z]{2})(?:lig);/', '\1', $cle); // pour les ligatures e.g. '&oelig;'
$cle = preg_replace('/&[^;]+;/', '', $cle); // supprime les autres caractères
 
// Suppression définitive de tout ce qui n'est pas ASCII
$cle = preg_replace('/[^a-zA-Z0-9]/', '', $cle);
 
// Accollement des mots
$cle = ucwords($cle);
$cle = str_replace(' ', '', $cle);
 
return $cle;
}
}
?>
/trunk/jrest/lib/ChampEtendu.php
New file
0,0 → 1,24
<?php
/**
* PHP Version 5
*
* @category PHP
* @package jrest
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright 2010 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
 
/**
* Classe conteneur servant à gérer les infos des champs étendus.
*
*/
class ChampEtendu {
public $id = '';
public $cle = '';
public $label = '';
public $valeur = '';
}
?>
/trunk/jrest/services/CelWidgetSaisie.php
23,7 → 23,7
private $utilisateur_id = null;
const DUREE_DE_VIE_IMG = 86400;// 3600 * 24 * 2 = 172 800
const ARRET_SERVICE = false;// Permet de bloquer le service en cas de problème sur le serveur
 
private $correspondanceIdImgTags = array();
 
public function createElement($requeteDonnees) {
48,7 → 48,7
$utilisateur = $this->affecterChampsManquantsUtilisateur($utilisateur);
extract($utilisateur);
$this->utilisateur_id = $id_utilisateur;
$ordre = $this->getMaxOrdre($id_utilisateur);
$ordre = $this->getMaxOrdre($id_utilisateur);
if (!is_null($ordre)) {
$requeteDonnees = $this->supprimerSlashesProfond($requeteDonnees);
// Triage et manipulation des données
91,7 → 91,7
$obsAAjouter['date_creation'] = date('Y-m-d H:i:s');
$obsAAjouter['date_modification'] = $obsAAjouter['date_creation'];
$obsAAjouter['date_transmission'] = $obsAAjouter['date_creation'];
 
$this->champsEtendusObs[$ordreObs] = isset($obs['obs_etendue']) ? $obs['obs_etendue'] : array();
 
$imgAAjouter = null;
122,7 → 122,7
} else {
$obs_a_taguer_ordres[] = trim($obs['ordre'], "'");
}
 
// si le formulaire contient une image on la traite
if ($img != null) {
$this->nettoyerImagesUploades();
129,11 → 129,11
$img_a_taguer_ids = $this->stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur);
}
}
 
$obs_a_taguer_ids = $this->obtenirIdsObsPourTableauOrdres($this->utilisateur_id, $obs_a_taguer_ordres);
$this->taguerObs($obs_a_taguer_ids);
$this->taguerImg($img_a_taguer_ids);
 
// Les champs taggés sont des champs supplémentaires stockés sous forme de clé => valeur
$this->ajouterChampsEtendusObs($obs_a_taguer_ids, $this->champsEtendusObs);
} else {
152,32 → 152,42
$retour = (object) array('msg' => $msg);
$this->envoyerJson($retour);
}
 
private function ajouterChampsEtendusObs($obs_ids, $obs_a_champs_etendus) {
$champs_etendus_obs = array();
foreach($obs_ids as $id_obs) {
$gestionChampsEtendus = new GestionChampsEtendus($this->config, 'obs');
 
foreach ($obs_ids as $id_obs) {
$champs = array_shift($obs_a_champs_etendus);
if($champs != null && is_array($champs)) {
foreach($champs as $champ_etendu => $valeur) {
$champs_etendus_obs[] = array(
'id' => $id_obs,
'cle' => $champ_etendu,
'valeur' => $valeur
);
if ($champs != null && is_array($champs)) {
foreach ($champs as $infosChamp) {
$cle = isset($infosChamp['cle']) ? $infosChamp['cle'] : '';
$label = isset($infosChamp['label']) ? $infosChamp['label'] : '';
$valeur = isset($infosChamp['valeur']) ? $infosChamp['valeur'] : '';
 
if (empty($cle) && !empty($label)) {
$cle = $gestionChampsEtendus->transformerLabelEnCle($label);
}
 
if (!empty($cle) && !empty($valeur)) {
$champEtendu = new ChampEtendu();
$champEtendu->id = $id_obs;
$champEtendu->cle = $cle;
$champEtendu->label = empty($label) ? $cle : $label;
$champEtendu->valeur = $valeur;
 
$champs_etendus_obs[] = $champEtendu;
}
}
}
}
$gestion_champs_etendus = new GestionChampsEtendus($this->config, 'obs');
$ajout_champ_etendus = $gestion_champs_etendus->ajouterChampsEtendusMultiplesAElementsMultiples($champs_etendus_obs);
$ajout_champ_etendus = $gestionChampsEtendus->ajouterParLots($champs_etendus_obs);
return $ajout_champ_etendus;
}
 
private function traiterImagesALierAObs($id_utilisateur, $ordreObs, $obs) {
$imgAAjouter = null;
if(is_array($obs['image_nom'])) {
if (is_array($obs['image_nom'])) {
$imgAAjouter = array();
foreach ($obs['image_nom'] as $index => $nom_image) {
$image = array();
185,10 → 195,10
$image['id_obs'] = $ordreObs;
$image['nom'] = $nom_image;
$image['tags'] = isset($obs['image_tag'][$index]) ? explode(',',$obs['image_tag'][$index]) : '';
// on suppose que les b64 des images sont envoyés dans le même ordre que leurs noms
// on suppose que les b64 des images sont envoyés dans le même ordre que leurs noms
// TODO: indexer le tableau avec le nom des images
$image['b64'] = isset($obs['image_b64'][$index]) ? $obs['image_b64'][$index] : '';
$this->debug[] = 'Contient B64 : '.(empty($obs['image_b64']) ? 'non' : 'oui');
$this->debug[] = 'Contient B64 : '.(empty($obs['image_b64']) ? 'non' : 'oui');
$imgAAjouter[] = $image;
}
} else {
202,13 → 212,14
$this->debug[] = 'Contient B64 : '.(empty($obs['image_b64']) ? 'non' : 'oui');
}
}
 
return $imgAAjouter;
}
 
private function stockerImagesEtLierAObs($img, $id_utilisateur, $utilisateur) {
if(!isset($img['nom']) && is_array($img)) {
foreach($img as $index => $image) {
$img_a_taguer_ids = array();
if (!isset($img['nom']) && is_array($img)) {
foreach ($img as $index => $image) {
$nomFichierImg = $this->traiterNomFichierImage($image['nom']);
$cheminImage = $this->config['cel']['chemin_stockage_temp']."/$nomFichierImg";
// Si l'image est transmise en base 64
215,7 → 226,7
if (empty($image['b64']) === false) {
$this->transformerBase64enFichier($cheminImage, $image['b64']);
}
 
$this->debug[] = 'Nom fichier img debut :'.$nomFichierImg;
$idImg = $this->ajouterImageSurDdEtBdd($utilisateur, $cheminImage, $nomFichierImg);
if ($idImg !== false) {
222,7 → 233,7
$liaisonOk = $this->lierObsEtImg($idImg, $id_utilisateur, $image['id_obs']);
if ($liaisonOk === true) {
$img_a_taguer_ids[] = $idImg;
if(isset($image['tags'])) {
if (isset($image['tags'])) {
$this->correspondanceIdImgTags[$idImg] = $image['tags'];
}
}
235,7 → 246,7
if (empty($img['b64']) === false) {
$this->transformerBase64enFichier($cheminImage, $img['b64']);
}
 
$this->debug[] = 'Nom fichier img debut :'.$nomFichierImg;
$idImg = $this->ajouterImageSurDdEtBdd($utilisateur, $cheminImage, $nomFichierImg);
if ($idImg !== false) {
242,16 → 253,16
$liaisonOk = $this->lierObsEtImg($idImg, $id_utilisateur, $img['id_obs']);
if ($liaisonOk === true) {
$img_a_taguer_ids[] = $idImg;
if(isset($img['tags'])) {
if (isset($img['tags'])) {
$this->correspondanceIdImgTags[$idImg] = $img['tags'];
}
}
}
}
 
return $img_a_taguer_ids;
}
 
private function affecterChampsManquantsUtilisateur($utilisateur) {
$gestion_utilisateur = new User($this->config);
$infos_complementaires = $gestion_utilisateur->obtenirUtilisateurSiExiste($utilisateur['courriel']);
413,12 → 424,12
}
return $liaison;
}
 
private function obtenirIdObsPourIdentifiantEtOrdre($id_utilisateur, $ordre) {
 
$id_utilisateur = $this->proteger($id_utilisateur);
$ordre = $this->proteger($ordre);
 
$requete = 'SELECT id_observation '.
'FROM cel_obs '.
"WHERE ce_utilisateur = $id_utilisateur ".
425,20 → 436,20
" AND ordre = $ordre ";
 
$resultat = $this->executerRequete($requete);
 
$id_obs = (count($resultat) > 0) ? $resultat[0]['id_observation'] : false;
return $id_obs;
}
 
private function obtenirIdsObsPourTableauOrdres($id_utilisateur, $ordres) {
$id_utilisateur = $this->proteger($id_utilisateur);
$ordres = array_map(array($this,'proteger'), $ordres);
 
$requete = 'SELECT id_observation '.
'FROM cel_obs '.
"WHERE ce_utilisateur = $id_utilisateur ".
" AND ordre IN (".implode(',',$ordres).") ";
 
$resultat = $this->executerRequete($requete);
$ids = array();
foreach($resultat as $id) {