Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1496 → Rev 1497

/trunk/jrest/jrest.ini.php.defaut
New file
0,0 → 1,68
;<?/*
[settings]
baseURL = "/jrest/"
 
; Default
[database]
phptype = mysqli
username = root
password =
hostspec = localhost
database = tb_eflore_v1_1_principale
 
; Identification
[database_ident]
phptype = mysqli
username = root
password =
hostspec = localhost
database = tb_v4
 
; CEL
[database_cel]
phptype = mysqli
username = root
password =
hostspec = localhost
database = tb_cel
 
; Images
[cel_db]
phptype = mysqli
username = root
password =
hostspec = localhost
database = tb_cel
chemin_images = /opt/lampp/htdocs/Documents/images_serveur
url_images = http://162.38.234.9/Documents/images_serveur
taille_max = 2097152
 
; COEL
[coel]
phptype = mysql
username = root
password =
hostspec = localhost
database = tb_coel
guid = "urn:lsid:tela-botanica.org:%s:%s"
editeur = "Tela Botanica"
urlBaseCoel = "http://localhost/org.tela_botanica.Coel/Coel.html"
urlBaseJrest = "http://localhost/jrest/"
aideBaseUrlTpl = "http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki="
urlEfloreMaj = "http://localhost/eflore_bp/services/collection/"
urlAnnuaire = "http://www.tela-botanica.org/client/eflore_chatin/services/annuaire_tela"
loginAnnuaire =
mdpAnnuaire =
correctionLogin =
correctionMdp =
 
; LOGS
[log]
cheminlog = "/Logs/"
timezone = "Europe/Paris"
taillemax = 100000
 
;ADMIN
[jrest_admin]
admin = aurelien@tela-botanica.org,david.delon@clapas.net,jpm@tela-botanica.org,marie@tela-botanica.org
;*/?>
/trunk/jrest/services/CoelValeurListe.php
New file
0,0 → 1,154
<?php
/**
* Service fournissant une liste de valeurs.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CoelValeurListe/id/1001 : retourne les valeurs de la liste d'identifiant 1001
* /CoelValeurListe/ab/12 : retourne les valeurs de la liste dont l'abréviation vaut "12"
* /CoelValeurListe/abv/FR.__ : retourne les valeurs dont l'abréviation équivaut (= LIKE) "FR.__"
* * /CoelValeurListe/abv/FR.__/1078 : retourne les valeurs dont l'abréviation équivaut (= LIKE) "FR.__" pour la liste d'identifiant 1078.
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
Class CoelValeurListe extends Coel {
 
/**
* Méthode appelée avec une requête de type GET.
*/
function getElement($param = array()) {
// Initialisation des variables
$info = array();// Tableau associatif des paramêtres
$requete = null;
$requete_compte = null;
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('type', 'ceParent', 'abreviation', 'idValeur', "nom"), $param);
// Construction de la requête
if (!isset($p['idValeur'])) {
$p['idValeur'] = "'%'";
}
if (!isset($p['abreviation'])) {
$p['abreviation'] = "'%'";
}
$p['type'] = trim($p['type'], "'");
switch ($p['type']) {
case 'identifiant' :
// Nous avons un identifiant de liste, nous récupérons seulement les valeurs de cette liste
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_meta_liste_valeur '.
"WHERE cmlv_id_valeur = {$p['idValeur']} ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cmlv_id_valeur ASC').' ';
$requete_compte = $requete;
break;
case 'id' :
// Nous avons un identifiant de liste, nous récupérons seulement les valeurs de cette liste
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_meta_liste_valeur '.
"WHERE cmlv_ce_parent = {$p['ceParent']} ".
"AND cmlv_id_valeur LIKE {$p['idValeur']}".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cmlv_id_valeur ASC').' ';
$requete_compte = $requete;
$requete .= "LIMIT $this->start,$this->limit ";
break;
case 'idv' :
// Nous avons un ou plusieurs identifiants de valeurs, nous les récupérons
$p = $this->traiterParametresUrl(array('type', 'idValeur'), $param);
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_meta_liste_valeur '.
'WHERE cmlv_id_valeur IN ('.$this->traiterBddClauseIn($p['idValeur']).') '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cmlv_id_valeur ASC').' '.
"LIMIT $this->start,$this->limit ";
break;
case 'ab' :
// Nous avons une abréviation de liste, nous récupérons seulement les valeurs de cette liste
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' v.* '.
'FROM coel_meta_liste_valeur AS l LEFT JOIN coel_meta_liste_valeur AS v ON (l.cmlv_id_valeur = v.cmlv_ce_parent) '.
'WHERE l.cmlv_ce_parent = 0 '.
"AND l.cmlv_abreviation LIKE {$p['abreviation']} ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'v.cmlv_id_valeur ASC').' ';
$requete_compte = $requete;
$requete .= "LIMIT $this->start,$this->limit ";
break;
case 'abv' :
// Nous avons une abréviation de valeur, nous récupérons toutes les valeurs correspondantes
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_meta_liste_valeur '.
"WHERE cmlv_abreviation LIKE {$p['abreviation']} ".
(isset($p['ceParent']) ? " AND cmlv_ce_parent = {$p['ceParent']} " : '').
"AND cmlv_id_valeur LIKE {$p['idValeur']}".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cmlv_id_valeur ASC').' ';
$requete_compte = $requete;
$requete .= "LIMIT $this->start,$this->limit ";
break;
case 'nom' :
// Nous avons une abréviation de valeur, nous récupérons toutes les valeurs correspondantes
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_meta_liste_valeur '.
'WHERE ';
if ($p['nom'] != "") $requete .= "cmlv_nom LIKE {$p['nom']} AND ";
if (isset($p['ceParent'])) $requete .= " cmlv_ce_parent = {$p['ceParent']} AND ";
$requete .= " cmlv_id_valeur LIKE {$p['idValeur']} ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cmlv_id_valeur ASC').' ';
$requete_compte = $requete;
$requete .= "LIMIT $this->start,$this->limit ";
break;
default :
$this->messages[] = sprintf("Valeur '%s' pour le paramêtre 'type' inconnue (valeurs disponibles : id, ab, abv)!", $p['type']);
}
 
if (!is_null($requete)) {
// Exécution de la requêtre SQL et test d'éventuelles erreurs
try {
$resultat = $this->bdd->query($requete)->fetchAll();
if ($resultat === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
// Traitement des données
if ($p['type'] == 'id') {
$info['id'] = trim($p['ceParent'], "'");
} else if ($p['type'] == 'identifiant') {
$info['id'] = trim($p['idValeur'], "'");
} else {
$info['id'] = $resultat[0]['cmlv_ce_parent'];
}
$info['valeurs'] = $resultat;
// gestion des abreviations
if ($p['abreviation'] != "'%'") {
$info['abreviation'] = $p['abreviation'];
}
// si on a le nombre maximum de resultats on doit charger la page suivante
if (count($resultat) == $this->limit) {
$info['getNextPage'] = true;
} else {
$info['getNextPage'] = false;
}
//Sélection du nombre total
if (!is_null($requete_compte)) {
$nbElements = $this->bdd->query($requete_compte)->rowCount();
$info['nbElements'] = $nbElements;
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
 
// Envoie sur la sortie standard
$this->envoyer($info);
}
}
?>
/trunk/jrest/services/CoelStructure.php
New file
0,0 → 1,313
<?php
/**
* Service fournissant la liste des structures et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelStructure extends Coel {
// ATTENTION : tjrs garder la table principale en premier, puis mettre les tables spécialisées.
protected $tables = array( 120 => array(
'nom' => 'coel_structure',
'prefixe' => 'cs',
'id' => array('cs_id_structure')),
122 => array(
'nom' => 'coel_structure_conservation',
'prefixe' => 'csc',
'id' => array('csc_id_structure')),
123 => array(
'nom' => 'coel_structure_valorisation',
'prefixe' => 'csv',
'id' => array('csv_id_structure')));
 
/**
* Méthode principale appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Nour recherchons le type de requête demandé
$type = $param[0];
if ($type == '*' || is_numeric($type)) {
$info = $this->getElementParDefaut($param);
} else {
$methode = 'getElement'.$type;
if (method_exists($this, $methode)) {
array_shift($param);
$info = $this->$methode($param);
} else {
$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
}
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode par défaut pour garder la compatibilité avec Coel.
* Appelée avec les paramêtres d'url suivant :
* /CoelStructure/_/_/_
* ou les _ représentent dans l'ordre : id_projet, id_structure et nom
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParDefaut($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_projet', 'id_structure', 'nom'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cs.*, csc.*, csv.*, '.
' cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip '.
'FROM coel_structure AS cs '.
' LEFT JOIN coel_meta_historique_ligne ON (cs_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_structure_conservation AS csc ON (cs_id_structure = csc_id_structure) '.
' LEFT JOIN coel_structure_valorisation AS csv ON (cs_id_structure = csv_id_structure) '.
((count($p) != 0) ? 'WHERE ' : '').
((isset($p['id_projet'])) ? "AND cs_ce_projet = {$p['id_projet']} " : '').
((isset($p['id_structure'])) ? "AND cs_id_structure = {$p['id_structure']} " : '').
((isset($p['nom'])) ? "AND cs_nom LIKE {$p['nom']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs.cs_nom ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requete_compte = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = (isset($p['id_structure'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$elements_nbre = $this->bdd->query($requete_compte)->rowCount();
$info['nbElements'] = $elements_nbre;
$info['structures'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
return $info;
}
/* Méthode pour récupérer le nombre de structure par zone géographique.
* Appelée avec les paramêtres d'url suivant :
* /CoelStructure/ParZoneGeo/_
* ou les _ représentent dans l'ordre : type.
* ou type peut valoir: FRD (= département français)
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParZoneGeo($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('type'), $param);
if (!isset($p['type'])) {
$this->messages[] = "Il est obligatoire d'indiquer type de recherche pour utiliser ce service.";
} else {
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
' SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
' SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) AS id, '.
' COUNT( cs_id_structure ) AS nbre '.
'FROM coel_structure '.
'WHERE cs_ce_truk_pays = 2654 '.
'GROUP BY IF ( SUBSTRING( cs_code_postal FROM 1 FOR 2 ) >= 96, '.
' SUBSTRING( cs_code_postal FROM 1 FOR 3 ), '.
' SUBSTRING( cs_code_postal FROM 1 FOR 2 ) ) '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'id ASC').' ';
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
foreach ($donnees as $donnee) {
$info[$donnee['id']] = $donnee['nbre'];
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
return $info;
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
$id_structure = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_structure = $this->ajouter($table);
if ($id_structure !== false) {
$table['champs_valeurs_id']['cs_id_structure'] = $id_structure;
$table['champs_valeurs_brut']['cs_id_structure'] = $id_structure;
$tables_a_modifier[122]['champs_valeurs_id']['csc_id_structure'] = $id_structure;
$tables_a_modifier[122]['champs_valeurs_brut']['csc_id_structure'] = $id_structure;
$tables_a_modifier[122]['champs_valeurs_protege']['csc_id_structure'] = $this->bdd->quote($id_structure);
$tables_a_modifier[123]['champs_valeurs_id']['csv_id_structure'] = $id_structure;
$tables_a_modifier[123]['champs_valeurs_brut']['csv_id_structure'] = $id_structure;
$tables_a_modifier[123]['champs_valeurs_protege']['csv_id_structure'] = $this->bdd->quote($id_structure);
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
$this->ajouterGuid($params['cpr_abreviation'], $id_structure);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
$this->envoyer($id_structure);
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0])) {
$this->messages[] = "Identifiant de structure manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// NOTES : une structure ne peut pas être supprimée si elle possède des collections liées.
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de structure ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
foreach ($identifiants as $id_structure) {
// Vérification que la structure ne possède pas de collections liées
if ($this->verifierPresenceCollection($id_structure) === false) {
$params = array('cs_id_structure' => $id_structure, 'csc_id_structure' => $id_structure, 'csv_id_structure' => $id_structure);
$tables_a_modifier = $this->recupererTablesAModifier($params);
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
} else {
$this->messages[] = "La structure '$id_structure' ne peut pas être supprimée car elle possède des collections liées.";
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
private function verifierPresenceCollection($id_structure) {
$requete = 'SELECT COUNT(cc_id_collection) AS nbre_collection '.
'FROM coel_collection '.
"WHERE cc_ce_structure = '$id_structure' ".
'GROUP BY cc_ce_structure ';
// Vérification que la structure ne possède pas de collections liées
$nbre_collection = $this->bdd->query($requete)->fetchColumn();
$presence = false;
if ($nbre_collection != 0) {
$presence = true;
}
return $presence;
}
private function ajouterGuid($abr_projet, $id_structure) {
if ($id_structure !== false) {
$table_guid = $this->tables[120];
$table_guid['champs_valeurs_id']['cs_id_structure'] = $id_structure;
$table_guid['champs_valeurs_protege']['cs_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], $abr_projet, 'str'.$id_structure));
$this->modifier($table_guid);
}
}
}
?>
/trunk/jrest/services/CoelAide.php
New file
0,0 → 1,135
<?php
/**
* Service fournissant le contenu d'une page d'aide de l'application COEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CoelAide/MaPageWikini : retourne le contenu HTML de la page nommée MaPagaWikini dans le wikini d'aide
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelAide {
private $rawAideBaseUrlTpl = null;
private $pageAideBaseUrlTpl = null;
private $pageAideBaseUrl = null;
private $serviceBaseUrl = null;
private $sommaire = array();
public function __construct($config) {
$this->rawAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s/raw_html';
$this->pageAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s';
$this->pageAideBaseUrl = $config['coel']['aideBaseUrlTpl'];
$this->serviceBaseUrl = $config['coel']['urlBaseJrest'].'CoelAide/';
header('Content-Type: text/html; charset=utf-8');
}
 
/**
* Méthode appelée quand on récupère au moins un élément
*/
public function getElement($param) {
$sortie = "Contenu de la page introuvable";
if (isset($param[0])) {
$aide_url = sprintf($this->rawAideBaseUrlTpl, $param[0]);
$html = file_get_contents($aide_url);
// Encodage en UTF-8
$html = mb_convert_encoding($html, 'UTF-8', 'ISO-8859-1');
// Remplacement des URLs
$sortie = $this->remplacerUrl($html);
}
if (isset($param[1])) {
if ('sommaire' == $param[1]) {
$this->construireSommaireDepuisHtml($html);
$sortie = json_encode($this->sommaire);
}
}
// Envoie sur la sortie standard
print($sortie);
}
private function construireSommaireDepuisHtml($html) {
$parser = new WdHTMLParser();
$tree = $parser->parse($html);
foreach ($tree as $node) {
$info = array();
if (!is_array($node)) {
$this->sommaire['txt'] = $node;
} else {
if (isset($node['name'])) {
if ($this->estListeHtml($node['name'])) {
$this->sommaire[]['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
} else {
$info = $this->extraireCodeEtTxt($node);
if (count($info) != 0) {
$this->sommaire[] = $info;
}
}
}
}
}
//echo '<pre>' . print_r($this->sommaire, true) . '</pre>';
//echo '<pre>' . print_r($tree, true) . '</pre>';
}
private function extraireSommaireDepuisListeHtml($liste) {
$sommaire = array();
foreach ($liste as $node) {
if (!is_array($node)) {
$sommaire['txt'] = $node;
} else {
if ($this->estListeHtml($node['name'])) {
$sommaire['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
} else if ($node['name'] == 'li') {
$sommaire[] = $this->extraireSommaireDepuisListeHtml($node['children']);
} else {
$sommaire = array_merge($this->extraireCodeEtTxt($node), $sommaire);
}
}
}
return $sommaire;
}
private function estListeHtml($valeur_a_tester) {
$est_liste = false;
if ($valeur_a_tester == 'ul' || $valeur_a_tester == 'ol') {
$est_liste = true;
}
return $est_liste;
}
private function extraireCodeEtTxt($node) {
$info = array();
if ($node['name'] == 'a') {
if (preg_match('/wiki=([a-zA-Z0-9]+)(?:\/|\?|$)/', $node['args']['href'], $match)) {
$info['code'] = $match[1];
if ($node['children'][0] != '?') {
$info['txt'] = $node['children'][0];
}
}
} else if ($node['name'] == 'span' && $node['args']['class'] == 'missingpage') {
$info['txt'] = $node['children'][0];
} else if (preg_match('/^h[1-6]$/i', $node['name'])) {
$info['txt'] = $node['children'][0];
}
return $info;
}
private function remplacerUrl($txt) {
// Remplacement des caractères posant problèmes dans les expressions régulières
$caracteres = array('.' => '\.', '/' => '\/', '?' => '\?');
$regexp_pageAideBaseUrl = strtr($this->pageAideBaseUrl, $caracteres);
// Remplace des urls par celle du service
$txt = preg_replace('/'.$regexp_pageAideBaseUrl.'([^"])/', "{$this->serviceBaseUrl}$1", $txt);
return $txt;
}
}
?>
/trunk/jrest/services/CoelCommentaire.php
New file
0,0 → 1,196
<?php
/**
* Service fournissant la liste des commentaires et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelCommentaire extends Coel {
 
protected $tables = array(107 => array( 'nom' => 'coel_commentaire',
'prefixe' => 'ccm',
'id' => array('ccm_id_commentaire')));
 
/** Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
 
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_projet', 'id_commentaire', 'titre'), $param);
 
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' ccm.*, '.
' ccac.*, '.
' cc_id_collection, cc_nom '.
'FROM coel_commentaire AS ccm'.
' LEFT JOIN coel_meta_historique_ligne ON (ccm_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_collection_a_commentaire AS ccac ON (ccm_id_commentaire = ccac_id_commentaire) '.
' LEFT JOIN coel_collection ON (ccac_id_collection = cc_id_collection) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_projet']) ? "AND ccm_ce_projet = {$p['id_projet']} " : '').
(isset($p['id_commentaire']) ? "AND ccm_id_commentaire = {$p['id_commentaire']} " : '').
(isset($p['titre']) ? "AND ccm_titre LIKE {$p['titre']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'ccm_id_commentaire ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = (isset($p['id_commentaire'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
 
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['commentaires'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
// Envoie sur la sortie standard
$this->envoyer($info);
}
 
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
 
$id_commentaire = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_commentaire = $this->ajouter($table);
if ($id_commentaire !== false) {
$table['champs_valeurs_id']['ccm_id_commentaire'] = $id_commentaire;
$table['champs_valeurs_brut']['ccm_id_commentaire'] = $id_commentaire;
 
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$id_commentaire = $cle;
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
 
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
 
$this->envoyer((string) $id_commentaire);
}
 
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
$id_commentaire = "0";
if (!isset($uid[0])) {
$this->messages[] = "Identifiant de commentaire manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
$id_commentaire = $params['ccm_id_commentaire'] ;
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
 
/**
* Méthode appelée pour supprimer un ou plusieurs éléments
*/
public function deleteElement($uid) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de commentaire ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
 
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
foreach ($identifiants as $id_commentaire) {
$params = array('ccm_id_commentaire' => $id_commentaire);
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, Coel::ETAT_SUPPRIMER, $id_session);
}
}
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelProjet.php
New file
0,0 → 1,237
<?php
/**
* Service fournissant la liste des projets et leurs informations
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Grégoire DUCHÉ <gregoire@tela-botanica.org>
* @author Jean-Pascal MILECNT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
 
class CoelProjet extends Coel {
 
protected $tables = array(115 => array( 'nom' => 'coel_projet',
'prefixe' => 'cpr',
'id' => array('cpr_id_projet')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation de variables
$info = array();
 
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_projet', 'cpr_nom'), $param);
 
// Nous avons un identifiant de projet, nous récupérons seulement les informations du projet donné
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_projet '.
((count($p) != 0) ? 'WHERE ' : '').
((isset($p['cpr_nom'])) ? "AND cpr_nom LIKE {$p['cpr_nom']} " : '').
((isset($p['id_projet'])) ? "AND cpr_id_projet = {$p['id_projet']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cpr_id_projet ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche un seul projet avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = (($this->formatRetour == "objet") && isset($p['id_projet'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['projets'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
// Envoie sur la sortie standard
$this->envoyer($info);
 
}
 
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
 
$id_projet = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_projet = $this->ajouter($table);
if ($id_projet !== false) {
$table['champs_valeurs_id']['cpr_id_projet'] = $id_projet;
$table['champs_valeurs_brut']['cpr_id_projet'] = $id_projet;
 
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$id_projet = $cle;
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
 
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
 
$this->envoyer((string)$id_projet);
}
 
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
$id_projet = "0";
if (!isset($uid[0])) {
$this->messages[] = "Identifiant de projet manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
$id_projet = $params['cpu_id_projet'] ;
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
 
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// NOTES : un projet ne peut pas être supprimé si il possède des éléments liés.
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de projet ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
 
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
$idsProjetsNonSupprimes = "";
foreach ($identifiants as $id_projet) {
$params = array('cpr_id_projet' => $id_projet);
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
//Vérifions que le projet n'a aucune liaison
$existeLiaisons = false;
$i = 5;
while (!$existeLiaisons && $i > 0) {
switch ($i) {
case 5 :
$requete = "SELECT * FROM coel_collection WHERE cc_ce_projet = '{$id_projet}' ";
break;
case 4 :
$requete = "SELECT * FROM coel_structure WHERE cs_ce_projet = '{$id_projet}' ";
break;
case 3 :
$requete = "SELECT * FROM coel_commentaire WHERE ccm_ce_projet = '{$id_projet}' ";
break;
case 2 :
$requete = "SELECT * FROM coel_publication WHERE cpu_ce_projet = '{$id_projet}' ";
break;
case 1 :
$requete = "SELECT * FROM coel_personne WHERE cp_ce_projet = '{$id_projet}' ";
break;
}
$resultat = $this->bdd->query($requete)->rowCount();
//$this->debug[] = $requete." => ".$resultat;
if ($resultat > 0) {
$existeLiaisons = true;
}
$i--;
}
if (!$existeLiaisons) {
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
} else {
$idsProjetsNonSupprimes .= $id_projet.",";
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
$info = null;
if ($idsProjetsNonSupprimes != "") {
$info = array();
$info[0] = $idsProjetsNonSupprimes;
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
}
?>
/trunk/jrest/services/CoelCollectionAPersonne.php
New file
0,0 → 1,185
<?php
/**
* Service fournissant la liste des relations "structure à personne".
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelCollectionAPersonne extends Coel {
 
/** Contient les infos sur les tables gérées par ce service.
* Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
protected $tables = array( 103 => array( 'nom' => 'coel_collection_a_personne',
'prefixe' => 'ccap',
'id' => array('ccap_id_collection', 'ccap_id_personne', 'ccap_id_role')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_collection', 'id_role'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
' ccap.*, cp_ce_projet, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_naissance_date, cp_naissance_lieu, cp_ce_deces, cp_deces_date, cp_deces_lieu '.
'FROM coel_collection_a_personne AS ccap '.
' LEFT JOIN coel_meta_historique_ligne ON (ccap_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_collection']) ? "AND ccap_id_collection = {$p['id_collection']} " : '').
(isset($p['id_role']) ? "AND ccap_id_role = {$p['id_role']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'ccap_ce_meta DESC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['collectionsAPersonne'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
$this->messages[] = 'Il est nécessaire de fournir toutes les clés à ce service.';
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) && !isset($uid[1]) && !isset($uid[2])) {
$this->messages[] = 'Aucun identifiant de collection, personne et role a été passé. Vous ne devriez pas avoir accès à ce service.';
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un ou plusieurs éléments
*/
public function deleteElement($uid) {
// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
 
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des identifiant à supprimer
$identifiants = array();
$identifiants_agreges = explode(',', rtrim($uid[1], ','));
foreach ($identifiants_agreges as $identifiant) {
$identifiants[] = explode('-', $identifiant);
}
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
try {
foreach ($identifiants as $id) {
if (count($id) == 1) { // Seulement des id de collection
$params = array('ccap_id_collection' => $id[0]);
} else if (count($id) == 3) { // Tous les id...
$params = array('ccap_id_collection' => $id[0], 'ccap_id_personne' => $id[1], 'ccap_id_role' => $id[2]);
}
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[103];
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(103, $cle, 'NULL', $id_utilisateur, Coel::ETAT_SUPPRIMER, $id_session);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelCorrection.php
New file
0,0 → 1,115
<?php
/**
* Service fournissant la liste des commentaires et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Cyprien CLERC <cyprien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
 
class CoelCorrection extends Coel {
public function getElement($params = array()) {
// Identification de l'utilisateur
$login = $this->config['coel']['correctionLogin'];
$mdp = $this->config['coel']['correctionMdp'];
// Récupération des paramètres d'identification
$loginParam = $params[0];
$mdpParam = $params[1];
// Contrôle du non détournement de l'utilisateur
if ($login == $loginParam && $mdp == $mdpParam) {
$numeroCorrection = $params[2];
switch($numeroCorrection) {
case 1 : $this->correction0001($numeroCorrection);
break;
default : $this->noCorrection();
}
} else {
$this->messages[] = "[ERREUR] Il faut etre identifie pour acceder a ce service";
}
}
public function noCorrection() {
$this->messages[] = "[ERREUR] Aucun numero de correction n'a ete fourni ou le numero fourni est invalide.";
}
/*-------------------------------------------------------------------*/
//-----------//
// Correctif //
//-----------//
/* Le champ 'pays' de la table 'personne' contient le nom de la liste au lieu de son id, il faut remédier à ça ! */
private function correction0001($numeroCorrection) {
$this->messages[] = "APPLICATION DE LA CORRECTION numero ".$numeroCorrection;
// recuperation des pays
$requete = '
SELECT cmlv_id_valeur, cmlv_nom FROM coel_meta_liste_valeur
WHERE cmlv_ce_parent=1074
';
$pays = $this->bdd->query($requete)->fetchAll();
$requete = '
SELECT cp_id_personne, cp_truk_recolte
FROM coel_personne
';
$resultat = $this->bdd->query($requete)->fetchAll();
for($i=0; $i<count($resultat); $i++) {
if ($resultat[$i]['cp_truk_recolte'] != "") {
$tabValeurs = explode(";", $resultat[$i]['cp_truk_recolte']);
$nouvelleValeurChamp = "";
for($j=0; $j<count($tabValeurs); $j++) {
 
$tabType = explode("##", $tabValeurs[$j]);
$type = trim($tabType[0]);
if ($type != "" && !is_numeric($type)) {
// recherche de l'id_valeur
$trouve = false;
$k=0;
while(!$trouve && $k<count($pays)) {
if ($pays[$k]['cmlv_nom'] == $tabType[0]) {
$trouve = true;
}
else $k++;
}
$id_valeur = $pays[$k]['cmlv_id_valeur'];
if ($trouve) $nouvelleValeurChamp .= str_replace($type, $id_valeur, $tabValeurs[$j]).";";
}
}
$requeteUpdate = "
UPDATE coel_personne
SET cp_truk_recolte = '".$nouvelleValeurChamp."'
WHERE cp_id_personne = '".$resultat[$i]['cp_id_personne']."'
";
if ($nouvelleValeurChamp != "") {
echo $requeteUpdate.";<br>";
$resultatRequeteUpdate = $this->bdd->query($requeteUpdate);
if($resultatRequeteUpdate) $this->messages[] = "Correction effectuee.<br>";
else $this->messages[] = "Echec lors de la correction.";
}
 
}
 
}
return true;
}
}
/trunk/jrest/services/CoelPublication.php
New file
0,0 → 1,194
<?php
/**
* Service fournissant la liste des structures et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien Peronnet <aurelien@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelPublication extends Coel {
 
protected $tables = array(118 => array('nom' => 'coel_publication',
'prefixe' => 'cpu',
'id' => array('cpu_id_publication')));
 
/** Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_publication', 'id_projet', 'fmt_nom_complet'), $param);
 
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cp.*, cmhl.*, cs_nom '.
'FROM coel_publication AS cp '.
' LEFT JOIN coel_meta_historique_ligne AS cmhl ON (cpu_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_structure ON (cpu_ce_truk_editeur = cs_id_structure) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_projet']) ? "AND cpu_ce_projet = {$p['id_projet']} " : '').
(isset($p['id_publication']) ? "AND cpu_id_publication = {$p['id_publication']} " : '').
(isset($p['fmt_nom_complet']) ? "AND cpu_fmt_nom_complet LIKE {$p['fmt_nom_complet']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cpu_id_publication ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche une seule publication avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = (isset($p['id_publication'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
 
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['publications'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
// Envoie sur la sortie standard
$this->envoyer($info);
}
 
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
 
$id_publication = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_publication = $this->ajouter($table);
if ($id_publication !== false) {
$table['champs_valeurs_id']['cpu_id_publication'] = $id_publication;
$table['champs_valeurs_brut']['cpu_id_publication'] = $id_publication;
 
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$id_publication = $cle;
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
 
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
 
$this->envoyer((string) $id_publication);
}
 
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
$id_publication = "0";
if (!isset($uid[0])) {
$this->messages[] = "Identifiant de publication manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
$id_publication = $params['cpu_id_publication'] ;
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
 
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de publication ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
 
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
foreach ($identifiants as $id_publication) {
$params = array('cpu_id_publication' => $id_publication);
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelUtilisateur.php
New file
0,0 → 1,420
<?php
/**
* Service d'itentification d'un utilisateur.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
* Cas d'utilisation :
* 1: Aucun login ni mot de passe transmis
* 1: L'application retourne l'identifiant de session en cours
* 2: Une identification est toujours active, cette identification est retournée
*
* 2: Ce service recoit un login et un mot de passe
* 1 : On tente d'identifier l'utilisateur
* 2 : Si réussi, l'état passe à : connecté
* 3 : sinon, l'état passe à : pas connecté
*
* 3: Ce service reçoit un identifiant (différent du login) et aucun mot de passe :
* 1 : Déconnexion
*
* En résumé, utilisation des URLs :
* /CoelUtilisateur/ : retour identifiant de session si jamais connecté, sinon retour de l'id (+ login et mot de passe)
* /CoelUtilisateur/ * / * / : idem ci-dessus
* /CoelUtilisateur/id : déconexion
* /CoelUtilisateur/login/mot_de_passe : connexion
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author David DELON <david.delon@clapas.net>abstract
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelUtilisateur extends Coel {
// TODO : controle systematique... dans tous les services si connected : name cookie = name service
public function getRessource(){
$this->getElement(array('*','*'));
}
 
public function getElement($param){
$identification = false;
$info = array();
// Si la licence n'a pas été accepté nous réinitialisons tout
if (!isset($_COOKIE['coel_licence']) || (isset($_COOKIE['coel_licence']) && $_COOKIE['coel_licence'] != 1)) {
$this->deconnecterUtilisateur();
}
// S'il y a 3 paramètres, c'est qu'on cherche à mettre à jour la licence
if (isset($param[2])) {
// Mise à jour de la licence
if (!$this->accepterLicence($param[0])) {
$this->debug[] = "Erreur de mise à jour licence utilisateur";
}
} else if (isset($param[1])) { // Non connecté : vérification
if (!$this->getUtilisateur()) { // Si non identifié
$id = null;
if ($param[0] == '*' && $param[1] == '*') { // Tentative d'identification depuis les cookies permanents
if (isset($_COOKIE['coel_login']) && ($this->souvenirUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
$id = $this->getUtilisateurId();
$identification = true;
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
}
} else if ($this->connecterUtilisateur($param[0], $param[1], 1)) { // Tentative d'identification depuis les paramêtres passés dans l'url du service
$id = $this->getUtilisateurId();
$identification = true;
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
}
// L'identification a échouée, nous retournons un session_id comme identifiant
if (is_null($id)) {
$id = session_id();
$identification = false;
$info = array($id, $identification);
}
} else { // Déjà identifié
$id = $this->getUtilisateurId();
$identification = true;
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
}
} else { // Déconnexion
$this->deconnecterUtilisateur();
$id = session_id();
$identification = false;
$info = array($id, $identification);
}
 
array_unshift($info, $this->getLicence());
// Envoie sur la sortie standard
$this->envoyer($info);
}
private function getUtilisateurId() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['id'];
} else {
return '';
}
}
private function getUtilisateurLogin() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['login'];
} else {
return '';
}
}
private function getUtilisateurNomComplet() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['nom_complet'];
} else {
return '';
}
}
private function getUtilisateurPrenom() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['prenom'];
} else {
return '';
}
}
private function getUtilisateurNom() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['nom'];
} else {
return '';
}
}
private function getParametre() {
if ($utilisateur = $this->getUtilisateur()) {
return $utilisateur['parametre'];
} else {
return '';
}
}
private function getLicence() {
if (!empty($_SESSION['coel_utilisateur'])) {
return (string) $_SESSION['coel_utilisateur']['licence'];
} else {
return '';
}
}
private function getInfosAnnuaire() {
if (!empty($_SESSION['coel_infosAnnuaire'])) {
return $_SESSION['coel_infosAnnuaire'];
} else {
return '';
}
}
 
private function deconnecterUtilisateur() {
$_SESSION['coel_utilisateur'] = '';
$_SESSION['coel_infosAnnuaire'] = '';
$this->supprimerCookie('coel_login');
$this->supprimerCookie('coel_mot_de_passe');
$this->supprimerCookie('coel_licence');
$this->supprimerCookie('coel_permanence');
}
private function connecterUtilisateur($login, $mot_de_passe, $permanence = 1) {
// Dans tous les cas, on récupère les informations de l'utilisateur présentes dans l'annuaire de Tela Botanica
$infosAnnuaire = $this->obtenirInfosAnnuaire($login);
$this->setInfosAnnuaire($infosAnnuaire);
 
if ($mot_de_passe == 'debug' && $utilisateur_existant = $this->chargerUtilisateur($login)) {
$this->setUtilisateur($utilisateur_existant, $permanence);
return true;
} else {
$mot_de_passe_sha1 = sha1($mot_de_passe);
$mot_de_passe_md5 = md5($mot_de_passe);
if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_sha1)) {
// OK, nous poursuivons
} else if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_md5)) {
// Mise à jour du mot de passe md5 en sha1
$this->mettreAJourMotDePasse($login, $mot_de_passe_md5, $mot_de_passe_sha1);
$utilisateur_existant['mot_de_passe'] = $mot_de_passe_sha1;
}
// Vérification de la nécessité de mettre à jour l'utilisateur du COEL vis à vis de l'annuaire de Tela Botanica
if (!is_null($infosAnnuaire) && $this->avoirBesoinMiseAJour($utilisateur_existant)) {
// Vérifions que la personne s'est bien identifiée
if ($infosAnnuaire['mot_de_passe'] == $mot_de_passe_md5) {
$utilisateur_existant = $this->getInfoAnnuaireCoelDepuisInfoAnnuaireDistant($mot_de_passe_sha1, $infosAnnuaire);
$presence_dans_coel = $this->verifierPresenceUtilisateur($infosAnnuaire['id']);
if ($presence_dans_coel) {
// Nécessite de faire une mise à jour
$this->mettreAJourUtilisateur($mote_de_passe_sha1, $infosAnnuaire);
$utilisateur_existant['licence'] = (int) $this->recupererLicenceUtilisateur($infosAnnuaire['id']);
} else {
// Nécessite d'ajouter le nouvel utilisateur
$this->ajouterUtilisateurACoel($infosAnnuaire, $mot_de_passe_sha1);
}
$this->setUtilisateur($utilisateur_existant, $permanence);
} else {
return false;
}
} else if ($utilisateur_existant != false) {
// L'utilisateur est toutefois présent dans l'annuaire de COEL, est correctement identifié et n'a pas besoin de mise à jour
$this->setUtilisateur($utilisateur_existant, $permanence);
} else {
// L'utilisateur n'existe ni dans l'annuaire de Tela Botanica ni dans celui de COEL
return false;
}
// L'utilisateur a t il accepté la licence? Nécessaire pour être connecté!
if ($utilisateur_existant['licence'] == 1) {
return true;
} else {
return false;
}
}
}
private function avoirBesoinMiseAJour($info_annuaire_coel) {
$necessite_maj = false;
if ($info_annuaire_coel == false) {
// Le login et/ou le mot de passe a pu changer
$necessite_maj = true;
} else {
$info_annuaire_distant = $this->getInfosAnnuaire();
if ($this->comparerInfosAnnuairesDistantEtCoel($info_annuaire_distant, $info_annuaire_coel) == false) {
$necessite_maj = true;
}
}
return $necessite_maj;
}
private function comparerInfosAnnuairesDistantEtCoel($annuaire_distant, $annuaire_coel) {
$identique = true;
$tableau_annuaire_distant = array('nom' => $annuaire_distant['nom'],
'prenom' => $annuaire_distant['prenom'],
'ville' => $annuaire_distant['ville'],
'code_postal' => $annuaire_distant['code_postal']);
$tableau_annuaire_coel = array('nom' => $annuaire_coel['nom'],
'prenom' => $annuaire_coel['prenom'],
'ville' => $annuaire_coel['ville'],
'code_postal' => $annuaire_coel['code_postal']);
foreach ($tableau_annuaire_distant as $cle => $valeur) {
if ($tableau_annuaire_coel[$cle] != $valeur) {
$identique = false;
break;
}
}
return $identique;
}
private function getInfoAnnuaireCoelDepuisInfoAnnuaireDistant($mot_de_passe_sha1, $infos) {
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
$utilisateur_existant = array('id' => $infos['id'], 'login' => $infos['courriel'],
'mot_de_passe' => $mot_de_passe_sha1,
'nom_complet' => $cp_fmt_nom_complet, 'nom' => $infos['nom'], 'prenom' => $infos['prenom'],
'parametre' => '', 'licence' => '0');
return $utilisateur_existant;
}
private function verifierPresenceUtilisateur($id) {
$present = false;
$requete = 'SELECT COUNT(cp_id_personne) AS nbre '.
'FROM coel_personne '.
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ";
try {
$nbre = $this->bdd->query($requete)->fetchColumn();
if ($nbre === false) {
$this->debug[] = "L'utilisateur n'est pas présent dans l'annuaire de COEL.";
} else {
$present = true;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $present;
}
private function recupererLicenceUtilisateur($id) {
$requete = 'SELECT cp_mark_licence '.
'FROM coel_personne '.
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ";
try {
$licence = $this->bdd->query($requete)->fetchColumn();
if ($licence === false) {
$this->debug[] = "La licence n'a pas pu être récupérée.";
return 0;
} else {
return $licence;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
private function mettreAJourMotDePasse($login, $mot_de_passe_md5, $mot_de_passe_sha1) {
try {
$requete = 'UPDATE coel_personne '.
"SET cp_mot_de_passe = '$mot_de_passe_sha1' ".
"WHERE cp_login = '$login' ".
"AND cp_mot_de_passe = '$mot_de_passe_md5' ";
// Ajout des données
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->messages[] = "Le mot de passe de l'utilisateur n'a pas été mis à jour car la requête a échouée.";
}
} catch (PDOException $e) {
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
private function mettreAJourUtilisateur($mot_de_passe_sha1, $infos) {
try {
$cp_ce_projet = $this->config['coel']['idProjetUtilisateurs'];
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
$requete = 'UPDATE coel_personne '.
"SET cp_id_personne = '{$infos['id']}', cp_ce_projet = '$cp_ce_projet', ".
" cp_fmt_nom_complet = '$cp_fmt_nom_complet', cp_prenom = '{$infos['prenom']}', cp_nom = '{$infos['nom']}', ".
" cp_code_postal = '{$infos['code_postal']}', cp_ville = '{$infos['ville']}', cp_truk_courriel = '{$infos['courriel']}', ".
" cp_login = '{$infos['courriel']}', cp_mot_de_passe = '$mot_de_passe_sha1', cp_ce_annuaire = '{$infos['id']}' ".
"WHERE cp_login = '$login' ".
"AND cp_mot_de_passe = '$mot_de_passe_md5' ";
// Ajout des données
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->messages[] = "L'utilisateur n'a pas été mis à jour car la requête a échouée.";
}
} catch (PDOException $e) {
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
private function ajouterUtilisateurACoel($infos, $mot_de_passe_sha1) {
try {
// Construction de la requête d'ajout
// Notes : pour rester compatibles avec l'annuaire de Tela, les utilisateurs sont ajoutés directement avec l'id
// de l'annuaire Tela. Dans CoelPersonne, les personnes qui ne sont pas utilisateur sont ajoutés avec un id supérieur à 100 000
$cp_ce_projet = $this->config['coel']['idProjetUtilisateurs'];
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
$cp_mark_licence = '0';
$requete = 'INSERT INTO coel_personne '.
"(cp_id_personne, cp_ce_projet, cp_fmt_nom_complet, cp_prenom, cp_nom, cp_code_postal,
cp_ville, cp_truk_courriel, cp_login, cp_mot_de_passe, cp_ce_annuaire, cp_mark_licence) ".
"VALUES ('{$infos['id']}, '$cp_ce_projet', '$cp_fmt_nom_complet', '{$infos['prenom']}', '{$infos['nom']}',".
"'{$infos['code_postal']}', '{$infos['ville']}', '{$infos['courriel']}', '{$infos['courriel']}', '".$mot_de_passe_sha1."',".
"'{$infos['id']}', $cp_mark_licence) ";
// Ajout des données
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->messages[] = "L'utilisateur n'a pas été ajouté dans coel_personne car la requête a échouée.";
}
} catch (PDOException $e) {
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
private function souvenirUtilisateur($login, $mot_de_passe_sha1) {
if ($login == '' && $mot_de_passe_sha1 == '') {
return false;
} else if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_sha1)) {
if ($utilisateur_existant['mot_de_passe'] == $mot_de_passe_sha1) {
$this->setUtilisateur($utilisateur_existant, $_COOKIE['coel_permanence']);
return true;
} else {
return false;
}
}
}
private function obtenirInfosAnnuaire($login) {
$url_annuaire = $this->config['coel']['urlAnnuaire'];
$login_annuaire = $this->config['coel']['loginAnnuaire'];
$mdp_annuaire = $this->config['coel']['mdpAnnuaire'];
$login_b64 = base64_encode($login_annuaire.':'.$mdp_annuaire);
$url_annuaire .= '/'.$login_b64.'/'.$login;
$resultat_annuaire = file_get_contents($url_annuaire);
$tableau_annuaire = null;
if ($xml_utilisateur = simplexml_load_string($resultat_annuaire)) {
// La fonction a retourné un objet
foreach ($xml_utilisateur->children() as $key => $val) {
if ((string) $val != '') {
$tableau_annuaire[$key] = (String) $val;
}
}
}
return $tableau_annuaire;
}
private function setInfosAnnuaire($infosAnnuaire) {
$_SESSION['coel_infosAnnuaire'] = $infosAnnuaire;
}
private function accepterLicence($utilisateur) {
$sortie = false;
try {
$requete = 'UPDATE coel_personne '.
'SET cp_mark_licence = 1 '.
"WHERE cp_login = {$this->bdd->quote($utilisateur)} ";
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$this->log[] = "La table Personne n'a pas été mise à jour car la requête a échouée.";
} else {
$_SESSION['coel_utilisateur']['licence'] = '1';
$this->setCookiePersistant('coel_licence', $utilisateur['licence']);
$sortie = true;
}
} catch (PDOException $e) {
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
return $sortie;
}
}
?>
/trunk/jrest/services/CoelStructureAPersonne.php
New file
0,0 → 1,209
<?php
/**
* Service fournissant la liste des relations "structure à personne".
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelStructureAPersonne extends Coel {
 
/** Contient les infos sur les tables gérées par ce service.
* Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
protected $tables = array( 113 => array( 'nom' => 'coel_personne',
'prefixe' => 'cp',
'id' => array('cp_id_personne')),
121 => array( 'nom' => 'coel_structure_a_personne',
'prefixe' => 'csap',
'id' => array('csap_id_personne', 'csap_id_role', 'csap_id_structure')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_structure', 'id_role'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
' csap.*, cp_ce_projet, cp_prenom, cp_nom, cp_truk_telephone, cp_truk_courriel, cp_ce_truk_specialite '.
'FROM coel_structure_a_personne AS csap '.
' LEFT JOIN coel_meta_historique_ligne ON (csap_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_personne ON (csap_id_personne = cp_id_personne) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_structure']) ? "AND csap_id_structure = {$p['id_structure']} " : '').
(isset($p['id_role']) ? "AND csap_id_role = {$p['id_role']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'csap_ce_meta DESC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
$this->debug[] = $requete;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['structuresAPersonne'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id = $this->ajouter($table);
if ($id !== false) {
$table['champs_valeurs_id']['cp_id_personne'] = $id;
$table['champs_valeurs_brut']['cp_id_personne'] = $id;
$tables_a_modifier[121]['champs_valeurs_id']['csap_id_personne'] = $id;
$tables_a_modifier[121]['champs_valeurs_brut']['csap_id_personne'] = $id;
$tables_a_modifier[121]['champs_valeurs_protege']['csap_id_personne'] = $this->bdd->quote($id);
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) && !isset($uid[1]) && !isset($uid[2])) {
$this->messages[] = 'Aucun identifiant de structure, personne et role a été passé. Vous ne devriez pas avoir accès à ce service.';
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
 
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des identifiant à supprimer
$identifiants = array();
$identifiants_agreges = explode(',', rtrim($uid[1], ','));
foreach ($identifiants_agreges as $identifiant) {
$identifiants[] = explode('-', $identifiant);
}
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
try {
foreach ($identifiants as $id) {
if (count($id) == 1) { // Seulement des id de structure
$params = array('csap_id_structure' => $id[0]);
} else if (count($id) == 3) { // Tous les id...
$params = array('csap_id_personne' => $id[1], 'csap_id_role' => $id[2], 'csap_id_structure' => $id[0]);
}
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[121];
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(121, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelStatistique.php
New file
0,0 → 1,272
<?php
/**
* Service fournissant des urls vers des images de graphiques sur les statistiques de l'application COEL.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation :
* /CoelStatistique/MonTypeDeStat : retourne l'url du graphique pour le type de statistique demandé
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelStatistique extends Coel {
private $parametres = array();
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param) {
$info = null;
if (isset($param[0])) {
$service_demande = array_shift($param);
$this->parametres = $param;
$methode = 'get'.$service_demande;
if (method_exists($this, $methode)) {
$info = $this->$methode();
}
} else {
$this->messages[] = "Le service COEL Statistique nécessite un paramètre.";
}
print $info;
}
private function getAccueil() {
$html = '<h2>Bienvenue</h2>'.
'<p>Vous utilisez Coel</p>';
return $html;
}
private function getNombreDonnees() {
// Récupération des données
$types = array( array('Commentaires', 'coel_commentaire', 'ccm_id_commentaire'),
array('Publications', 'coel_publication', 'cpu_id_publication'),
array('Personnes', 'coel_personne', 'cp_id_personne'),
array('Collections', 'coel_collection', 'cc_id_collection'),
array('Structures', 'coel_structure', 'cs_id_structure'));
$donnees = array();
foreach ($types as $info) {
list($type, $table, $champ) = $info;
$donnees[$type] = $this->executerRequeteNombre($table, $champ);
}
// Post traitement des données de la base de données
$titre = str_replace(' ', '+', 'Nombre de données');
asort($donnees);
$valeurs = implode(',', $donnees);
arsort($donnees);
$etiquettes = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=bhs'.
'&chs=250x180'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chxt=y'.
'&chxl='.'0 :|'.$etiquettes.'|'.
'&chm=N ** ,000000,0,-1,10'.
'&chtt='.$titre;
return '<img src="'.$url.'"/>';
}
 
private function getMesDonnees() {
$personne_id = (isset($this->parametres[0]) ? $this->parametres[0] : null);
// Récupération des données
$types = array( 'Commentaires' => '107',
'Publications' => '118, 119',
'Personnes' => '113, 114',
'Collections' => '101, 102, 103, 104, 105, 106',
'Structures' => '120, 121, 122, 123');
$etats = array( 1 => 'Ajouts',
2 => 'Modifications',
3 => 'Suppressions');
$donnees = array();
foreach ($types as $type => $table_identifiants) {
foreach ($etats as $etat_id => $etat_type) {
$donnees[$etat_type][$type] = $this->executerRequeteNombreDansHistorique($table_identifiants, $etat_id, $personne_id);
}
}
// Post traitement des données de la base de données
$titre = str_replace(' ', '+', 'Ma participation');
$max_global = array();
$ensembles_donnees = array();
foreach ($donnees as $ensemble_donnees) {
$ensembles_donnees[] = implode(',', array_reverse($ensemble_donnees));
// Gestion de l'échelle
foreach ($ensemble_donnees as $type => $val) {
if (!isset($max_global[$type])) {
$max_global[$type] = 0;
}
$max_global[$type] += $val;
}
}
$maximum = max($max_global);
$moitier = round(($maximum / 2), 1);
$valeurs = implode('|', $ensembles_donnees);
$etiquettes = implode('|', array_keys($types));
$legende = implode('|', $etats);
$etiquettes_x = "0|$moitier|$maximum";
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=bhs'.
'&chs=300x180'.
'&chbh=a,2,4'.
'&chco=66B032,FABC02,FE2712'.
'&chdl='.$legende.
'&chdlp=b'.
'&chd=t:'.$valeurs.
'&chds=0,'.$maximum.
'&chxt=y,x'.
'&chxl='.'0:|'.$etiquettes.'|1:|'.$etiquettes_x.
'&chm=N,000000,0,-1,10,1|N,000000,1,-1,10,1|N,000000,2,-1,10,1'.
'&chtt='.$titre;
return '<img src="'.$url.'"/>';
}
private function getTypeDepot() {
// Récupération des données
$requete = 'SELECT cmlv_nom AS type, COUNT(cc_ce_type_depot) AS nbre '.
'FROM coel_collection '.
' LEFT JOIN coel_meta_liste_valeur ON (cc_ce_type_depot = cmlv_id_valeur) '.
'GROUP BY cc_ce_type_depot';
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Post traitement des données de la base de données
$titre = str_replace(' ', '+', 'Type de dépôt|des collections');
$donnees = array();
foreach ($infos as $info) {
$donnees[$info['type']] = $info['nbre'];
}
asort($donnees);
$valeurs = implode(',', $donnees);
arsort($donnees);
$etiquettes = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=bhs'.
'&chs=250x170'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.(max($donnees)+5).
'&chxt=y'.
'&chxl='.'0 :|'.$etiquettes.'|'.
'&chm=N *,000000,0,-1,10'.
'&chtt='.$titre.
'&chts=000000,12';
// Retour du html contenant l'image
return '<img src="'.$url.'"/>';
}
private function getNombreCollectionParStructure() {
// Récupération des données
$requete = 'SELECT COUNT(cc_id_collection) AS nbre '.
'FROM coel_collection '.
'GROUP BY cc_ce_structure';
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Post traitement des données de la base de données
$titre = str_replace(' ', '+', 'Nombre de collections|par institution');
$donnees = array( '1 collection' => 0,
'2 collections' => 0,
'Entre 3 et 10' => 0,
'Entre 11 et 50' => 0,
'Plus de 50' => 0);
foreach ($infos as $info) {
$nbre = $info['nbre'];
if ($nbre == 1) {
$donnees['1 collection']++;
} else if ($nbre == 2) {
$donnees['2 collections']++;
} else if ($nbre >= 3 && $nbre <= 10) {
$donnees['Entre 3 et 10']++;
} else if ($nbre >= 11 && $nbre <= 50) {
$donnees['Entre 11 et 50']++;
} else if ($nbre > 50) {
$donnees['Plus de 50']++;
}
}
$donnees_tmp = $donnees;
$donnees = array();
foreach ($donnees_tmp as $cle => $valeur) {
$donnees[$cle.' ('.$valeur.')'] = $valeur;
}
asort($donnees);
$valeurs = implode(',', $donnees);
//arsort($donnees);
$etiquettes = implode('|', array_keys($donnees));
//$legende = implode('|', array_keys($donnees));
// Construire de l'url de l'image
$url = 'http://chart.apis.google.com/chart?'.
'cht=p3'.
'&chs=350x150'.
'&chco=4D89F9'.
'&chd=t:'.$valeurs.
'&chds=0,'.max($donnees).
'&chl='.$etiquettes.
'&chtt='.$titre.
'&chts=000000,12';
// Retour du html contenant l'image
return '<img src="'.$url.'"/>';
}
private function executerRequeteNombreDansHistorique($table_identifiants, $etat, $personne_id = null) {
$requete = "SELECT COUNT(cmhl_date_modification) AS nbre ".
"FROM coel_meta_historique_ligne ".
"WHERE cmhl_ce_table IN ($table_identifiants) ".
" AND cmhl_ce_etat = $etat ".
(isset($personne_id) ? " AND cmhl_ce_modifier_par = $personne_id " : '');
try {
$nbre = $this->bdd->query($requete)->fetchColumn();
if ($nbre === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $nbre;
}
private function executerRequeteNombre($table, $champ) {
$requete = "SELECT COUNT($champ) AS nbre FROM $table";
try {
$nbre = $this->bdd->query($requete)->fetchColumn();
if ($nbre === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $nbre;
}
}
/trunk/jrest/services/Coel.php
New file
0,0 → 1,593
<?php
/**
* Classe mère abstraite contenant les méthodes génériques des services.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
abstract class Coel {
const ETAT_AJOUTER = 1;
const ETAT_MODIFIER = 2;
const ETAT_SUPPRIMER = 3;
protected $sessionName = 'CoelSession';
protected $sessionExpireTime = 8640000;// 60*60*24*100 = 100 jours
protected static $cookieChemin = '';
public $config;
protected $bdd;
protected $log = array();
protected $messages = array();
protected $debug = array();
protected $distinct = false;
protected $orderby = null;
protected $formatRetour = 'objet';
protected $start = 0;
protected $limit = 150;
public function __construct($config, $demarrer_session = true) {
// Tableau contenant la config de Jrest
$this->config = $config;
// Connection à la base de données
$this->bdd = $this->connecterPDO($this->config, 'coel');
$this->gererSession($demarrer_session);
$this->gererIdentificationPermanente();
// Nettoyage du $_GET (sécurité)
if (isset($_GET)) {
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour');
foreach ($get_params as $get) {
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';');
$_GET[$get] = str_replace($verifier, '', $_GET[$get]);
if (isset($_GET[$get]) && $_GET[$get] != '') {
$this->$get = $_GET[$get];
} else {
$_GET[$get] = null;
}
}
}
}
 
/**
* Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET.
*/
public function getRessource() {
$this->getElement(array());
}
protected function creerXmlHisto($donnees) {
// Création du xml de l'enregistrement à historiser
$info = null;
$xml_tpl = '<?xml version="1.0" encoding="UTF-8" ?>'."\n<resultset>\n<row>\n%s</row>\n</resultset>";
$xml = null;
foreach ($donnees as $cle => $valeur) {
if (!is_null($valeur) && $valeur != '') {
$xml .= "<$cle>$valeur</$cle>\n";
}
}
if ($xml !== null) {
$info = sprintf($xml_tpl, $xml);
$info = $this->bdd->quote($info);
}
return $info;
}
protected function getTableauDepuisXmlHisto($xml) {
// Création du xml de l'enregistrement à historiser
$info = array();
if (!empty($xml) && preg_match_all('|<([^>]+)>(.*)</[^>]+>|U', $xml, $matches, PREG_SET_ORDER)) {
foreach ($matches as $val) {
$info[$val[1]] = $val[2];
}
}
return $info;
}
protected function historiser($table_id, $ligne_cle, $info, $id_utilisateur, $etat, $id_session) {
// Pré-traitement des variables
$info = (is_null($info)) ? 'NULL' : $info;
// Historisation (Ajout des méta-données)
$requete = 'INSERT INTO coel_meta_historique_ligne '.
' (cmhl_ce_table, cmhl_cle_ligne, cmhl_enregistrement, cmhl_date_modification, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, cmhl_session_id) '.
'VALUES ('.
" $table_id, ".
' "'.$ligne_cle.'", '.
" $info, ".
' "'.date('Y-m-d H:i:s', time()).'", '.
" $id_utilisateur, ".
" $etat, ".
' "'.$_SERVER['REMOTE_ADDR'].'", '.
' "'.$id_session.'") ';
// Exécution de la requêtre SQL et test d'éventuelles erreurs
$resultat = $this->bdd->exec($requete);
if ($resultat === false ) {
$this->log[] = "Des données de la table '$table_id' (enrg. $ligne_cle) n'ont pas été historisées car la requête a échouée.";
}
return $this->bdd->lastInsertId();
}
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) {
// Traitements des messages d'erreurs et données
if (count($this->messages) != 0) {
header('HTTP/1.1 500 Internal Server Error');
$mime = 'text/html';
$encodage = 'utf-8';
$json = true;
$sortie = $this->messages;
} else {
$sortie = $donnees;
if (is_null($donnees)) {
$sortie = 'OK';
}
}
 
// Gestion de l'envoie du déboguage
$this->envoyerDebogage();
// Encodage au format et JSON et envoie sur la sortie standard
$contenu = $json ? json_encode($sortie) : $sortie;
$this->envoyerContenu($encodage, $mime, $contenu);
}
protected function envoyerDebogage() {
if (!is_array($this->debug)) {
$this->debug[] = $this->debug;
}
if (count($this->debug) != 0) {
foreach ($this->debug as $cle => $val) {
if (is_array($val)) {
$this->debug[$cle] = print_r($val, true);
}
}
header('X-DebugJrest-Data:'.json_encode($this->debug));
}
}
protected function envoyerContenu($encodage, $mime, $contenu) {
header("Content-Type: $mime; charset=$encodage");
print $contenu;
}
private function connecterPDO($config, $base = 'database') {
$cfg = $config[$base];
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec'];
try {
$PDO = new PDO($dsn, $cfg['username'], $cfg['password']);
} catch (PDOException $e) {
echo 'La connexion à la base de donnée via PDO a échouée : ' . $e->getMessage();
}
// Passe en UTF-8 la connexion à la BDD
$PDO->exec("SET NAMES 'utf8'");
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché)
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $PDO;
}
protected function getTxt($id) {
$sortie = '';
switch ($id) {
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break;
default : $sortie = $id;
}
return $sortie;
}
protected function concatenerChamps($champs, $prefixe = null) {
$chaine = '';
foreach ($champs as $cle => $valeur) {
if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
$chaine .= ", $cle = $valeur";
}
}
return ltrim($chaine, ', ');
}
 
protected function separerChampsValeurs($donnees, $prefixe = null) {
$sortie = array('', '');
// Concaténation des champs et des valeurs dans des chaines séparées
foreach ($donnees as $cle => $valeur) {
if (is_null($prefixe) || (!is_null($prefixe) && stristr($cle, $prefixe.'_'))) {
$sortie[0] .= "$cle, ";
$sortie[1] .= "$valeur, ";
}
}
// Suppression de la virgule finale
$sortie[0] = rtrim($sortie[0], ', ');
$sortie[1] = rtrim($sortie[1], ', ');
return $sortie;
}
protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) {
$sortie = array();
foreach ($params_attendu as $num => $nom) {
if (isset($params[$num]) && $params[$num] != '*') {
if ($pourBDD) {
$params[$num] = $this->bdd->quote($params[$num]);
}
$sortie[$nom] = $params[$num];
}
}
return $sortie;
}
protected function traiterBddClauseIn($chaine) {
$sortie = '';
$chaine = trim($chaine, " '");
if ($chaine != '') {
$valeurs = explode(',', $chaine);
foreach ($valeurs as $id => $valeur) {
$valeurs[$id] = $this->bdd->quote($valeur);
}
$sortie = implode(',', $valeurs);
}
return $sortie;
}
protected function traiterParametresPost($params) {
$sortie = array();
foreach ($params as $cle => $valeur) {
$sortie[$cle] = $this->bdd->quote($valeur);
}
return $sortie;
}
protected function getIdentification(&$params) {
// Initialisation des variables
$utilisateur = array(0, session_id());
// L'id utilisateur est soit passé par le POST soit dans l'url
if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) {
$utilisateur[0] = $params['cmhl_ce_modifier_par'];
unset($params['cmhl_ce_modifier_par']);
} else if (is_string($params)) {
$utilisateur[0] = $params;
}
return $utilisateur;
}
protected function etreAutorise($id_utilisateur) {
$autorisation = false;
if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) {
$this->messages[] = 'Accès interdit.';
} else if ($_SESSION['coel_utilisateur'] == '') {
$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.';
} else {
$autorisation = true;
}
return $autorisation;
}
protected function recupererCle($table) {
$cle = null;
if (isset($table['champs_valeurs_id'])) {
$identifiants = array();
// Trie des clés primaire pour avoir toujours le même ordre dans la table historique pour les clés multiples
ksort($table['champs_valeurs_id']);
foreach ($table['champs_valeurs_id'] as $id) {
$identifiants[] = $id;
}
$cle = implode('-', $identifiants);
}
return $cle;
}
protected function avoirCleComplete($table) {
$cle_complete = false;
if (isset($table['champs_valeurs_id'])) {
$ok = true;
foreach ($table['id'] as $id) {
if (!isset($table['champs_valeurs_id'][$id]) || $table['champs_valeurs_id'][$id] == '') {
$ok = false;
break;
}
}
$cle_complete = $ok;
}
return $cle_complete;
}
protected function recupererEtat($table) {
$etat = 1;// Ajout
if ($this->avoirEnregistrement($table) === true) {
$etat = 2;// Modification
}
return $etat;
}
protected function avoirEnregistrement($table) {
$avoir_enregistrement = false;
$requete = 'SELECT * '.
"FROM {$table['nom']} ".
"WHERE %s ";
$where = $this->construireWhere($table['champs_valeurs_id']);
$requete = sprintf($requete, $where);
// Exécution de la requêtre SQL et test d'éventuelles erreurs
$resultat = $this->bdd->query($requete, PDO::FETCH_ASSOC)->fetch();
if ($resultat !== false) {
$avoir_enregistrement = true;
}
return $avoir_enregistrement;
}
protected function construireWhere($table) {
$where = '1';
if (is_array($table) && count($table) > 0) {
$table_where = array();
foreach ($table as $chp => $id) {
$table_where[] = "$chp = '$id'";
}
$where = implode(' AND ', $table_where);
}
return $where;
}
protected function recupererTablesAModifier($parametres) {
$tables_a_modifier = $this->tables;
foreach ($this->tables as $table_id => $table) {
$tables_a_modifier[$table_id]['champs'] = null;
foreach ($parametres as $cle => $valeur) {
if (preg_match('/^'.$table['prefixe'].'_/', $cle)) {
// Contient les noms des champs seulements
$tables_a_modifier[$table_id]['champs'][] = $cle;
// Contient un tableau de résultats protégé pour l'inclusion en bdd
$tables_a_modifier[$table_id]['champs_valeurs_protege'][$cle] = $this->bdd->quote($valeur);
// Contient un tableau de résultats non protégé
$tables_a_modifier[$table_id]['champs_valeurs_brut'][$cle] = $valeur;
if (preg_match('/_id_/', $cle)) {
$tables_a_modifier[$table_id]['champs_valeurs_id'][$cle] = $valeur;
}
}
}
}
return $tables_a_modifier;
}
 
protected function mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table) {
if (!is_null($table['champs'])) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$etat = $this->recupererEtat($table);
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'][$champ_meta] = $this->bdd->quote($id_meta);
// Mise à jour des données ou ajout en fonction de l'état
if ($etat == 1) { // Ajout
$this->ajouter($table);
} else if ($etat == 2) { // Modif
$this->modifier($table);
}
}
}
protected function ajouter($table) {
$requete = "INSERT INTO {$table['nom']} ".
' (%s) '.
' VALUES (%s) ';
$champs = $valeurs = '';
foreach ($table['champs_valeurs_protege'] as $chp => $val) {
$champs .= "$chp, ";
$valeurs .= "$val, ";
}
$requete = sprintf($requete, rtrim($champs, ', '), rtrim($valeurs, ', '));
$resultat = $this->bdd->exec($requete);
$dernier_id = false;
if ($resultat === false) {
$cle = $this->recupererCle($table);
$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été ajouté car la requête a échouée.";
} else {
$dernier_id = $this->bdd->lastInsertId();
}
return $dernier_id;
}
protected function modifier($table) {
$requete = "UPDATE {$table['nom']} ".
'SET %s '.
'WHERE %s ';
$champs_requete = '';
foreach ($table['champs_valeurs_protege'] as $chp => $val) {
$champs_requete .= "$chp = $val, ";
}
$where = $this->construireWhere($table['champs_valeurs_id']);
$requete = sprintf($requete, rtrim($champs_requete, ', '), $where);
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$cle = $this->recupererCle($table);
$this->log[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été mis à jour car la requête a échouée.";
} else {
$resultat = true;
}
return $resultat;
}
protected function supprimer($table) {
$requete = "DELETE FROM {$table['nom']} ".
'WHERE %s ';
$where = $this->construireWhere($table['champs_valeurs_id']);
$requete = sprintf($requete, $where);
$resultat = $this->bdd->exec($requete);
if ($resultat === false) {
$cle = $this->recupererCle($table);
$this->messages[] = "L'enregistrement '$cle' de la table {$table['nom']} n'a pas été supprimé car la requête a échouée.";
} else {
$resultat = true;
}
return $resultat;
}
private function gererSession($demarrage) {
session_name($this->sessionName);
 
// Configuration du cookie de session
// Détermination du chemin pour les cookies nécessaire à Jrest
/// ATTENTION : comme les cookies sont passés à Jrest, il faut utiliser l'url de Jrest pour établir le chemin
$url_morceaux = parse_url($this->config['coel']['urlBaseJrest']);
$this->cookieChemin = $this->reparerCheminCookie($url_morceaux['path']);
unset($url_morceaux);
session_set_cookie_params($this->sessionExpireTime, $this->cookieChemin);
// Démarrage de la session
if ($demarrage) {
session_start();
}
}
private function reparerCheminCookie($chemin) {
// dirname renvoit / si le chemin vaut seulement /dossier/, cela renvoit /dossier si le chemin vaut /dossier//.
$chemin = dirname($chemin.'/.');
// Fixe la gestion des chemins pour les cookies sous les OS utilisant le \ comme séparteur de chemin
$chemin = str_replace('\\', '/', $chemin);
// Ajoute un '/' terminal sauf si on est à la racine web
$chemin = ($chemin != '/' ? $chemin.'/' : '');
return $chemin;
}
private function gererIdentificationPermanente() {
// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd
if ($this->getUtilisateur() == ''
&& isset($_COOKIE['coel_login'])
&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']);
}
}
protected function getUtilisateur() {
return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : '');
}
protected function chargerUtilisateur($login, $mot_de_passe = null) {
$sortie = false;
$requete = 'SELECT cp_id_personne AS id, cp_fmt_nom_complet AS nom_complet, cp_prenom AS prenom, '.
' cp_nom AS nom, cp_login AS login, cp_mot_de_passe AS mot_de_passe, cp_parametre AS parametre, '.
' cp_ville AS ville, cp_code_postal AS code_postal, '.
' cp_mark_licence AS licence '.
'FROM coel_personne '.
"WHERE cp_login = {$this->bdd->quote($login)} ".
((!is_null($mot_de_passe)) ? "AND cp_mot_de_passe = {$this->bdd->quote($mot_de_passe)} " : '');
try {
$resultat = $this->bdd->query($requete)->fetch();
if ($resultat === false) {
$this->debug[] = "La requête a retournée aucun résultat.";
} else {
$sortie = array('id' => $resultat['id'],
'login' => $login,
'mot_de_passe' => $resultat['mot_de_passe'],
'nom_complet' => $resultat['nom_complet'],
'nom' => $resultat['nom'],
'prenom' => $resultat['prenom'],
'parametre' => $resultat['parametre'],
'ville' => $resultat['ville'],
'code_postal' => $resultat['code_postal'],
'licence' => $resultat['licence']);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $sortie;
}
protected function setUtilisateur($utilisateur, $permanence = 1) {
$_SESSION['coel_utilisateur'] = $utilisateur;
$this->debug[] = $_SESSION['coel_utilisateur'];
$this->setCookiePersistant('coel_login', $utilisateur['login'], $permanence);
$this->setCookiePersistant('coel_mot_de_passe', $utilisateur['mot_de_passe'], $permanence);
$this->setCookiePersistant('coel_licence', $utilisateur['licence'], $permanence);
$this->setCookiePersistant('coel_permanence', $permanence, $permanence);
}
protected function setCookiePersistant($cookie_nom, $valeur, $permanence = 1) {
setCookie($cookie_nom, $valeur, time() + ($permanence ? 100*24*60*60 : 60*60), $this->cookieChemin);
$_COOKIE[$cookie_nom] = $valeur;
}
protected function supprimerCookie($cookie_nom) {
setCookie($cookie_nom, '', 1, $this->cookieChemin);
$_COOKIE[$cookie_nom] = '';
}
/**
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données,
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés.
*
* @param String $fichier le chemin du fichier du squelette
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette.
*
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat.
*/
public static function traiterSquelettePhp($fichier, Array $donnees = array()) {
$sortie = false;
if (file_exists($fichier)) {
// Extraction des variables du tableau de données
extract($donnees);
// Démarage de la bufferisation de sortie
ob_start();
// Si les tags courts sont activés
if ((bool) @ini_get('short_open_tag') === true) {
// Simple inclusion du squelette
include $fichier;
} else {
// Sinon, remplacement des tags courts par la syntaxe classique avec echo
$html_et_code_php = self::traiterTagsCourts($fichier);
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval
$html_et_code_php = '?>'.$html_et_code_php;
// Interprétation du html et du php dans le buffer
echo eval($html_et_code_php);
}
// Récupèration du contenu du buffer
$sortie = ob_get_contents();
// Suppression du buffer
@ob_end_clean();
} else {
$msg = "Le fichier du squelette '$fichier' n'existe pas.";
trigger_error($msg, E_USER_WARNING);
}
// Retourne le contenu
return $sortie;
}
/**
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo.
*
* @param String $chemin_squelette le chemin du fichier du squelette
*
* @return string le contenu du fichier du squelette php avec les tags courts remplacés.
*/
private static function traiterTagsCourts($chemin_squelette) {
$contenu = file_get_contents($chemin_squelette);
// Remplacement de tags courts par un tag long avec echo
$contenu = str_replace('<?=', '<?php echo ', $contenu);
// Ajout systématique d'un point virgule avant la fermeture php
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
return $contenu;
}
}
?>
/trunk/jrest/services/CoelCollectionACommentaire.php
New file
0,0 → 1,201
<?php
/**
* Service fournissant la liste des relations "structure à personne".
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelCollectionACommentaire extends Coel {
const MODE_SUPPRESSION_PAR_COLLECTION = 'SuppressionParCollection';
const MODE_SUPPRESSION_PAR_COMMENTAIRE = 'SuppressionParCommentaire';
/** Contient les infos sur les tables gérées par ce service.
* Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
protected $tables = array( 102 => array( 'nom' => 'coel_collection_a_commentaire',
'prefixe' => 'ccac',
'id' => array('ccac_id_collection', 'ccac_id_commentaire')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_collection', 'mark_public'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
' ccac.*, ccm.* '.
'FROM coel_collection_a_commentaire AS ccac '.
' LEFT JOIN coel_meta_historique_ligne ON (ccac_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_commentaire AS ccm ON (ccac_id_commentaire = ccm_id_commentaire) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_collection']) ? "AND ccac_id_collection = {$p['id_collection']} " : '').
(isset($p['mark_public']) ? "AND ccm_mark_public = {$p['mark_public']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'ccac_ce_meta DESC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['collectionsACommentaire'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
$this->messages[] = 'Il est nécessaire de fournir toutes les clés à ce service.';
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) && !isset($uid[1])) {
$this->messages[] = 'Aucun identifiant de collection a été passé. Vous ne devriez pas avoir accès à ce service.';
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un ou plusieurs éléments
*/
public function deleteElement($uid) {
// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
 
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Mode de suppression
$mode_de_suppression = '';
if (isset($uid[2])) {
$mode_de_suppression = $uid[2];
}
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des identifiant à supprimer
$identifiants = array();
$identifiants_agreges = explode(',', rtrim($uid[1], ','));
foreach ($identifiants_agreges as $identifiant) {
$identifiants[] = explode('-', $identifiant);
}
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
try {
foreach ($identifiants as $id) {
if (count($id) == 1) { // Seulement des id de collection
if ($mode_de_suppression == MODE_SUPPRESSION_PAR_COLLECTION) {
$params = array('ccac_id_collection' => $id[0]);
} else if ($mode_de_suppression == MODE_SUPPRESSION_PAR_COMMENTAIRE) {
$params = array('ccac_id_commentaire' => $id[0]);
} else {
$params = array('ccac_id_collection' => $id[0]);
}
} else if (count($id) == 2) { // Tous les id...
$params = array('ccac_id_collection' => $id[0], 'ccac_id_commentaire' => $id[1]);
}
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[102];
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(102, $cle, 'NULL', $id_utilisateur, Coel::ETAT_SUPPRIMER, $id_session);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelSyndication.php
New file
0,0 → 1,746
<?php
/** Paramêtres indiquant que l'on est en français pour permettre l'affichage des dates en français. */
setlocale(LC_TIME, 'fr_FR.UTF-8');
/**
* Service fournissant des informations concernant COEL au format RSS1, RSS2 ou ATOM.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Notes : pour les requêtes sur la table d'historique cela peut être assez compliqué!
* Voir : http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id: CoelSyndication.php 381 2010-05-17 17:10:37Z jpm $
* @copyright 2009
*/
class CoelSyndication extends Coel {
private $format = null;
private $service = null;
private $squelette = null;
private $squelette_dossier = null;
private $squelette_diff = null;
private $flux = array();
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
$contenu = '';
// Pré traitement des paramêtres
$pour_bdd = false;
$p = $this->traiterParametresUrl(array('service', 'format'), $param, $pour_bdd);
// Récupération de la liste des flux
$this->chargerListeDesFlux();
// Chargement du bon type de service demandé
if (isset($p['service'])) {
$this->service = strtolower($p['service']);
$methode = $this->getNomMethodeService();
if (method_exists($this, $methode)) {
if ($this->service != 'liste_des_flux') {
if (isset($p['format']) && preg_match('/^(?:rss1|rss2|atom)$/i', $p['format'])) {
// Multiplication par deux de la limite car nous récupérons deux lignes par item
$this->limit = $this->limit*2;
// Mise en minuscule de l'indication du format
$this->format = strtolower($p['format']);
// Définition du fichier squelette demandé
$this->squelette_dossier = dirname(__FILE__).DIRECTORY_SEPARATOR.'squelettes'.DIRECTORY_SEPARATOR;
$this->squelette = $this->squelette_dossier.$this->format.'.tpl.xml';
$this->squelette_diff = $this->squelette_dossier.'diff.tpl.html';
} else {
$this->format = '';
$this->messages[] = "Le service COEL Syndication nécessite d'indiquer en second paramètre le format : rss1, rss2 ou atom.";
}
}
// Récupération du contenu à renvoyer
$contenu = $this->$methode();
} else {
$this->messages[] = "Le type d'information demandé '$this->service' n'est pas disponible.";
}
} else {
$this->messages[] = "Le service COEL Syndication nécessite d'indiquer en premier paramètre le type d'information demandé.";
}
// Envoie sur la sortie standard
$encodage = 'utf-8';
$mime = $this->getTypeMime();
$formatage_json = $this->getFormatageJson();
$this->envoyer($contenu, $mime, $encodage, $formatage_json);
}
private function getUrlServiceBase() {
$url_service = $this->config['coel']['urlBaseJrest'].'CoelSyndication/'.$this->service.'/'.$this->format;
return $url_service;
}
private function getNomMethodeService() {
$methode = '';
$service_formate = str_replace(' ', '', ucwords(implode(' ', explode('_', $this->service))));
$methode = 'getService'.$service_formate;
return $methode;
}
private function getTypeMime() {
$mime = '';
switch ($this->format) {
case 'atom' :
$mime = 'application/atom+xml';
break;
case 'rss1' :
case 'rss2' :
$mime = 'application/rss+xml';
break;
default:
$mime = 'text/html';
}
return $mime;
}
private function getFormatageJson() {
$json = false;
switch ($this->service) {
case 'liste_des_flux' :
$json = true;
break;
default:
$json = false;
}
return $json;
}
private function getFlux($nom) {
$nom = strtolower($nom);
return isset($this->flux[$nom]) ? $this->flux[$nom] : array();
}
 
private function setFlux($nom, $titre, $description) {
$url_base = $this->config['coel']['urlBaseJrest'].'CoelSyndication/';
$formats = array('atom', 'rss2', 'rss1');
$flux = array();
foreach ($formats as $format) {
$url = $url_base.$nom.'/'.$format;
$flux[$format] = $url;
}
$this->flux[$nom] = array('titre' => $titre, 'description' => $description, 'urls' => $flux);
}
private function chargerListeDesFlux() {
$this->setFlux('projet', 'Flux de syndication des projets',
'Ce flux fournit des informations sur les mises à jour des projets saisis dans COEL.');
$this->setFlux('structure','Flux de syndication des institutions',
'Ce flux fournit des informations sur les mises à jour des institutions saisies dans COEL.');
$this->setFlux('collection', 'Flux de syndication des Collections',
'Ce flux fournit des informations sur les mises à jour des collections saisies dans COEL.');
$this->setFlux('personne', 'Flux de syndication des personnes',
'Ce flux fournit des informations sur les mises à jour des personnes saisies dans COEL.');
$this->setFlux('publication', 'Flux de syndication des publications',
'Ce flux fournit des informations sur les mises à jour des publications saisies dans COEL.');
$this->setFlux('commentaire', 'Flux de syndication des notes',
'Ce flux fournit des informations sur les mises à jour des notes saisies dans COEL.');
}
private function getServiceListeDesFlux() {
return $this->flux;
}
private function getServiceProjet() {
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, '.
' h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'prj' AS guid_type, ".
' cp_fmt_nom_complet AS modifier_par '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne ON (h1.cmhl_ce_modifier_par = cp_id_personne) '.
'WHERE h1.cmhl_ce_table = 115 %s '.
'GROUP BY h1.cmhl_cle_ligne, h1.cmhl_date_modification, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
// Création du contenu
$contenu = $this->executerService('cpr_nom', $elements);
return $contenu;
}
private function getServiceStructure() {
$elements = array();
$elements = array_merge($elements, $this->getHistoriqueTableStructure(120));
$elements = array_merge($elements, $this->getHistoriqueTableStructure(122));
$elements = array_merge($elements, $this->getHistoriqueTableStructure(123));
$elements = array_merge($elements, $this->getHistoriqueStructureAPersonne());
krsort($elements);
$elements = array_slice($elements, 0, ($this->limit/2));
 
// Création du contenu
$contenu = $this->executerService('cs_nom', $elements);
return $contenu;
}
private function getHistoriqueTableStructure($table_id) {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'str' AS guid_type, ".
(($table_id != 120) ? ' CONCAT(IF (h1.cmhl_ce_table = 122, "Conservation", "Valorisation"), " - ", cs_nom) AS titre, ' : '').
' cp_fmt_nom_complet AS modifier_par '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne ON (h1.cmhl_ce_modifier_par = cp_id_personne) '.
(($table_id != 120) ? ' LEFT JOIN coel_structure ON (cs_id_structure = h1.cmhl_cle_ligne) ' : '').
"WHERE h1.cmhl_ce_table = $table_id %s ".
(($table_id != 120) ? ' AND h1.cmhl_ce_etat != 3 ' : '').
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getHistoriqueStructureAPersonne() {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'csap' AS guid_type, ".
' p1.cp_fmt_nom_complet AS modifier_par, '.
' CONCAT(IF(h1.cmhl_ce_etat = 1, "Ajout", IF (h1.cmhl_ce_etat = 3, "Suppression", "Modification")), " d\'une personne liée à «", s1.cs_nom, "»") AS titre, '.
' CONCAT("Personne «", p2.cp_fmt_nom_complet, "» liée à «", s1.cs_nom, "» avec rôle «", lv1.cmlv_nom, "»") AS description '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne AS p1 ON (h1.cmhl_ce_modifier_par = p1.cp_id_personne) '.
' LEFT JOIN coel_personne AS p2 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 1) = p2.cp_id_personne) ".
' LEFT JOIN coel_structure AS s1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) = s1.cs_id_structure) ".
' LEFT JOIN coel_meta_liste_valeur AS lv1 '.
" ON (SUBSTRING_INDEX(SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 2), '-', -1) = lv1.cmlv_id_valeur) ".
'WHERE h1.cmhl_ce_table = 121 %s '.
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
 
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getServiceCollection() {
$elements = array();
$elements = array_merge($elements, $this->getHistoriqueTableCollection(101));
$elements = array_merge($elements, $this->getHistoriqueTableCollection(106));
$elements = array_merge($elements, $this->getHistoriqueCollectionAPersonne());
$elements = array_merge($elements, $this->getHistoriqueCollectionAPublication());
$elements = array_merge($elements, $this->getHistoriqueCollectionACommentaire());
krsort($elements);
$elements = array_slice($elements, 0, ($this->limit/2));
//echo '<pre>'.print_r($elements, true).'</pre>';
// Création du contenu
$contenu = $this->executerService('cc_nom', $elements);
return $contenu;
}
private function getHistoriqueTableCollection($table_id) {
// Reque générale avec paramêtres
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'col' AS guid_type, ".
(($table_id == 106) ? ' CONCAT("Botanique", " - ", cc_nom) AS titre, ' : '').
' cp_fmt_nom_complet AS modifier_par '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne ON (h1.cmhl_ce_modifier_par = cp_id_personne) '.
(($table_id == 106) ? ' LEFT JOIN coel_collection ON (cc_id_collection = h1.cmhl_cle_ligne) ' : '').
"WHERE h1.cmhl_ce_table = $table_id %s ".
(($table_id == 106) ? ' AND h1.cmhl_ce_etat != 3 ' : '').
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getHistoriqueCollectionAPersonne() {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' p1.cp_fmt_nom_complet AS modifier_par, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'ccap' AS guid_type, ".
' CONCAT(IF(h1.cmhl_ce_etat = 1, "Ajout", IF (h1.cmhl_ce_etat = 3, "Suppression", "Modification")), " d\'une personne liée à «", c1.cc_nom, "»") AS titre, '.
' CONCAT("Personne «", p2.cp_fmt_nom_complet, "» liée à «", c1.cc_nom, "» avec rôle «", lv1.cmlv_nom, "»") AS description '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne AS p1 ON (h1.cmhl_ce_modifier_par = p1.cp_id_personne) '.
' LEFT JOIN coel_personne AS p2 '.
" ON (SUBSTRING_INDEX(SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 2), '-', -1) = p2.cp_id_personne) ".
' LEFT JOIN coel_collection AS c1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 1) = c1.cc_id_collection) ".
' LEFT JOIN coel_meta_liste_valeur AS lv1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) = lv1.cmlv_id_valeur) ".
'WHERE h1.cmhl_ce_table = 103 %s '.
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getHistoriqueCollectionAPublication() {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' p1.cp_fmt_nom_complet AS modifier_par, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'ccapu' AS guid_type, ".
' CONCAT(IF(h1.cmhl_ce_etat = 1, "Ajout", IF (h1.cmhl_ce_etat = 3, "Suppression", "Modification")), " d\'une publication liée à «", c1.cc_nom, "»") AS titre, '.
' CONCAT("Publication «", p2.cpu_fmt_nom_complet, "» liée à «", c1.cc_nom, "»") AS description '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne AS p1 ON (h1.cmhl_ce_modifier_par = p1.cp_id_personne) '.
' LEFT JOIN coel_publication AS p2 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) = p2.cpu_id_publication) ".
' LEFT JOIN coel_collection AS c1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 1) = c1.cc_id_collection) ".
'WHERE h1.cmhl_ce_table = 104 %s '.
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getHistoriqueCollectionACommentaire() {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' p1.cp_fmt_nom_complet AS modifier_par, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'ccacm' AS guid_type, ".
' CONCAT(IF(h1.cmhl_ce_etat = 1, "Ajout", IF (h1.cmhl_ce_etat = 3, "Suppression", "Modification")), " d\'un commentaire lié à «", c1.cc_nom, "»") AS titre, '.
' CONCAT("Commentaire «", c.ccm_titre, "» liée à «", c1.cc_nom, "»") AS description '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne AS p1 ON (h1.cmhl_ce_modifier_par = p1.cp_id_personne) '.
' LEFT JOIN coel_commentaire AS c '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) = c.ccm_id_commentaire) ".
' LEFT JOIN coel_collection AS c1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 1) = c1.cc_id_collection) ".
'WHERE h1.cmhl_ce_table = 102 %s '.
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getServicePersonne() {
$elements = array();
$elements = array_merge($elements, $this->getHistoriqueTable(113, 'per'));
$elements = array_merge($elements, $this->getHistoriquePublicationAPersonne());
krsort($elements);
$elements = array_slice($elements, 0, ($this->limit/2));
//echo '<pre>'.print_r($elements, true).'</pre>';
// Création du contenu
$contenu = $this->executerService('cp_fmt_nom_complet', $elements);
return $contenu;
}
private function getHistoriquePublicationAPersonne() {
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' p1.cp_fmt_nom_complet AS modifier_par, '.
' h1.cmhl_cle_ligne AS guid, '.
" 'cpap' AS guid_type, ".
' CONCAT(IF(h1.cmhl_ce_etat = 1, "Ajout", IF (h1.cmhl_ce_etat = 3, "Suppression", "Modification")), " d\'une publication liée à «", p2.cp_fmt_nom_complet, "»") AS titre, '.
' CONCAT("Publication «", pu.cpu_fmt_nom_complet, "» liée à «", p2.cp_fmt_nom_complet, "» avec rôle «", lv1.cmlv_nom, "»") AS description '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne AS p1 ON (h1.cmhl_ce_modifier_par = p1.cp_id_personne) '.
' LEFT JOIN coel_publication AS pu '.
" ON (SUBSTRING_INDEX(SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 2), '-', -1) = pu.cpu_id_publication) ".
' LEFT JOIN coel_personne AS p2 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', 1) = p2.cp_id_personne) ".
' LEFT JOIN coel_meta_liste_valeur AS lv1 '.
" ON (SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) = lv1.cmlv_id_valeur) ".
'WHERE h1.cmhl_ce_table = 119 '.
' %s '.
" AND SUBSTRING_INDEX(h1.cmhl_cle_ligne, '-', -1) IN (2361,2362,2363) ".
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function getServicePublication() {
$elements = array();
$elements = $this->getHistoriqueTable(118, 'pub');
krsort($elements);
$elements = array_slice($elements, 0, ($this->limit/2));
//echo '<pre>'.print_r($elements, true).'</pre>';
// Création du contenu
$contenu = $this->executerService('cpu_fmt_nom_complet', $elements);
return $contenu;
}
private function getServiceCommentaire() {
$elements = array();
$elements = $this->getHistoriqueTable(107, 'com');
krsort($elements);
$elements = array_slice($elements, 0, ($this->limit/2));
//echo '<pre>'.print_r($elements, true).'</pre>';
// Création du contenu
$contenu = $this->executerService('ccm_titre', $elements);
return $contenu;
}
private function getHistoriqueTable($table_id, $guid_type) {
// Reque générale avec paramêtres
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' '.
' h1.cmhl_id_historique_ligne, h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_enregistrement, '.
' h1.cmhl_date_modification, h1.cmhl_ce_etat, h1.cmhl_ip, '.
' h1.cmhl_cle_ligne AS guid, '.
" '$guid_type' AS guid_type, ".
' cp_fmt_nom_complet AS modifier_par '.
'FROM coel_meta_historique_ligne AS h1 '.
' LEFT JOIN coel_meta_historique_ligne AS h2 '.
' ON (h1.cmhl_ce_table = h2.cmhl_ce_table '.
' AND h1.cmhl_cle_ligne = h2.cmhl_cle_ligne '.
' AND h1.cmhl_date_modification <= h2.cmhl_date_modification ) '.
' LEFT JOIN coel_personne ON (h1.cmhl_ce_modifier_par = cp_id_personne) '.
"WHERE h1.cmhl_ce_table = $table_id %s ".
'GROUP BY h1.cmhl_ce_table, h1.cmhl_cle_ligne, h1.cmhl_date_modification '.
'HAVING COUNT(*) = %s '.
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'h1.cmhl_date_modification DESC').' '.
"LIMIT $this->start,$this->limit ";
$elements = $this->executerRequeteHistorique($requete);
return $elements;
}
private function executerRequete($requete) {
try {
$infos = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($infos === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $infos;
}
private function fusionnerEnregistrements($infos) {
// Fusion des lignes
$elements = array();
foreach ($infos as $info) {
$id = $info['cmhl_ce_table'].'|'.$info['cmhl_cle_ligne'];
if (!isset($elements[$id])) {
$elements[$id] = $info;
} else {
if ($elements[$id]['cmhl_date_modification'] < $info['cmhl_date_modification']) {
$elements[$id] = $this->traiterInfosPrecedentes($info, $elements[$id]);
} else {
$elements[$id] = $this->traiterInfosPrecedentes($elements[$id], $info);
}
}
}
// Nettoyage et utilisation de la date pour pouvoir trier le tableau
$sortie = array();
foreach ($elements as $id => $element) {
$element = $this->nettoyerNomChamps($element);
$id_avec_date = $element['cmhl_date_modification'].'|'.$id;
$sortie[$id_avec_date] = $element;
}
return $sortie;
}
private function executerRequeteHistorique($requete) {
$elements = array();
// Récupération des 1er éléments
$requete_elements_1er = sprintf($requete, '', '1');
$infos_elements_1er = $this->executerRequete($requete_elements_1er);
// Construction de la requête pour récupérer les second éléments
$elements_1er_cle_ligne = array();
foreach ($infos_elements_1er as $info) {
$elements_1er_cle_ligne[] = $info['cmhl_cle_ligne'];
}
$chaine_1er_elements = 'AND h1.cmhl_cle_ligne IN ('.implode(',', $elements_1er_cle_ligne).') ';
$requete_elements_2nd = sprintf($requete, $chaine_1er_elements, '2');
// Récupération des 2nd éléments
$infos_elements_2nd = $this->executerRequete($requete_elements_2nd);
// Fusion des 1er et 2nd éléments
$infos = array_merge($infos_elements_1er, $infos_elements_2nd);
$elements = $this->fusionnerEnregistrements($infos);
return $elements;
}
private function executerService($champ_titre, $elements) {
// Prétraitement des données
$donnees = $this->construireDonneesCommunesAuFlux($elements);
foreach ($elements as $element) {
$xml = $this->getXmlHisto($element);
$enrg = $this->getTableauDepuisXmlHisto($xml);
$diff = $this->getDiffInfos($element);
$diff['differences'] = $this->getDiff($element);
$diff_html = (!is_null($diff['differences'])) ? Coel::traiterSquelettePhp($this->squelette_diff, $diff) : '';
$item = $this->construireDonneesCommunesAuxItems($element);
$item['titre'] = $this->creerTitre($champ_titre, $element, $enrg);
$item['guid'] = sprintf($this->config['coel']['guid'], 'coel', $element['guid_type'].$element['guid']);
$item['lien'] = $this->config['coel']['urlBaseCoel'].'#'.urlencode($item['guid']);
$item['description'] = '<p>'.$this->getMessageModif($item).'</p>';
$item['description'] .= $this->creerDescription($element, $enrg);
$item['description'] .= $diff_html;
$item['description'] = $this->nettoyerTexte($item['description']);
$item['description_encodee'] = htmlspecialchars($item['description']);
$donnees['items'][] = $item;
}
// Création du contenu à partir d'un template PHP
$contenu = Coel::traiterSquelettePhp($this->squelette, $donnees);
return $contenu;
}
private function creerTitre($champ, $element, $enrg) {
$titre = '';
if (isset($element['titre'])) {
$titre = $element['titre'];
} else if (isset($element[$champ])) {
$titre = $element[$champ];
} else if (isset($enrg[$champ])) {
$titre = $enrg[$champ];
}
$titre = $this->nettoyerTexte($titre);
return $titre;
}
private function creerDescription($element, $enrg) {
$description = '';
if (isset($element['description'])) {
$description = $element['description'];
}
return $description;
}
private function nettoyerNomChamps($infos) {
$sortie = array();
foreach ($infos as $champ => $valeur) {
if (preg_match('/^__(.+)$/', $champ, $match)) {
$sortie[$match[1]] = $valeur;
} else {
$sortie[$champ] = $valeur;
}
}
return $sortie;
}
private function traiterInfosPrecedentes($infos_courantes, $infos_precedentes) {
$infos_precedentes_traitees = array();
foreach ($infos_precedentes as $champ => $valeur) {
if ($champ == 'cmhl_date_modification') {
$infos_precedentes_traitees['date_prec'] = $valeur;
} else if ($champ == 'cmhl_enregistrement') {
$infos_precedentes_traitees['enrg_prec'] = $valeur;
} else if (preg_match('/^__(.+)$/', $champ, $match)) {
$infos_precedentes_traitees[$match[1].'_prec'] = $valeur;
}
}
$sortie = array_merge($infos_courantes, $infos_precedentes_traitees);
return $sortie;
}
private function nettoyerTexte($txt) {
$txt = preg_replace('/&(?!amp;)/i', '&amp;', $txt, -1);
return $txt;
}
private function getMessageModif($item) {
$message = $item['etat'].' le '.$item['date_maj_simple'].' par '.$item['modifier_par'].' depuis l\'IP '.$item['ip'];
return $message;
}
private function construireDonneesCommunesAuxItems($info) {
$item = array();
$date_modification_timestamp = strtotime($info['cmhl_date_modification']);
$item['date_maj_simple'] = strftime('%A %d %B %Y à %H:%M', $date_modification_timestamp);
$item['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$item['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$item['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$item['guid'] = $info['cmhl_id_historique_ligne'];
$item['cle'] = $info['cmhl_cle_ligne'];
$item['ip'] = $info['cmhl_ip'];
$item['modifier_par'] = $info['modifier_par'];
$item['etat'] = isset($info['cmhl_ce_etat']) ? $this->getTexteEtat($info['cmhl_ce_etat']) : '';
return $item;
}
private function getXmlHisto($info) {
$xml = '';
if ($info['cmhl_ce_etat'] == '3') {
$xml = $info['enrg_prec'];
} else {
$xml = $info['cmhl_enregistrement'];
}
return $xml;
}
private function getDiff($info) {
$diff = null;
if ($info['cmhl_ce_etat'] == '1') {
$nouveau = $this->getTableauDepuisXmlHisto($info['cmhl_enregistrement']);
foreach ($nouveau as $cle => $valeur) {
$diff[$cle] = array('type' => 'A', 'type_txt' => 'Ajout', 'nouveau' => $valeur, 'ancien' => ' ');
}
} else if ($info['cmhl_ce_etat'] == '2') {
$nouveau = $this->getTableauDepuisXmlHisto($info['cmhl_enregistrement']);
$ancien = $this->getTableauDepuisXmlHisto($info['enrg_prec']);
foreach ($nouveau as $cle => $valeur) {
if (!isset($ancien[$cle])) {
$diff[$cle] = array('type' => 'A', 'type_txt' => 'Ajout', 'nouveau' => $valeur, 'ancien' => ' ');
} else if (isset($ancien[$cle]) && $ancien[$cle] != $valeur) {
$diff[$cle] = array('type' => 'M', 'type_txt' => 'Modification', 'nouveau' => $valeur, 'ancien' => $ancien[$cle]);
}
}
foreach ($ancien as $cle => $valeur) {
if (!isset($nouveau[$cle])) {
$diff[$cle] = array('type' => 'S', 'type_txt' => 'Suppression', 'nouveau' => ' ', 'ancien' => $valeur);
}
}
}
return $diff;
}
private function getDiffInfos($info) {
$diff = null;
$format = '%d/%m/%Y à %H:%M:%S';
if ($info['cmhl_ce_etat'] == '1') {
$diff['date_nouvelle'] = strftime($format, strtotime($info['cmhl_date_modification']));
$diff['etat'] = 'A';
} else if ($info['cmhl_ce_etat'] == '2') {
$diff['date_nouvelle'] = strftime($format, strtotime($info['cmhl_date_modification']));
$diff['date_ancienne'] = strftime($format, strtotime($info['date_prec']));
$diff['etat'] = 'M';
} else if ($info['cmhl_ce_etat'] == '3') {
$diff['etat'] = 'S';
}
return $diff;
}
private function getTexteEtat($code) {
$etat = '';
switch ($code) {
case '1' :
$etat = 'Ajouté';
break;
case '2' :
$etat = 'Modifié';
break;
case '3' :
$etat = 'Supprimé';
break;
default :
$etat = '!Problème!';
$e = "Le champ cmhl_ce_etat possède une valeur innatendue : $code";
$this->messages[] = $e;
}
return $etat;
}
private function construireDonneesCommunesAuFlux($infos) {
$donnees = $this->getFlux($this->service);
$donnees['guid'] = $this->getUrlServiceBase();
$donnees['lien_service'] = $this->creerUrlService();
$donnees['lien_coel'] = $this->config['coel']['urlBaseCoel'];
$donnees['editeur'] = $this->config['coel']['editeur'];
$derniere_info_en_date = reset($infos);
$date_modification_timestamp = strtotime($derniere_info_en_date['cmhl_date_modification']);
$donnees['date_maj_RSS'] = date(DATE_RSS, $date_modification_timestamp);
$donnees['date_maj_ATOM'] = date(DATE_ATOM, $date_modification_timestamp);
$donnees['date_maj_W3C'] = date(DATE_W3C, $date_modification_timestamp);
$donnees['annee_courante'] = date('Y');
$donnees['generateur'] = 'COEL - Jrest';
preg_match('/([0-9]+)/', '$Revision: 381 $', $match);
$donnees['generateur_version'] = $match[1];
return $donnees;
}
private function creerUrlService() {
$url_service = $this->getUrlServiceBase();
if (isset($this->start) || isset($this->limit)) {
$arguments = array();
if (isset($this->start) && isset($_GET['start'])) {
$arguments[] = 'start='.$this->start;
}
if (isset($this->limit) && isset($_GET['limit'])) {
$arguments[] = 'limit='.($this->limit/2);
}
if (count($arguments) > 0) {
$url_service .= '?'.implode('&', $arguments);
}
}
return $url_service;
}
}
/trunk/jrest/services/CoelPublicationAPersonne.php
New file
0,0 → 1,287
<?php
/**
* Service fournissant la liste des relations "publication à personne".
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* PHP Version 5
*
* @category PHP
* @package jrest_li
* @author aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version SVN: <svn_id>
* @link /doc/jrest/
*/
class CoelPublicationAPersonne extends Coel {
const ROLE_AUTEUR = 2360;
/** Contient les infos sur les tables gérées par ce service.
* Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
protected $tables = array( 119 => array( 'nom' => 'coel_publication_a_personne',
'prefixe' => 'cpuap',
'id' => array('cpuap_id_personne', 'cpuap_id_publication', 'cpuap_id_role')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_publication', 'id_personne', 'id_role'), $param, false);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
' cpu.*, cpuap.*, cp_id_personne, cp_ce_projet, cp_prenom, cp_nom, cp_fmt_nom_complet, cp_code_postal, cp_truk_courriel, cp_ville '.
'FROM coel_publication_a_personne AS cpuap '.
' LEFT JOIN coel_meta_historique_ligne ON (cpuap_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_personne AS cp ON (cpuap_id_personne = cp_id_personne) '.
' LEFT JOIN coel_publication AS cpu ON (cpuap_id_publication = cpu_id_publication) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_personne']) ? "AND cpuap_id_personne IN ({$p['id_personne']}) " : '').
(isset($p['id_publication']) ? "AND cpuap_id_publication = '{$p['id_publication']}' " : '').
(isset($p['id_role']) ? "AND cpuap_id_role IN ({$p['id_role']}) " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cpuap_ce_meta DESC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
// Récupération des résultats
try {
$donnees = (count($p) == 3) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête n'a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['publicationsAPersonne'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
// Envoie sur la sortie standard
$this->envoyer($info);
}
 
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
$auteurs = $role = $ordre_des_auteurs = $publications = array();
// Traitement spécial pour ajouter plusieurs personnes liées à une publication à la fois...
if (isset($params['cpuap_id_auteur'])) {
$auteurs = explode(',', $params['cpuap_id_auteur']);
unset($params['cpuap_id_auteur']);
}
if (isset($params['cpuap_id_role'])) {
$role = explode(',', $params['cpuap_id_role']);
}
if (isset($params['cpuap_ordre'])) {
$ordre_des_auteurs = explode(',', $params['cpuap_ordre']);
unset($params['cpuap_ordre']);
}
// Traitement spécial pour ajouter plusieurs publications liées à une personne à la fois...
if (isset($params['cpuap_id_publication'])) {
$publications = explode(',', $params['cpuap_id_publication']);
if (count($publications) > 1) {
unset($params['cpuap_id_publication']);
}
}
if (count($auteurs) != 0 || count($publications) != 0) {
// Formulaire Publication : nous lions des auteurs à une publication
// Cas où il y a une seule publication et un ou plusieurs auteurs ; c'est donc une liaison d'une publi a plusieurs personne avec le role "auteur"
if (count($auteurs) >= 1 && count($publications) == 1 && (count($role) == 1 && $role[0] == self::ROLE_AUTEUR)) {
$compteur = 0;
foreach ($auteurs as $params['cpuap_id_personne']) {
$params['cpuap_ordre'] = $ordre_des_auteurs[$compteur++];
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
try {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
}
}
}
// Formulaire Personne : nous lions des publications à une personne
// Cas où il y a plusieurs publications ; c'est donc une liaison de plusieurs publis a une personne avec n roles
else if (count($auteurs) == 1 && count($publications) >= 1 && (count($role) > 1 || (count($role) == 1 && $role[0] != self::ROLE_AUTEUR)) ) {
$params['cpuap_id_personne'] = $auteurs[0];
for ($i = 0; $i < count($publications); $i++ ) {
$params['cpuap_id_publication'] = $publications[$i];
$params['cpuap_id_role'] = $role[$i];
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
try {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
}
}
}
} else {
$this->messages[] = "Aucun identifiant d'auteur ou de publication fournis";
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
 
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) && !isset($uid[1]) && !isset($uid[2])) {
$this->messages[] = 'Aucun identifiant de publication, personne et role a été passé. Vous ne devriez pas avoir accès à ce service.';
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
$id_publication = $params['cpuap_id_publication'];
$auteurs = explode(',', $params['cpuap_id_auteur']);
$id_role = $params['cpuap_id_role'];
$ordre = explode(',', $params['cpuap_ordre']);
if (count($auteurs) != 0 && $params['cpuap_id_publication'] != '') {
$compteur = 0;
foreach ($auteurs as $auteur) {
$params = array('cpuap_id_publication' => $id_publication,
'cpuap_id_personne' => $auteur,
'cpuap_id_role' => $id_role,
'cpuap_ordre' => $ordre[$compteur++]);
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[119];
 
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(119, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
try {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
} else {
$this->messages[] = "Aucun identifiant d'auteur et de publication fournis";
}
} else {
$this->messages[] = "Il faut être identifié pour accéder à ce service";
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
 
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
 
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
 
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des identifiant à supprimer
$identifiants = array();
$identifiants_agreges = explode(',', rtrim($uid[1], ','));
foreach ($identifiants_agreges as $identifiant) {
$identifiants[] = explode('-', $identifiant);
}
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
try {
foreach ($identifiants as $id) {
if (count($id) == 1) { // Seulement des id de publication
// Suppression en une seule fois toutes les relations d'une publication
$params = array('cpuap_id_publication' => $id[0]);
} else if (count($id) == 3) { // Tous les id...
// Suppression d'une seule relation particulière
$params = array('cpuap_id_publication' => $id[0], 'cpuap_id_personne' => $id[1], 'cpuap_id_role' => $id[2]);
}
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[119];
 
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(119, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelCollectionAPublication.php
New file
0,0 → 1,184
<?php
/**
* Service fournissant la liste des relations "structure à personne".
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelCollectionAPublication extends Coel {
 
/** Contient les infos sur les tables gérées par ce service.
* Bien respecter l'ordre avec en premier les tables liées et en dernier la table établissant la relation. */
protected $tables = array( 104 => array( 'nom' => 'coel_collection_a_publication',
'prefixe' => 'ccapu',
'id' => array('ccapu_id_collection', 'ccapu_id_publication')));
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_collection'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT ' : 'SELECT ').
' ccapu.*, cpu.* '.
'FROM coel_collection_a_publication AS ccapu '.
' LEFT JOIN coel_meta_historique_ligne ON (ccapu_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_publication AS cpu ON (ccapu_id_publication = cpu_id_publication) '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_collection']) ? "AND ccapu_id_collection = {$p['id_collection']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'ccapu_ce_meta DESC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['collectionsAPublication'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
// Nous ne pouvons pas utiliser foreach car il travaille sur une copie du tableau or nous le modifions dynamiquement dans la boucle
reset($tables_a_modifier);
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
$this->messages[] = 'Il est nécessaire de fournir toutes les clés à ce service.';
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) && !isset($uid[1])) {
$this->messages[] = 'Aucun identifiant de collection a été passé. Vous ne devriez pas avoir accès à ce service.';
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
try {
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un ou plusieurs éléments
*/
public function deleteElement($uid) {
// NOTES : la suppression ne supprime pas les personnes mais seulements les relations
 
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de relations ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des identifiant à supprimer
$identifiants = array();
$identifiants_agreges = explode(',', rtrim($uid[1], ','));
foreach ($identifiants_agreges as $identifiant) {
$identifiants[] = explode('-', $identifiant);
}
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
try {
foreach ($identifiants as $id) {
if (count($id) == 1) { // Seulement des id de collection
$params = array('ccapu_id_collection' => $id[0]);
} else if (count($id) == 2) { // Tous les id...
$params = array('ccapu_id_collection' => $id[0], 'ccapu_id_publication' => $id[1]);
}
$tables_a_modifier = $this->recupererTablesAModifier($params);
$table = $tables_a_modifier[104];
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser(104, $cle, 'NULL', $id_utilisateur, Coel::ETAT_SUPPRIMER, $id_session);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
}
?>
/trunk/jrest/services/CoelRecherche.php
New file
0,0 → 1,244
<?php
/**
* Service fournissant des informations sur les collections et les structures répondant aux critères de recherche
* fournis en paramêtre.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelRecherche extends Coel {
 
/**
* Méthode principale appelée avec une requête de type GET.
* Elle sert d'aiguilleur pour appeller la méthode correspondant au type de recherche passé en paramêtre.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Nour recherchons le type de requête demandé
$type = $param[0];
$methode = 'getElement'.$type;
if (method_exists($this, $methode)) {
array_shift($param);
$info = $this->$methode($param);
} else {
$this->messages[] = "Le type de recherche demandé '$type' n'est pas disponible.";
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
* restrictions.
* Appelée avec les paramêtres d'url suivant :
* /CoelRecherche/ParDefaut/_
* ou les _ représentent dans l'ordre : mots
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParDefaut($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrl($param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cs_id_structure, cs_ville, cs_nom, '.
' cc_id_collection, cc_nom '.
$this->construireFromEtWhere($p).
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_ville ASC, cc_nom ASC').' '.
"LIMIT $this->start, $this->limit ";
$this->debug[] = $requete;
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
$info = $donnees;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
return $info;
}
/* Méthode pour récupérer une liste d'information sur les collections et/ou structures en fonction de mots et de
* restrictions.
* Appelée avec les paramêtres d'url suivant :
* /CoelRecherche/ParDefaut/_
* ou les _ représentent dans l'ordre : mots
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementNombre($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->pretraiterParametresUrl($param);
 
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' COUNT(cc_id_collection) AS nbre '.
$this->construireFromEtWhere($p).
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cs_ville ASC, cc_nom ASC').' ';
 
// Récupération des résultats
try {
$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
$info = $donnees['nbre'];
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
return $info;
}
private function pretraiterParametresUrl($param) {
// Tableau des paramêtres qui peuvent être passés dans l'url
$params_passes = array('mots' => 'str',
'sci' => 'bool',
'bot' => 'int',
'zg' => 'str',
'p' => 'str',
'pr' => 'int',
'str-d' => 'defaut');
$p = $this->traiterParametresUrl(array_keys($params_passes), $param, false);
foreach ($params_passes as $param_passe => $type) {
if (isset($p[$param_passe])) {
// Suppression des éventuels espaces en début et fin de chaine
$valeur = trim($p[$param_passe]);
// Type de paramêtre chaine
if ($type == 'str') {
// Suppression des slash
$valeur = stripslashes($valeur);
// Utilisation d'une recherche de chaîne exacte
if (preg_match('/^"(.*)"$/', $valeur, $match)) {
$valeur = '%'.$match[1].'%';
} else {
// Recherche de mots non liés
$mots = explode(' ', $valeur);
$valeur = '%'.implode ('%', $mots).'%';
}
// Mise en place des quotes pour l'intérogation dans la bdd
$valeur = $this->bdd->quote($valeur);
}
// Type de paramêtre booléen
if ($type == 'bool') {
if (preg_match('/^[0]$/', $valeur)) {
$valeur = false;
} else if (preg_match('/^[1]$/', $valeur)) {
$valeur = true;
} else {
$this->message[] = "Le paramêtre '$param_passe' attend une valeur de type 0 ou 1 et non '$valeur'.";
$valeur = null;
}
}
// Type de paramêtre entier
if ($type == 'int') {
if (!preg_match('/^(?:[0-9]+,\s*)*[0-9]+$/', $valeur)) {
$this->message[] = "Le paramêtre '$param_passe' attend une ou plusieurs valeurs de type entiers ".
"séparés par des virgules et non '$valeur'.";
$valeur = null;
}
}
$p[$param_passe] = $valeur;
}
}
return $p;
}
private function construireFromEtWhere($p) {
// Initialisation de variables
$from_et_where = '';
$from = 'FROM coel_collection '.
' LEFT JOIN coel_structure ON (cc_ce_structure = cs_id_structure) ';
$where = 'WHERE ';
// Construire from et where en fonction des paramêtres
if (isset($p['mots'])) {
$where .= 'AND ('.
" cc_nom LIKE {$p['mots']} ".
" OR cc_truk_nom_alternatif LIKE {$p['mots']} ".
" OR cc_truk_code LIKE {$p['mots']} ".
" OR cc_description LIKE {$p['mots']} ".
" OR cc_description_specialiste LIKE {$p['mots']} ".
" OR cc_historique LIKE {$p['mots']} ".
" OR cs_nom LIKE {$p['mots']} ".
" OR cs_adresse_01 LIKE {$p['mots']} ".
" OR cs_adresse_02 LIKE {$p['mots']} ".
" OR cs_ville LIKE {$p['mots']} ".
" OR cs_truk_identifiant_alternatif LIKE {$p['mots']} ".
') ';
}
$this->debug[] = $p;
if (isset($p['sci'])) {
if ($p['sci'] === true) {
$where .= 'AND csv_mark_acces_ss_motif = 1 ';
} else if ($p['sci'] === false) {
$where .= 'AND csv_mark_visite_avec_motif = 1 ';
}
}
if (isset($p['bot'])) {
$where .= "AND ccb_ce_truk_type IN ({$p['bot']}) ";
}
if (isset($p['zg'])) {
$where .= "AND cc_truk_couverture_lieu LIKE {$p['zg']} ";
}
if (isset($p['p'])) {
$where .= "AND cp_fmt_nom_complet LIKE {$p['p']} ";
}
if (isset($p['pr'])) {
$where .= "AND ccap_id_role IN ({$p['pr']}) ";
}
if (isset($p['str-d'])) {
$where .= 'AND cs_ce_truk_pays = 2654 '.
"AND cs_code_postal LIKE '{$p['str-d']}%' ";
}
$where = str_replace('WHERE AND', 'WHERE', $where);
// Gestion du from en fonction des paramêtres
if (isset($p['sci'])) {
$from .= ' LEFT JOIN coel_structure_valorisation ON (cs_id_structure = csv_id_structure) ';
}
if (isset($p['bot'])) {
$from .= ' LEFT JOIN coel_collection_botanique ON (cc_id_collection = ccb_id_collection) ';
}
if (isset($p['p']) || isset($p['pr'])) {
$from .= ' LEFT JOIN coel_collection_a_personne ON (cc_id_collection = ccap_id_collection) ';
}
if (isset($p['p'])) {
$from .= ' LEFT JOIN coel_personne ON (ccap_id_personne = cp_id_personne) ';
}
// Retour du From et Where associé
$this->debug[] = count($p);
if (count($p) == 0) {
$from_et_where = $from;
} else {
$from_et_where = $from.$where;
}
return $from_et_where;
}
}
?>
/trunk/jrest/services/CoelPersonne.php
New file
0,0 → 1,260
<?php
/**
* Service fournissant la liste des personnes et leurs informations
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Grégoire duché <gregoire@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelPersonne extends Coel {
 
protected $tables = array( 113 => array('nom' => 'coel_personne',
'prefixe' => 'cp',
'id' => array('cp_id_personne')));
/**
* Méthode appelée avec une requête de type GET.
*
* Liste des paramètres :
* /Personne_Id/Projet_id/Nom_Complet/
* Attention : pour avoir toutes les personnes, il faut éxécuter : CoelPersonneListe
* Pour avoir toutes les personnes d'un projet, il faut éxécuter : CoelPersonneListe/* /projet_id
* Pour avoir toutes les personnes d'un projet, dont le nom complet comment par NomComplet il faut éxécuter : CoelPersonneListe/* /projet_id/NomComplet
*/
function getElement($param = array()) {
// Initialisation de variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_personne', 'ce_projet', 'nom'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' * '.
'FROM coel_personne '.
((count($p) != 0) ? 'WHERE ' : '').
(isset($p['id_personne']) ? "AND cp_id_personne = {$p['id_personne']} " : '').
(isset($p['ce_projet']) ? "AND cp_ce_projet = {$p['ce_projet']} " : '').
(isset($p['nom']) ? "AND cp_nom LIKE {$p['nom']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'cp_fmt_nom_complet ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
// Exécution de la requêtre SQL et test d'éventuelles erreurs
try {
$donnees = $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['personnes'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
$id_personne = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_personne = $this->ajouter($table);
if ($id_personne !== false) {
$table['champs_valeurs_id']['cp_id_personne'] = $id_personne;
$table['champs_valeurs_brut']['cp_id_personne'] = $id_personne;
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
$this->envoyer((string) $id_personne);
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
//Mise à jour de la personne
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
$id_personne = $uid[0];
if (($id_personne == null)||(trim($id_personne) == "")) {
$this->messages[] = 'Aucun identifiant de personne n\'a été fourni';
} else {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
} catch (PDOException $e) {
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant d'utilisateur ou de personne manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
foreach ($identifiants as $id_personne) {
try {
// Vérification de la liaison avec d'autres données et génération des messages d'erreur
if ($this->verifierPresencePersonne($id_personne) === false) {
$params = array('cp_id_personne' => $id_personne);
$tables_a_modifier = $this->recupererTablesAModifier($params);
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
} else {
$this->messages[] = "Aucun enregistrement correspondant dans la base de données.";
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
private function verifierPresencePersonne($id_personne) {
$presence = false;
if ($presence = $this->verifierPresenceDansStructure($id_personne)) {
$this->messages[] = 'Cette personne ne peut être supprimée car elle est liée à une structure';
} else if ($presence = $this->verifierPresenceDansCollection($id_personne)) {
$this->messages[] = 'Cette personne ne peut être supprimée car elle est liée à une collection';
} else if ($presence = $this->verifierPresenceDansPublication($id_personne)) {
$this->messages[] = 'Cette personne ne peut être supprimée car elle est liée à une publication';
} else if ($presence = $this->verifierPresenceDansRelation01($id_personne)) {
$this->messages[] = "Cette personne ne peut être supprimée car elle est le sujet d'une relation";
} else if ($presence = $this->verifierPresenceDansRelation02($id_personne)) {
$this->messages[] = "Cette personne ne peut être supprimée car elle est l'objet d'une relation";
}
return $presence;
}
private function verifierPresenceDansStructure($id_personne) {
$requete = 'SELECT COUNT(csap_id_personne) AS nbre '.
'FROM coel_structure_a_personne '.
"WHERE csap_id_personne = '$id_personne' ".
'GROUP BY csap_id_personne ';
return $this->contenirDonnees($requete);
}
private function verifierPresenceDansCollection($id_personne) {
$requete = 'SELECT COUNT(ccap_id_personne) AS nbre '.
'FROM coel_collection_a_personne '.
"WHERE ccap_id_personne = '$id_personne' ".
'GROUP BY ccap_id_personne ';
return $this->contenirDonnees($requete);
}
private function verifierPresenceDansPublication($id_personne) {
$requete = 'SELECT COUNT(cpuap_id_personne) AS nbre '.
'FROM coel_publication_a_personne '.
"WHERE cpuap_id_personne = '$id_personne' ".
'GROUP BY cpuap_id_personne ';
return $this->contenirDonnees($requete);
}
private function verifierPresenceDansRelation01($id_personne) {
$requete = 'SELECT COUNT(cpar_id_personne_01) AS nbre '.
'FROM coel_personne_a_relation '.
"WHERE cpar_id_personne_01 = '$id_personne' ".
'GROUP BY cpar_id_personne_01 ';
return $this->contenirDonnees($requete);
}
private function verifierPresenceDansRelation02($id_personne) {
$requete = 'SELECT COUNT(cpar_id_personne_02) AS nbre '.
'FROM coel_personne_a_relation '.
"WHERE cpar_id_personne_02 = '$id_personne' ".
'GROUP BY cpar_id_personne_02 ';
return $this->contenirDonnees($requete);
}
private function contenirDonnees($requete) {
$nbre = $this->bdd->query($requete)->fetchColumn();
$presence = false;
if ($nbre != 0) {
$presence = true;
}
return $presence;
}
}
?>
/trunk/jrest/services/CoelCollection.php
New file
0,0 → 1,284
<?php
/**
* Service fournissant la liste des collections et leurs informations.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2009
*/
class CoelCollection extends Coel {
 
protected $tables = array( 101 => array(
'nom' => 'coel_collection',
'prefixe' => 'cc',
'id' => array('cc_id_collection')),
106 => array(
'nom' => 'coel_collection_botanique',
'prefixe' => 'ccb',
'id' => array('ccb_id_collection')));
 
/**
* Méthode principale appelée avec une requête de type GET.
*/
public function getElement($param = array()) {
// Initialisation des variables
$info = array();
// Nour recherchons le type de requête demandé
$type = $param[0];
if ($type == '*' || is_numeric($type)) {
$info = $this->getElementParDefaut($param);
} else {
$methode = 'getElement'.$type;
if (method_exists($this, $methode)) {
array_shift($param);
$info = $this->$methode($param);
} else {
$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
}
}
// Envoie sur la sortie standard
$this->envoyer($info);
}
/**
* Méthode par défaut pour garder la compatibilité avec Coel.
* Appelée avec les paramêtres d'url suivant :
* /CoelCollection/_/_/_
* ou les _ représentent dans l'ordre : id_projet, id_collection ou nom
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParDefaut($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_projet', 'id_collection', 'nom'), $param);
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' c.*, cb.*, '.
' cmhl_date_modification, cmhl_notes, cmhl_source, cmhl_ce_modifier_par, cmhl_ce_etat, cmhl_ip, '.
' ccm.cc_nom AS _collection_mere_nom_, '.
' cs_nom AS _structure_nom_, cs_ville AS _structure_ville_ '.
'FROM coel_collection AS c'.
' LEFT JOIN coel_meta_historique_ligne AS cmhl ON (c.cc_ce_meta = cmhl_id_historique_ligne) '.
' LEFT JOIN coel_structure ON (c.cc_ce_structure = cs_id_structure) '.
' LEFT JOIN coel_collection AS ccm ON (c.cc_ce_mere = ccm.cc_id_collection) '.
' LEFT JOIN coel_collection_botanique AS cb ON (c.cc_id_collection = ccb_id_collection) '.
((count($p) != 0) ? 'WHERE ' : '').
((isset($p['id_projet'])) ? "AND c.cc_ce_projet = {$p['id_projet']} " : '').
((isset($p['id_collection'])) ? "AND c.cc_id_collection = {$p['id_collection']} " : '').
((isset($p['nom'])) ? "AND c.cc_nom LIKE {$p['nom']} " : '').
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'c.cc_nom ASC').' ';
$requete = str_replace('WHERE AND', 'WHERE', $requete);
$requeteCount = $requete;
$requete .= "LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = (isset($p['id_collection'])) ? $this->bdd->query($requete)->fetch(PDO::FETCH_OBJ) : $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
}
 
$nbElements = $this->bdd->query($requeteCount)->rowCount();
$info['nbElements'] = $nbElements;
$info['collections'] = $donnees;
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
 
return $info;
}
/* Méthode pour récupérer une liste de collection en fonction d'un id structure.
* Appelée avec les paramêtres d'url suivant :
* /CoelCollection/ParIdStructure/_
* ou les _ représentent dans l'ordre : id_structure
* Si un des paramêtres est abscent, il prendre la valeur *
*/
public function getElementParIdStructure($param) {
// Initialisation des variables
$info = array();
// Pré traitement des paramêtres
$p = $this->traiterParametresUrl(array('id_structure'), $param);
if (!isset($p['id_structure'])) {
$this->messages[] = "Il est obligatoire d'indiquer un id de structure pour utiliser ce service.";
} else {
// Construction de la requête
$requete = (($this->distinct) ? 'SELECT DISTINCT' : 'SELECT').' cc_nom, cc_id_collection '.
'FROM coel_collection AS c '.
'WHERE '.
" c.cc_ce_structure = {$p['id_structure']} ".
'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'c.cc_nom ASC').' '.
"LIMIT $this->start, $this->limit ";
 
// Récupération des résultats
try {
// SPÉCIAL :
// Lorsqu'on cherche une seule structure avec un id passé en paramêtre, nous devons renvoyer un objet
$donnees = $this->bdd->query($requete)->fetchAll();
if ($donnees === false) {
$this->messages[] = "La requête a retourné aucun résultat.";
} else {
$info = $donnees;
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
}
}
return $info;
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
reset($tables_a_modifier);
$id_collection = null;
while (list($table_id, $table) = each($tables_a_modifier)) {
if (!is_null($table['champs'])) {
if (!$this->avoirCleComplete($table)) {
// Ajout des données à la table des données
$id_collection = $this->ajouter($table);
if ($id_collection !== false) {
$table['champs_valeurs_id']['cc_id_collection'] = $id_collection;
$table['champs_valeurs_brut']['cc_id_collection'] = $id_collection;
$tables_a_modifier[106]['champs_valeurs_id']['ccb_id_collection'] = $id_collection;
$tables_a_modifier[106]['champs_valeurs_brut']['ccb_id_collection'] = $id_collection;
$tables_a_modifier[106]['champs_valeurs_protege']['ccb_id_collection'] = $this->bdd->quote($id_collection);
// Historisation (Ajout des méta-données)
$etat = 1; // Ajout
$cle = $this->recupererCle($table);
$info = $this->creerXmlHisto($table['champs_valeurs_brut']);
$id_meta = $this->historiser($table_id, $cle, $info, $id_utilisateur, $etat, $id_session);
// Liaison de la table des données à ses méta-données
$champ_meta = "{$table['prefixe']}_ce_meta";
$table['champs_valeurs_protege'] = array($champ_meta => $id_meta);
$this->modifier($table);
}
} else {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
}
}
$this->ajouterGuid($params['cpr_abreviation'], $id_collection);
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
$this->envoyer($id_collection);
}
/**
* Méthode appelée pour mettre à jour un élément
*/
public function updateElement($uid, $params) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0])) {
$this->messages[] = "Identifiant de collection manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($params);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
try {
// Vérification des tables à vraiment mettre à jour en fonction des données passées.
$tables_a_modifier = $this->recupererTablesAModifier($params);
 
// Pour chaque table du module nous lançons si nécessaire l'historisation puis la mise à jour
foreach ($tables_a_modifier as $table_id => $table) {
$this->mettreAJourAvecCle($id_utilisateur, $id_session, $table_id, $table);
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
// Envoie sur la sortie standard
$this->envoyer();
}
/**
* Méthode appelée pour supprimer un élément
*/
public function deleteElement($uid) {
// Vérification de la présence des id passés par l'url
if (!isset($uid[0]) || !isset($uid[1])) {
$this->messages[] = "Identifiant de collection ou d'utilisateur manquant. Vous ne devriez pas avoir accès à ce service.";
} else {
// Identification de l'utilisateur
list($id_utilisateur, $id_session) = $this->getIdentification($uid[0]);
// Contrôle du non détournement de l'utilisateur
if ($this->etreAutorise($id_utilisateur)) {
// Récupération des id passés par l'url
$identifiants = explode(',', rtrim($uid[1], ','));
try {
if (count($identifiants) == 0) {
$this->messages[] = "Aucun enregistrement n'a été supprimé.";
} else {
foreach ($identifiants as $id_collection) {
// Vérification que la structure ne possède pas de collections liées
$params = array('cc_id_collection' => $id_collection, 'ccb_id_collection' => $id_collection);
$tables_a_modifier = $this->recupererTablesAModifier($params);
foreach ($tables_a_modifier as $table_id => $table) {
if ($this->avoirEnregistrement($table)) {
$resultat = $this->supprimer($table);
if ($resultat === true) {
// Historisation (Ajout des méta-données)
$cle = $this->recupererCle($table);
$this->historiser($table_id, $cle, 'NULL', $id_utilisateur, 3, $id_session);
}
}
}
}
}
} catch (PDOException $e) {
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
}
}
}
 
// Envoie sur la sortie standard
$this->envoyer();
}
private function ajouterGuid($abr_projet, $id_collection) {
if ($id_collection !== false) {
$table_guid = $this->tables[101];
$table_guid['champs_valeurs_id']['cc_id_collection'] = $id_collection;
$table_guid['champs_valeurs_protege']['cc_guid'] = $this->bdd->quote(sprintf($this->config['coel']['guid'], $abr_projet, 'coll'.$id_collection));
$this->modifier($table_guid);
}
}
}
?>
/trunk/jrest/.htaccess
New file
0,0 → 1,7
#AddHandler x-httpd-php5 .php
AddDefaultCharset UTF-8
 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ index.php/
/trunk/jrest/JRest.php
New file
0,0 → 1,302
<?php
// In : utf8 url_encoded (get et post)
// Out : utf8
 
// TODO : gerer les retours : dans ce controleur : code retour et envoi ...
class JRest {
 
/** Parsed configuration file */
private $config;
 
/** The HTTP request method used. */
private $method = 'GET';
 
/** The HTTP request data sent (if any). */
private $requestData = NULL;
 
/** Array of strings to convert into the HTTP response. */
private $output = array();
 
/** Nom resource. */
private $resource = NULL;
 
/** Identifiant unique resource. */
private $uid = NULL;
 
/**
* Constructor. Parses the configuration file "JRest.ini", grabs any request data sent, records the HTTP
* request method used and parses the request URL to find out the requested resource
* @param str iniFile Configuration file to use
*/
public function JRest($iniFile = 'jrest.ini.php') {
$this->config = parse_ini_file($iniFile, TRUE);
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && isset($_SERVER['QUERY_STRING'])) {
if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) {
$this->requestData = '';
$httpContent = fopen('php://input', 'r');
while ($data = fread($httpContent, 1024)) {
$this->requestData .= $data;
}
fclose($httpContent);
}
if (strlen($_SERVER['QUERY_STRING']) == 0) {
$len = strlen($_SERVER['REQUEST_URI']);
} else {
$len = -(strlen($_SERVER['QUERY_STRING']) + 1);
}
$urlString = substr($_SERVER['REQUEST_URI'], strlen($this->config['settings']['baseURL']), $len);
 
$urlParts = explode('/', $urlString);
 
if (isset($urlParts[0])) $this->resource = $urlParts[0];
if (count($urlParts) > 1 && $urlParts[1] != '') {
array_shift($urlParts);
foreach ($urlParts as $uid) {
if ($uid != '') {
$this->uid[] = urldecode($uid);
}
}
}
 
$this->method = $_SERVER['REQUEST_METHOD'];
} else {
trigger_error('I require the server variables REQUEST_URI, REQUEST_METHOD and QUERY_STRING to work.', E_USER_ERROR);
}
}
 
/**
* Execute the request.
*/
function exec() {
switch ($this->method) {
case 'GET':
$this->get();
break;
case 'POST':
$this->post();
break;
case 'DELETE':
$this->delete();
break;
case 'PUT':
$this->add();
break;
}
}
 
/**
* Execute a GET request. A GET request fetches a list of resource when no resource name is given, a list of element
* when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the
* database contents.
*/
private function get() {
if ($this->resource) {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if ($this->uid) { // get a resource element
if (method_exists($service, 'getElement')) {
$service->getElement($this->uid);
}
} elseif (method_exists($service, 'getRessource')) { // get all elements of a ressource
$service->getRessource();
}
}
}
} else { // get resources
// include set.jrest.php, instanticiation et appel
}
}
 
private function post() {
$pairs = array();
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST)
if ($this->requestData) {
$pairs = $this->parseRequestData();
}
 
// Ajout des informations concernant l'upload de fichier passées dans la variable $_FILE
if(isset($_FILES)) {
foreach ($_FILES as $v) {
$pairs[$v['name']] = $v;
}
 
// Ne pas effacer cette ligne ! Elle est indispensable pour les services du Carnet en ligne
// qui n'utilisent que le tableau pairs dans les posts
$pairs = array_merge($pairs, $_POST);
}
 
// gestion du contenu du post
if(isset($_POST))
{
// Safari ne sait pas envoyer des DELETE avec gwt...
// Nous utilisons le parametre "action" passé dans le POST qui doit contenir DELETE pour lancer la supression
if ($pairs['action'] == 'DELETE') {
$this->delete();
return;
}
 
if (count($pairs) != 0) {
if ($this->uid) { // get a resource element
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if (method_exists($service,'updateElement')) { // Update element
// TODO : a voir le retour ...
if ($service->updateElement($this->uid, $pairs)) {
$this->created();
}
}
}
}
} else { // get all elements of a ressource
$this->add($pairs);
}
} else {
$this->lengthRequired();
}
}
}
 
private function delete() {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if ($this->uid) { // get a resource element
if (method_exists($service, 'deleteElement')) { // Delete element
if ($service->deleteElement($this->uid)) {
$this->noContent();
}
}
}
}
}
}
 
private function add($pairs = null) {
if (is_null($pairs)) {
$pairs = array();
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST)
// FIXME : vérifier que l'on récupère bien les données passées par PUT
if ($this->requestData) {
$pairs = $this->parseRequestData();
}
}
 
if (count($pairs) != 0) {
$resource_file = 'services/'.ucfirst($this->resource).'.php';
$resource_class = ucfirst($this->resource);
if (file_exists($resource_file)) {
include_once $resource_file;
if (class_exists($resource_class)) {
$service = new $resource_class($this->config);
if (method_exists($service,'createElement')) { // Create a new element
if ($service->createElement($pairs)) {
$this->created();
}
}
}
}
} else {
$this->lengthRequired();
}
}
 
/**
* Parse the HTTP request data.
* @return str[] Array of name value pairs
*/
private function parseRequestData() {
$values = array();
$pairs = explode('&', $this->requestData);
foreach ($pairs as $pair) {
$parts = explode('=', $pair);
if (isset($parts[0]) && isset($parts[1])) {
$parts[1] = rtrim(urldecode($parts[1]));
$values[$parts[0]] = $parts[1];
}
}
return $values;
}
 
/**
* Send a HTTP 201 response header.
*/
private function created($url = FALSE) {
header('HTTP/1.0 201 Created');
if ($url) {
header('Location: '.$url);
}
}
 
/**
* Send a HTTP 204 response header.
*/
private function noContent() {
header('HTTP/1.0 204 No Content');
}
 
/**
* Send a HTTP 400 response header.
*/
private function badRequest() {
header('HTTP/1.0 400 Bad Request');
}
 
/**
* Send a HTTP 401 response header.
*/
private function unauthorized($realm = 'JRest') {
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
header('WWW-Authenticate: Basic realm="'.$realm.'"');
}
header('HTTP/1.0 401 Unauthorized');
}
 
/**
* Send a HTTP 404 response header.
*/
private function notFound() {
header('HTTP/1.0 404 Not Found');
}
 
/**
* Send a HTTP 405 response header.
*/
private function methodNotAllowed($allowed = 'GET, HEAD') {
header('HTTP/1.0 405 Method Not Allowed');
header('Allow: '.$allowed);
}
 
/**
* Send a HTTP 406 response header.
*/
private function notAcceptable() {
header('HTTP/1.0 406 Not Acceptable');
echo join(', ', array_keys($this->config['renderers']));
}
 
/**
* Send a HTTP 411 response header.
*/
private function lengthRequired() {
header('HTTP/1.0 411 Length Required');
}
 
/**
* Send a HTTP 500 response header.
*/
private function internalServerError() {
header('HTTP/1.0 500 Internal Server Error');
}
}
?>
/trunk/jrest/index.php
New file
0,0 → 1,28
<?php
require 'JRest.php';
 
/**
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code.
*
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code.
*
*@param string le nom de la classe appelée.
*@return void le fichier contenant la classe doit être inclu par la fonction.
*/
function __autoload($classe) {
if (class_exists($classe)) {
return null;
}
$chemins = array('', 'services/');
foreach ($chemins as $chemin) {
$chemin = $chemin.$classe.'.php';
if (file_exists($chemin)) {
require_once $chemin;
}
}
}
 
$jRest =& new JRest();
$jRest->exec();
?>