Subversion Repositories eFlore/Applications.eflore-consultation

Compare Revisions

Ignore whitespace Rev 1446 → Rev 1447

/trunk/widget/modules/chorodep/config.ini
New file
0,0 → 1,15
[url]
efloreScriptUrl = "http://www.tela-botanica.org/eflore/consultation/presentations/scripts/recherche.js"
; url vers l'application utilisée par défaut
efloreConsultationUrl = "http://www.tela-botanica.org/page:eflore"
; url spécifique à un référentiel
efloreConsultationBdtfxUrl = "http://www.tela-botanica.org/page:eflore_bdtfx"
; url spécifique à un référentiel
efloreConsultationBdtxaUrl = "http://www.tela-botanica.org/page:isfgm"
efloreRechercheSciUrlTpl = "http://www.tela-botanica.org/service:eflore:0.1/{referentiel}/noms"
efloreRechercheVernaUrlTpl = "http://www.tela-botanica.org/service:eflore:0.1/{referentiel}/noms-vernaculaires"
ficheTaxonUrlTpl = "?referentiel={referentiel}&niveau=2&module=fiche&action=fiche&num_nom={num_taxon}&type_nom=nom_scientifique&nom="
 
[referentiel]
referentielsSciDispos = bdtfx#France : métropole,bdtxa#France : Antilles,isfan#Afrique du Nord,apd#Afrique tropicale
referentielsVernaDispos = bdtfx:nvjfl,bdtxa:nva
/trunk/widget/modules/chorodep/Chorodep.php
New file
0,0 → 1,153
<?php
// declare(encoding='UTF-8');
/**
* Service de recherche dans eflore, permettant d'intégrer le moteur dans une page donnée
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation et documentation :
* @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideEfloreWidgetRecherche
*
*
* @author Aurélien PERONNET <aurelien@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 Copyright (c) 2013, Tela Botanica (accueil@tela-botanica.org)
*/
class Chorodep extends WidgetCommun {
const DS = DIRECTORY_SEPARATOR;
/**
* Méthode appelée par défaut pour charger ce widget.
*/
public function executer() {
$retour = null;
$methode = $this->traiterNomMethodeExecuter($this->ressources[0]);
if (method_exists($this, $methode)) {
$retour = $this->$methode();
} else {
$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
}
if (is_null($retour)) {
$info = 'Un problème est survenu : '.print_r($this->messages, true);
$this->envoyer($info);
} else {
$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
if (isset($_GET['callback'])) {
$this->envoyerJsonp(array('contenu' => $contenu));
} else {
$this->envoyer($contenu);
}
}
}
/*
* dans validation
* reflechir comment gérer prop refusee
* quand prop validée/refusée changée dans chorodep_prop et chorodep_version
*/
public function executerFormulaire() {
$widget['donnees'] = array();
if ($this->parametres != array()) {
$widget['donnees'] = $this->parametres;
$this->ajouterProposition();
}
$l = json_decode(file_get_contents("http://api.tela-botanica.org/service:eflore:0.1/insee-d/zone-geo?retour.format=liste"), true);
$widget['donnees']['liste_dept'] = $l["resultat"];
$widget['donnees']['efloreScriptUrl'] = $this->config['url']['efloreScriptUrl'];
$widget['squelette'] = 'formulaire';
return $widget;
}
private function ajouterProposition() {
$params_obli = array("dept",/*"num_nom",*/"statut","nom_sci","sources","notes");
$donnees[] = "provenance=form";
$donnees[] = "num_nom=24545"; // à modifier avec javascript
$url_propo = "http://localhost/service:eflore:0.1/chorodep/propositions/";
foreach ($params_obli as $param) {
if (isset($this->parametres[$param])) {
$donnees[] = $param."=".$this->parametres[$param];
} else {
$donnees[] = $param."=";
}
}
$contexte = stream_context_create(array(
'http' => array(
'method' => 'PUT',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => implode("&", $donnees))));
$flux = fopen($url_propo, 'r', false, $contexte);
if (!$flux) {
$this->reponse_entetes = $http_response_header;
$e = "Echec requête 'PUT' : {$url_propo}\n".
"Paramètres requête : implode("&", $donnees) \n".
"Entêtes réponse : \n";
trigger_error($e, E_USER_WARNING);
} else {
// Informations sur les en-têtes et métadonnées du flux
$this->reponse_entetes = stream_get_meta_data($flux);
// Contenu actuel de $url
$contenu = stream_get_contents($flux);
fclose($flux);
}
}
public function executerValidation() {
$widget['donnees'] = array();
if ($this->parametres != array()) {
$this->modifierProposition();
}
$widget['donnees']['liste_prop'] = json_decode(file_get_contents("http://localhost/service:eflore:0.1/chorodep/propositions/"), true);
$widget['squelette'] = 'tableau_validation';
return $widget;
}
private function modifierProposition() {
$url_propo = "http://localhost/service:eflore:0.1/chorodep/propositions/";
foreach ($this->parametres as $id => $prop) {
$donnees[] = $id."=".$prop;
}
$contexte = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => implode("&", $donnees))));
$flux = fopen($url_propo, 'r', false, $contexte);
if (!$flux) {
$this->reponse_entetes = $http_response_header;
$e = "Echec requête 'POST' : {$url_propo}\n".
"Paramètres requête : implode("&", $donnees) \n".
"Entêtes réponse : \n";
trigger_error($e, E_USER_WARNING);
} else {
// Informations sur les en-têtes et métadonnées du flux
$this->reponse_entetes = stream_get_meta_data($flux);
// Contenu actuel de $url
$contenu = stream_get_contents($flux);
fclose($flux);
}
}
/*"1","0","presenceChorologie","Tableau des présences pour le projet de chorologie départementale","presenceChorologie",
"2","1","non renseignée","Zone géographique non renseignée.",,"legende=#808080"
"3","1","présence",,"1","legende=#A0FF7D,priorite=6"
"4","1","présence à confimer",,"1?","legende=#FFFF32,priorite=5"
"5","1","douteux",,"?","legende=#FFCB30,priorite=4"
"6","1","disparu",,"-|-","legende=#F88017,priorite=3"
"7","1","erreur",,"#","legende=#FF2850,priorite=2"
"8","1","erreur à confirmer",,"#?","legende=#9F0016,priorite=1"*/
 
}
?>
/trunk/widget/modules/chorodep/config.defaut.ini
New file
0,0 → 1,15
[url]
efloreScriptUrl = "http://www.tela-botanica.org/eflore/consultation/presentations/scripts/recherche.js"
; url vers l'application utilisée par défaut
efloreConsultationUrl = "http://www.tela-botanica.org/page:eflore"
; url spécifique à un référentiel
efloreConsultationBdtfxUrl = "http://www.tela-botanica.org/page:eflore_bdtfx"
; url spécifique à un référentiel
efloreConsultationBdtxaUrl = "http://www.tela-botanica.org/page:isfgm"
efloreRechercheSciUrlTpl = "http://www.tela-botanica.org/service:eflore:0.1/{referentiel}/noms"
efloreRechercheVernaUrlTpl = "http://www.tela-botanica.org/service:eflore:0.1/{referentiel}/noms-vernaculaires"
ficheTaxonUrlTpl = "?referentiel={referentiel}&niveau=2&module=fiche&action=fiche&num_nom={num_taxon}&type_nom=nom_scientifique&nom="
 
[referentiel]
referentielsSciDispos = bdtfx#France : métropole,bdtxa#France : Antilles,isfan#Afrique du Nord,apd#Afrique tropicale
referentielsVernaDispos = bdtfx:nvjfl,bdtxa:nva
/trunk/widget/modules/chorodep/squelettes/formulaire.tpl.html
New file
0,0 → 1,102
<html lang="fr">
<head>
<title>Chorodep</title>
<meta charset="utf-8">
 
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="keywords" content="Tela Botanica, eFlore, chorodep" />
<meta name="description" content="eFlore - Widget de saisie pour Chorologie départementale" />
<style></style>
<script src="http://www.tela-botanica.org/commun/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
chargerStatutSSO("https://www.tela-botanica.org/service:annuaire:auth");
});
/**
* Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
* Ã droite de la barre en fonction
*/
function chargerStatutSSO(urlBaseAuth) {
var urlAuth = urlBaseAuth + '/identite';
$.ajax({
url: urlAuth,
type: "GET",
dataType: 'json',
xhrFields: {
withCredentials: true
}
}).done(function(data) {
// connecté
definirUtilisateur(data.token);
});
}
 
function definirUtilisateur(jeton) {
var nomComplet = '';
if (jeton != undefined) {
// décodage jeton
var jetonDecode = decoderJeton(jeton);
nomComplet = jetonDecode.intitule;
}
// affichage
$('#bouton-connexion').hide();
$('#utilisateur-connecte').show();
$('#nom-complet').html(nomComplet);
}
 
/**
* Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
* JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
* Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
* ou ceci : https://code.google.com/p/crypto-js
*/
function decoderJeton(jeton) {
parts = jeton.split('.');
payload = parts[1];
payload = atob(payload);
payload = JSON.parse(payload, true);
 
return payload;
}</script>
<!-- CSS -->
<link rel="stylesheet" href="http://resources.tela-botanica.org/bootstrap/3.2.0/css/bootstrap.min.css" />
<link rel="stylesheet" href="http://resources.tela-botanica.org/bootstrap/3.2.0/css/bootstrap-theme.min.css" />
</head>
<body>
<div class="importance1" id="conteneur-recherche">
<h1 class="titre-widget">Chorodep</h1>
<?= isset($donnees['nom_sci']) ? "Votre proposition pour ".$donnees['nom_sci']." dans le ".$donnees['dept']." a bien été ajouté.<br />" : "";?>
<form class="navbar-form navbar-left" id="ef-form-nomenclature" name="ef-form-nomenclature" action="../Chorodep/formulaire" method="get">
<div class="form-groupe">
<label for="nom_sci">Nom latin :</label>
<input type="search" name="nom_sci" id="nom_sci" <?= isset($donnees['nom_sci']) ? "value='".$donnees['nom_sci']."'": "";?>/><br />
<label for="dept">Département :</label>
<select name="dept" id="dept">
<?php foreach ($liste_dept as $t=>$dept) {?>
<option value="<?=$dept['code'];?>" <?= isset($donnees['dept']) && $donnees['dept'] == $dept['code'] ? "selected='selected'": "";?> ><?=$dept['nom']." (".$dept['code'].")";?></option>
<?php } ?>
</select><br />
<label for="statut">Statut :</label>
<select name="statut" id="statut">
<option value="3" <?= isset($donnees['statut']) && $donnees['statut'] == 3 ? "selected='selected'": "";?> >présence</option>
<option value="4" <?= isset($donnees['statut']) && $donnees['statut'] == 4 ? "selected='selected'": "";?> >présence à confimer</option>
<option value="5" <?= isset($donnees['statut']) && $donnees['statut'] == 5 ? "selected='selected'": "";?>>douteux</option>
<option value="6" <?= isset($donnees['statut']) && $donnees['statut'] == 6 ? "selected='selected'": "";?> >disparu</option>
<option value="7" <?= isset($donnees['statut']) && $donnees['statut'] == 7 ? "selected='selected'": "";?> >erreur</option>
<option value="8" <?= isset($donnees['statut']) && $donnees['statut'] == 8 ? "selected='selected'": "";?> >erreur à confirmer</option>
</select><br />
<label for="sources">Sources :</label>
<input type="text" name="sources" id="sources" <?= isset($donnees['sources']) ? "value='".$donnees['sources']."'": "";?> /><br />
<label for="notes">Notes :</label>
<input type="text" name="notes" id="notes" <?= isset($donnees['notes']) ? "value='".$donnees['notes']."'": "";?> /><br />
<input type="submit" name="envoyer" id="envoyer" value="envoyer"/><br />
</div>
</form>
</div>
</body>
</html>
 
 
/trunk/widget/modules/chorodep/squelettes/tableau_validation.tpl.html
New file
0,0 → 1,131
<html lang="fr">
<head>
<title>Chorodep</title>
<meta charset="utf-8">
 
<meta name="revisit-after" content="15 days" />
<meta name="robots" content="index,follow" />
<meta name="keywords" content="Tela Botanica, eFlore, chorodep" />
<meta name="description" content="eFlore - Widget de saisie pour Chorologie départementale" />
<style></style>
<script src="http://www.tela-botanica.org/commun/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
chargerStatutSSO("https://www.tela-botanica.org/service:annuaire:auth");
});
/**
* Interroge le SSO pour connaître le statut de l'utilisateur, et change le menu
* Ã droite de la barre en fonction
*/
function chargerStatutSSO(urlBaseAuth) {
var urlAuth = urlBaseAuth + '/identite';
$.ajax({
url: urlAuth,
type: "GET",
dataType: 'json',
xhrFields: {
withCredentials: true
}
}).done(function(data) {
// connecté
definirUtilisateur(data.token);
});
}
 
function definirUtilisateur(jeton) {
var nomComplet = '';
if (jeton != undefined) {
// décodage jeton
var jetonDecode = decoderJeton(jeton);
nomComplet = jetonDecode.intitule;
}
// affichage
$('#bouton-connexion').hide();
$('#utilisateur-connecte').show();
$('#nom-complet').html(nomComplet);
}
 
/**
* Décodage à l'arrache d'un jeton JWT, ATTENTION CONSIDERE QUE LE
* JETON EST VALIDE, ne pas décoder n'importe quoi - pas trouvé de lib simple
* Si pb de cross-browser, tenter ceci : https://code.google.com/p/javascriptbase64/
* ou ceci : https://code.google.com/p/crypto-js
*/
function decoderJeton(jeton) {
parts = jeton.split('.');
payload = parts[1];
payload = atob(payload);
payload = JSON.parse(payload, true);
 
return payload;
}</script>
<!-- CSS -->
<link rel="stylesheet" href="http://resources.tela-botanica.org/bootstrap/3.2.0/css/bootstrap.min.css" />
<link rel="stylesheet" href="http://resources.tela-botanica.org/bootstrap/3.2.0/css/bootstrap-theme.min.css" />
</head>
<body>
<ul class="nav navbar-nav navbar-right">
<li id="bouton-connexion" class="dropdown">
<a href="http://www.tela-botanica.org/widget:reseau:auth?origine=http://localhost/eflore-consultation/widget/chorodep/">Connexion</a>
</li>
<li class="dropdown" id="utilisateur-connecte" style="display: none;">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"><span id="nom-complet"></span> <b class="caret"></b></a>
<ul class="dropdown-menu">
<li id="profil-utilisateur"><a href="http://www.tela-botanica.org/inscription">Mon profil</a></li>
<li id="deconnexion"><a href="http://www.tela-botanica.org/widget:reseau:auth?action=deconnexion&origine=http://localhost/eflore-consultation/widget/chorodep/">Déconnexion</a></li>
</ul>
</li>
</ul>
<form class="" id="valid" name="valid" action="../Chorodep/validation" method="get">
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">Propositions à valider</div>
<div class="panel-body">
Propositions de présence d'une espèce dans un département à valider pour intégration à la base Chorodep.
</div>
<!-- Table -->
<table class="table">
<thead>
<tr>
<th>#</th>
<th>Auteur</th>
<th>Espece</th>
<th>Département</th>
<th>Statut</th>
<th>Sources</th>
<th>Notes</th>
<th>Provenance</th>
<th>Date proposition</th>
<th>Accepter</th>
<th>Supprimer</th>
</tr>
</thead>
<tbody>
<?php foreach ($liste_prop as $prop) { ?>
<tr>
<th scope="row"><?=$prop['id'];?></th>
<td><?=$prop['auteur_courriel'];?></td>
<td><?=$prop['nom_sci'];?></td>
<td><?=$prop['dept'];?></td>
<td><?=$prop['statut'];?></td>
<td><?=$prop['source'];?></td>
<td><?=$prop['notes'];?></td>
<td><?=$prop['provenance'];?></td>
<td><?=$prop['date_creation'];?></td>
<td><input type="radio" name="<?=$prop['id'];?>" value="1" id="accepter" <?= isset($prop['validation']) && $prop['validation'] == 1 ? "checked='checked'": "";?> /></td>
<td><input type="radio" name="<?=$prop['id'];?>" value="0" id="refuser" <?= isset($prop['validation']) && $prop['validation'] == 0 ? "checked='checked'": "";?> /></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
<input type="submit" name="envoyer" id="valider" value="Valider" style="position:relative;left:87%;"/>
</form>
</body>
</html>
 
/trunk/widget/Widget.php
25,6 → 25,7
/** Les paramètres de l'url $_GET nettoyés. */
private $parametres = null;
private $ressources = null;
 
/**
* Constructeur.
51,10 → 52,12
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['QUERY_STRING'])) {
$url_morceaux = $this->parserUrl();
if (isset($url_morceaux[0])) {
$this->widget = $url_morceaux[0];
$this->widget = array_shift($url_morceaux);
self::$config['chemins']['widgetCourantDossier'] = self::$config['chemins']['widgetsDossier'].strtolower($this->widget).DIRECTORY_SEPARATOR;
$this->chargerWidgetConfig();
if (isset($url_morceaux[0])) $this->ressources = $url_morceaux;
}
// Chargement des chemins pour l'autoload
$this->chargerCheminAutoload();
140,7 → 143,7
if (file_exists($fichier_widget)) {
include_once $fichier_widget;
if (class_exists($classe_widget)) {
$widget = new $classe_widget(self::$config, $this->parametres);
$widget = new $classe_widget(self::$config, $this->parametres, $this->ressources);
$widget->executer();
}
}
/trunk/widget/bibliotheque/WidgetCommun.php
3,13 → 3,15
protected $config = null;
protected $parametres = null;
protected $ressources = null;
protected $messages = array();
protected $debug = array();
public function __construct($config, $parametres) {
public function __construct($config, $parametres, $ressources) {
$this->config = $config;
$this->parserFichierIni($config['chemins']['widgetCourantDossier'].'config.ini');
$this->parametres = $parametres;
$this->ressources = $ressources;
}
/**