Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 3637 → Rev 3638

/trunk/widget/modules/saisie/Saisie.php
1,255 → 1,362
<?php
<?php
// declare(encoding='UTF-8');
/**
* Widget fournissant des interfaces de saisie simplifiée pour différent projets
* Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* Cas d'utilisation et documentation :
* @link http://www.tela-botanica.org/wikini/AideCarnetEnLigne/wakka.php?wiki=AideCELWidgetSaisie
* @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
*
* Paramètres :
* - projet [par défaut : defaut] : indique le mot-clé à associer aux obs saisies; si un widget de saisie personnalisé
* portant ce nom existe, il sera chargé
* - mission [par défaut : vide] : permet de charger un "sous-widget", dans le cas où un widget personnalisé
* est associé au projet, et ce widget accepte des sous-widgets (ex: "missions-flore")
* ===> extra = booléen (1 ou 0) [par défaut : 1]
* Affiche / Cache la vignette en taille plus importante au bas du widget.
* ===> vignette = [0-9]+,[0-9]+ [par défaut : 4,3]
* Indique le nombre de vignette par ligne et le nombre de ligne.
*
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2015 Tela Botanica <accueil@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 Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
*/
class Saisie extends WidgetCommun {
 
const DS = DIRECTORY_SEPARATOR;
const PROJET_DEFAUT = 'defaut';
const SERVICE_DEFAUT = 'saisie';
const WS_SAISIE = 'CelWidgetSaisie';
const WS_UPLOAD = 'CelWidgetUploadImageTemp';
const WS_OBS = 'CelObs';
const WS_COORD = 'CoordSearch';
const LANGUE_DEFAUT = 'fr';
const PROJET_DEFAUT = 'base';
const WS_NOM = 'noms';
const EFLORE_API_VERSION = '0.1';
const REFERENTIEL_DEFAUT = 'bdtfxr';
 
/** référentiel utilisé pour la complétion des noms scientifiques */
protected $ns_referentiel;
/** mot-clé associé aux saisies, et template personnalisé si appliquable */
protected $projet = null;
protected $configProjet = null;
protected $configMission = null;
protected $mission = null;
/** langue (traduction), charge un template de la forme "defaut_en.tpl.html" */
protected $langue = null;
 
const WIDGETS_SPECIAUX = ['tb_aupresdemonarbre','tb_streets','tb_lichensgo'];
const SQUELETTES_SPECIAUX = ['arbres','plantes','lichens'];
const WS_OBS_LIST = 'InventoryObservationList';
const WS_IMG_LIST = 'celImage';
private $cel_url_tpl = null;
/** Si spécifié, on ajoute une barre de navigation inter-applications */
private $bar;
//private $parametres_autorises = array('projet', 'type', 'langue', 'order');
private $parametres_autorises = array(
'projet' => 'projet',
'type' => 'type',
'langue' => 'langue',
'order' => 'order'
);
/**
* Amorçage du widget
* Méthode appelée par défaut pour charger ce widget.
*/
public function executer() {
// paramètres par défaut
$this->ns_referentiel = self::REFERENTIEL_DEFAUT;
$this->projet = self::PROJET_DEFAUT;
$retour = null;
// Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
unset($this->parametres['callback']);
extract($this->parametres);
$this->bar = (isset($bar)) ? $bar : false;
/* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
Sinon, rien ne sera chargé.
L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
l'application.
Chemin du fichier chargeant le framework requis */
$framework = dirname(__FILE__).'/framework.php';
if (!file_exists($framework)) {
$e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));// Optionnel
 
// définition du projet / mission
if (isset($this->parametres['projet']) && trim($this->parametres['projet']) != "") {
$projets = explode(',', $this->parametres['projet']);
$this->projet = strtolower($projets[0]);
}
$this->chargerConfigProjet();
$langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
$this->langue = I18n::setLangue($langue);
$this->parametres['langue'] = $langue;
 
// définition de la langue, en mode souple
if (isset($this->parametres['lang'])) {
$this->langue = $this->parametres['lang'];
if (!isset($mode)) {
$mode = self::SERVICE_DEFAUT;
}
if (!isset($projet)) {
$this->parametres['projet'] = self::PROJET_DEFAUT;
}
 
// exécution du service (le widget entier ou une sous-partie, par ex "Taxons")
$retour = null;
$service = isset($this->parametres['service']) ? $this->parametres['service'] : 'widget';
$methode = $this->traiterNomMethodeExecuter($service);
$methode = $this->traiterNomMethodeExecuter($mode);
if (method_exists($this, $methode)) {
$retour = $this->$methode();
} else {
$this->messages[] = "Le service '$methode' n'est pas disponible.";
$this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
}
 
// injection des données dans le squelette
$contenu = null;
$mime = null;
if (is_array($retour) && array_key_exists('squelette', $retour)) {
$ext = (isset($retour['squelette_ext'])) ? $retour['squelette_ext'] : '.tpl.html';
// Suffixe de template pour la langue - fr par défaut @TODO configurer ça un jour
$suffixeLangue = "";
// Si "nolang" n'est pas vide, on ne cherchera pas de squelette spécifique à la langue en cours
if ($this->langue != null && $this->langue != "fr" && empty($retour['nolang'])) {
$suffixeLangue = "_" . $this->langue;
}
// Template par défaut ou spécifique
if ($this->projetASquelette()) {
$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$this->projet.self::DS.$retour['squelette'].$suffixeLangue.$ext;
$contenu = ''; //print_r($retour);exit;
if (is_null($retour)) {
$this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
} else {
if (isset($retour['donnees'])) {
// ne pas afficher le projet dans l'url si on est dans saisie de base
$projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?'. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
 
$retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
$retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
$retour['donnees']['bar'] = $this->bar;
$retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
$retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
$retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
$retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
$retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
$retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
$retour['donnees']['mode'] = $mode;
$retour['donnees']['langue'] = $langue;
$retour['donnees']['widgets_url'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'],'');
$retour['donnees']['url_ws_obs_list'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS_LIST);
$retour['donnees']['url_ws_cel_imgs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_IMG_LIST) . '/liste-ids?obsId=';
$retour['donnees']['url_ws_cel_img_url'] = str_replace ( '%s.jpg', '{id}XS', $this->config['chemins']['celImgUrlTpl'] );
$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
switch ( $retour['squelette'] ) {
case 'apa':
$retour['donnees']['squelette'] = $this->parametres['projet'];
break;
case 'apaforms':
$retour['donnees']['squelette'] = $this->parametres['squelette'];
break;
default:
$retour['donnees']['squelette'] = $retour['squelette'];
break;
}
$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
} else {
$squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.'defaut'.self::DS.'defaut'.$suffixeLangue.$ext;
$this->messages[] = 'Les données à transmettre au squelette sont nulles.';
}
$contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
$mime = isset($retour['mime']) ? $retour['mime'] : null;
} else {
if (count($this->messages) == 0) {
$this->messages[] = "La méthode du sous-service ne renvoie pas les données dans le bon format";
}
$contenu = 'Un problème est survenu : ' . print_r($this->messages, true);
}
 
// envoi de la page
$this->envoyer($contenu, $mime);
$this->envoyer($contenu);
}
 
/**
* Charge le fichier de configuration associé au projet : configurations/nomduprojet.ini
* Si une mission est définie, charge séparément la section de la configuration concernant
* cette mission : [nommission]
*/
protected function chargerConfigProjet() {
$fichier_config = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'.ini';
if (file_exists($fichier_config)) {
if ($this->configProjet = parse_ini_file($fichier_config, true)) {
if (isset($_GET['mission'])) {
$this->mission = strtolower(trim($_GET['mission']));
if (isset($this->configProjet[$this->mission])) {
$this->configMission = $this->configProjet[$this->mission];
}
}
 
private function executerSaisie() {
$retour = array();
if (in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX) ) {
if (isset($this->parametres['squelette']) && in_array($this->parametres['squelette'], self::SQUELETTES_SPECIAUX) ) {
$retour['squelette'] = 'apaforms';
} else {
$this->messages[] = "Le fichier de configuration '$fichier_config' n'a pu être chargé.";
$retour['squelette'] = 'apa';
}
} else {
$this->debug[] = "Le fichier de configuration '$fichier_config' n'existe pas.";
$retour['squelette'] = 'saisie';
$retour['donnees']['general'] = I18n::get('General');
$retour['donnees']['aide'] = I18n::get('Aide');
$retour['donnees']['observateur'] = I18n::get('Observateur');
$retour['donnees']['observation'] = I18n::get('Observation');
$retour['donnees']['image'] = I18n::get('Image');
$retour['donnees']['chpsupp'] = I18n::get('Chpsupp');
$retour['donnees']['resume'] = I18n::get('Resume');
}
$retour['donnees']['widget'] = $this->rechercherProjet();
return $retour;
}
 
/**
* Retourne true si le dossier du projet courant existe, false sinon
* @return boolean
*/
protected function projetASquelette() {
return file_exists(dirname(__FILE__).self::DS.'squelettes'.self::DS.$this->projet);
/* Recherche si le projet existe sinon va chercher les infos de base */
private function rechercherProjet() {
// projet avec un squelette défini (et non juste un mot-clé d'observation)
$estProjetDefini = true;
$tab = array();
$url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
$json = $this->getDao()->consulter($url);
if (!in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX)){
if ( $json !== "[]") {
$tab = $this->rechercherChampsSupp();
} else {
$url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
$json = $this->getDao()->consulter($url);
$estProjetDefini = false;
}
}
$tableau = json_decode($json, true);
$tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
if (
isset($this->parametres['squelette']) &&
($this->parametres['squelette'] === 'plantes' || $this->parametres['squelette'] === 'lichens')
) {
$tableau['type_especes'] = 'liste';
if ( $this->parametres['squelette'] === 'lichens' ) {
$tableau['referentiel'] = 'taxref';
}
}
$tableau['especes'] = $this->rechercherInfosEspeces($tableau);
if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
// si on trouve ":" dans referentiel, referentiel = première partie
$tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
}
$tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
if(!isset($this->parametres['id-obs'])) {
if (isset($this->parametres['dept']) || isset($this->parametres['commune'],$this->parametres['dept']) || isset($this->parametres['code_insee'])) {
$localisation = $this->traiterParamsLocalisation($this->parametres);
// les paramètres dans l'url peuvent surcharger les données de localisation de la bdd
if ($localisation) $tableau['localisation'] = $localisation;
}
if (isset($tableau['localisation'])) $tableau['localisation'] = $this->traiterLocalisation($tableau['localisation']);
}
if (isset($tableau['motscles'])) {
if (isset($tableau['tag-obs'])) {
$tableau['tag-obs'] .= $tableau['motscles'];
} else if (isset($tableau['tag-img'])) {
$tableau['tag-img'] .= $tableau['motscles'];
} else {
$tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
}
}
$tableau['chpSupp'] = $tab;
$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
$tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
return $tableau;
}
 
/**
* Exécution du widget complet
* @return Ambigous <string, unknown, multitype:string unknown >
*/
public function executerWidget() {
$widget['squelette'] = $this->projet;
$widget['donnees'] = array();
$widget['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], '');
$widget['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
$widget['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
$widget['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
$widget['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
$widget['donnees']['url_remarques'] = $this->config['chemins']['widgetRemarquesUrl'];
/* Recherche si un projet a des champs de saisie supplémentaire */
private function rechercherChampsSupp() {
$retour = array();
$projet = $this->parametres['projet'];
$url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
$json = $this->getDao()->consulter($url);
$retour = json_decode($json, true);
 
$widget['donnees']['logo'] = $this->getLogoPage();
$widget['donnees']['titre'] = $this->getTitrePage();
$widget['donnees']['nom_mission'] = $this->getNomMissionFlore();
foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
 
$widget['donnees']['zone_geo'] = $this->getZoneGeo();
$widget['donnees']['groupe_zones_geo'] = $this->getGroupeZonesGeo();
$widget['donnees']['referentiel_impose'] = $this->getReferentielImpose();
$widget['donnees']['espece_imposee'] = false;
$widget['donnees']['nn_espece_defaut'] = '';
$widget['donnees']['nom_sci_espece_defaut'] = '';
$widget['donnees']['infos_espece'] = '{}';
$retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
$retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
$retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
 
$widget['donnees']['prod'] = ($this->config['parametres']['modeServeur'] == "prod");
if ( isset( $chsup['fieldValues'] ) ) {
$retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
 
$widget['donnees']['cleGoogleMaps'] = $this->config['api']['cleGoogleMapsSaisie'];
$projetsAutorises = $this->transformerEnTableau($this->config['projets']['autorises']);
 
$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
$urlWsNs = sprintf($urlWsNsTpl, self::EFLORE_API_VERSION, $this->ns_referentiel, self::WS_NOM);
$urlWsNsSansRef = sprintf($urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM);
$widget['donnees']['url_ws_autocompletion_ns'] = $urlWsNs;
$widget['donnees']['url_ws_autocompletion_ns_tpl'] = $urlWsNsSansRef;
$widget['donnees']['ns_referentiel'] = $this->ns_referentiel;
$widget['donnees']['url_ws_coord_search_tpl'] = $this->config['chemins']['serviceCoordSearchUrl'];
$widget['donnees']['url_ws_trace_rue_tpl'] = $this->config['chemins']['serviceTraceRueUrl'];
if ($this->especeEstImposee()) {
$nnEspeceImposee = $this->getNnEspeceImposee();
$nom = $this->chargerInfosTaxon($nnEspeceImposee);
$widget['donnees']['espece_imposee'] = true;
$widget['donnees']['nn_espece_defaut'] = $nnEspeceImposee;
$widget['donnees']['nom_sci_espece_defaut'] = $nom['nom_complet'];
$widget['donnees']['infos_espece'] = $this->array2js($nom, true);
if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
// Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
$retour[$projet]['champs-supp'][$key]['fieldValues']['cleanListValue'][] = ($list_value_array !== 'other') ? 'val-' . preg_replace( '/[^A-Za-z0-9_\-]/', '', $this->remove_accents( strtolower($list_value_array[0] ) ) ) : '';
}
}
}
$retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
}
return $retour;
}
 
$projetsAListeDeNoms = $this->transformerEnTableau($this->config['projets']['liste_noms']);
if (in_array($this->projet, $projetsAListeDeNoms) && !$this->especeEstImposee()) {
$projetsAListeDeNomsSciEtVerna = $this->transformerEnTableau($this->config['projets']['liste_noms_sci_et_verna']);
if (in_array($this->projet, $projetsAListeDeNomsSciEtVerna)) {
$widget['donnees']['taxons'] = $this->recupererListeNoms();
} else {
$widget['donnees']['taxons'] = $this->recupererListeNomsSci();
// remplace certains parametres définis en bd par les parametres définis dans l'url
private function traiterParametres($estProjetDefini, $tableau) {
$criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
$criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
foreach($this->parametres as $nom_critere => $valeur_critere) {
if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
$tableau[$nom_critere] = $valeur_critere;
} else if (in_array($nom_critere, $criteres)) {
$tableau[$nom_critere] = $valeur_critere;
}
}
 
// Chargement de la liste des milieux issues du fichier .ini du projet
$projetsAListeDeMilieux = $this->transformerEnTableau($this->config['projets']['liste_milieux']);
if (in_array($this->projet, $projetsAListeDeMilieux)) {
$widget['donnees']['milieux'] = $this->parserMilieux();
}
 
return $widget;
return $tableau;
}
 
protected function getTitrePage() {
$titre = 'defaut';
if (isset($this->configProjet['titre_page'])) {
$titre = $this->configProjet['titre_page'];
private function traiterLocalisation( $infos_localisation ) {
$infos = explode(';', $infos_localisation);
$tableauTmp = array();
$retour = array();
foreach ($infos as $info) {
$tableauTmp = explode(':', $info);
$retour[$tableauTmp[0]] = $tableauTmp[1];
}
if (isset($this->configMission['titre_page'])) {
$titre = $this->configMission['titre_page'];
}
if (isset($_GET['titre'])) {
$titre = $_GET['titre'];
}
if ($titre === 0) { // wtf ?
$titre = '';
}
return $titre;
return $retour;
}
 
protected function getLogoPage() {
$logo = 'defaut';
if (isset($this->configProjet['logo_page'])) {
$logo = $this->configProjet['logo_page'];
private function traiterParamsLocalisation( $params ) {
$infos = array();
$tableauTmp = array();
$zoom = '12';
if (isset($params['commune'])) {
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?zone='.$params['commune'].'&code='.$params['dept'];
} else if (isset($params['dept'])) {
// pas trouvé de manière simple de déterminer le centroïde du département
// du coup on retrouve le code insee du chef lieu
$params['code_insee'] = $this->recupererChefLieuDept($params['dept']);
$zoom = '9';
}
if (isset($this->configMission['logo_page'])) {
$logo = $this->configMission['logo_page'];
// quoi qu'il arrive, s'il est défini, on donne la priorité au code insee (plus précis)
if (isset($params['code_insee'])) {
$url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?code='.$params['code_insee'];
}
if (isset($_GET['logo'])) {
$logo = $_GET['logo'];
if(!empty($url)) $json = $this->getDao()->consulter($url);
if(!empty($json)) $infos = json_decode($json, true);
if(!empty($infos)) {
$infos['lat'] = str_replace(',','.',strval(round($infos['lat'],5)));
$infos['lng'] = str_replace(',','.',strval(round($infos['lng'],5)));
return 'latitude:'.$infos['lat'].';longitude:'.$infos['lng'].';zoom:'.$zoom;
} else {
return false;
}
return $logo;
}
 
protected function getGroupeZonesGeo() {
$groupe = null;
if (isset($_GET['groupe_zones_geo'])) {
$groupe = $_GET['groupe_zones_geo'];
private function rechercherInfosEspeces( $infos_projets ) {
$retour = array();
$referentiel = $infos_projets['referentiel'];
$urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
$retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
$retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
$retour['ns_referentiel'] = $referentiel;
 
if ( isset( $infos_projets['type_especes'] ) ) {
 
switch ( $infos_projets['type_especes'] ) {
case 'fixe' :
$info_taxon = explode(':', $referentiel);
if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
$retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
}
break;
case 'referentiel' : break;
case 'liste' :
$retour['taxons'] = $this->recupererListeNomsSci();
break;
}
} else if ( isset( $referentiel ) ) {
if ( isset($infos_projets['num_nom'] ) ) {
$retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
}
}
return $groupe;
return $retour;
}
 
protected function getZoneGeo() {
$zone_geo = null;
if (isset($_GET['zone_geo'])) {
$zone_geo = $_GET['zone_geo'];
/**
* Consulte un webservice pour obtenir des informations sur le taxon dont le
* numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
* et non le taxon?)
* @param string|int $num_nom
* @return array
*/
protected function chargerInfosTaxon( $referentiel, $num_nom ) {
$url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
$infos = json_decode( file_get_contents( $url_service_infos ) );
// trop de champs injectés dans les infos espèces peuvent
// faire planter javascript
$champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
$resultat = array();
$retour = array();
if ( isset( $infos ) && !empty( $infos ) ) {
$infos = (array) $infos;
if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
$resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
$resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
$retour['espece_imposee'] = true;
$retour['nn_espece_defaut'] = $nnEspeceImposee;
$retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
$retour['infos_espece'] = $this->array2js( $resultat, true );
}
}
return $zone_geo;
return $retour;
}
 
protected function getReferentielImpose() {
$referentiel_impose = true;
if (!empty($_GET['referentiel']) && $_GET['referentiel'] != "autre") {
if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
$this->ns_referentiel = $_GET['referentiel'];
} else if (isset($this->configProjet['referentiel'])) {
$this->ns_referentiel = $this->configProjet['referentiel'];
262,42 → 369,8
}
 
/**
* Un nom un peu plus sympatoche à afficher que juste le mot-clef associé; s'il
* n'est pas défini dans la config, on prend le mot-clef tout de même
* Trie par nom français les taxons lus dans le fichier csv/tsv
*/
protected function getNomMissionFlore() {
$nom = $this->mission;
if (isset($this->configMission['nom_mission'])) {
$nom = $this->configMission['nom_mission'];
}
return $nom;
}
 
/**
* Remplit un fichier JS avec une variable contenant une liste restreinte de taxons,
* pour certains projets
* @return string
*/
public function executerTaxons() {
$widget['squelette'] = $this->projet.'_taxons';
$widget['squelette_ext'] = '.tpl.js';
$widget['donnees'] = array();
$nomsAAfficher = $this->recupererListeNomsSci();
$taxons_tries = array();
foreach ($nomsAAfficher as $taxon) {
$taxons_tries[$taxon['num_nom_sel']] = $taxon;
}
$widget['donnees']['taxons'] = json_encode($taxons_tries);
//echo "<pre>"; var_dump($widget); echo "</pre>";
// Le squelette n'est pas traduit, seules les données de taxons le sont
$widget['nolang'] = true;
 
return $widget;
}
 
/**
* Trie par nom français les taxons lus dans le fichier tsv
*/
protected function recupererListeNomsSci() {
$taxons = $this->recupererListeTaxon();
if (is_array($taxons)) {
317,32 → 390,32
if (is_array($taxons)) {
foreach ($taxons as $taxon) {
$nomSciTitle = $taxon['nom_ret'].
($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
$nomFrTitle = $taxon['nom_sel'].
($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
 
if ($taxon['groupe'] == 'special') {
$nomsSpeciaux[] = array(
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_fr'],
'nom_a_sauver' => $taxon['nom_sel'],
'nom_title' => $nomSciTitle,
'nom_type' => 'nom-special');
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_fr'],
'nom_a_sauver' => $taxon['nom_sel'],
'nom_title' => $nomSciTitle,
'nom_type' => 'nom-special');
} else {
$nomsAAfficher[] = array(
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_sel'],
'nom_a_sauver' => $taxon['nom_sel'],
'nom_title' => $nomSciTitle,
'nom_type' => 'nom-sci');
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_sel'],
'nom_a_sauver' => $taxon['nom_sel'],
'nom_title' => $nomSciTitle,
'nom_type' => 'nom-sci');
$nomsAAfficher[] = array(
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_fr'],
'nom_a_sauver' => $taxon['nom_fr'],
'nom_title' => $nomFrTitle,
'nom_type' => 'nom-fr');
'num_nom' => $taxon['num_nom_sel'],
'nom_a_afficher' => $taxon['nom_fr'],
'nom_a_sauver' => $taxon['nom_fr'],
'nom_title' => $nomFrTitle,
'nom_type' => 'nom-fr');
}
}
$nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
352,41 → 425,54
}
 
/**
* Lit une liste de taxons depuis un fichier tsv fourni
* Lit une liste de taxons depuis un fichier csv ou tsv fourni
*/
protected function recupererListeTaxon() {
$taxons = array();
$fichier_tsv = null;
if ($this->projet == 'missions-flore') {
$fichier_tsv = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'_'.$this->mission.'_taxons.tsv';
$langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
$chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
$nom_fichier = ($this->parametres['squelette'] === 'lichens') ? 'lichens_taxons' : 'especes';
$chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . $nom_fichier. '.';
 
if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
} else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
$taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
} else {
// recherche d'un fichier traduit (pour les noms vernaculaires)
$suffixeLangue = "";
if ($this->langue != null && $this->langue != "fr") {
$suffixeLangue = "_" . $this->langue;
$fichier_tsv = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'_taxons'.$suffixeLangue.'.tsv';
$this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
}
return $taxons;
}
 
/**
* Lit une liste de taxons depuis un fichier csv ou tsv fourni
*/
protected function recupererChefLieuDept($dept) {
$infosDepts = array();
$code_insee = '';
$chemin_fichier = dirname(__FILE__).self::DS.'squelettes'.self::DS.'dept.csv';
 
if (file_exists($chemin_fichier ) && is_readable($chemin_fichier)) {
$infosDepts = $this->decomposerFichierCsv( $chemin_fichier,"," );
if(!empty($infosDepts) && is_array($infosDepts)) {
foreach ($infosDepts as $key => $infosDept) {
if($dept == $infosDept['dep']) {
return $code_insee = $infosDept['cheflieu'];
}
}
}
// si le fichier de taxons traduit n'est pas disponible ou qu'on n'a
// pas demandé de langue particulière, on se rabat sur celui par défaut
if (! file_exists($fichier_tsv)) {
$fichier_tsv = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'_taxons.tsv';
}
}
if (file_exists($fichier_tsv) && is_readable($fichier_tsv)) {
$taxons = $this->decomposerFichierTsv($fichier_tsv);
} else {
$this->debug[] = "Impossible d'ouvrir le fichier '$fichier_tsv'.";
$this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
}
return $taxons;
}
 
/**
* Découpe un fihcier tsv
* Découpe un fihcier csv/tsv
*/
protected function decomposerFichierTsv($fichier, $delimiter = "\t"){
protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
$header = null;
$data = array();
if (($handle = fopen($fichier, 'r')) !== FALSE) {
if (($handle = fopen($fichier, "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
if (!$header) {
$header = $row;
400,80 → 486,6
}
 
/**
* Récupère la liste des milieux depuis la section [milieux] de la configuration
* du projet, si elle existe
* @return array
*/
protected function parserMilieux() {
$infosMilieux = array();
if (isset($this->configProjet['milieux'])) {
$milieux = explode('|', $this->configProjet['milieux']);
foreach ($milieux as $milieu) {
$milieu = trim($milieu);
$details = explode(';', $milieu);
if (isset($details[1])) {
$infosMilieux[$details[0]] = $details[1];
} else {
$infosMilieux[$details[0]] = '';
}
}
ksort($infosMilieux);
}
return $infosMilieux;
}
 
/**
* Retourne true si le widget est restreint à une espèce, false sinon
* @return boolean
*/
protected function especeEstImposee() {
return ((isset($_GET['num_nom']) && $_GET['num_nom'] != '')
|| isset($this->configProjet['sp_imposee']) || isset($this->configMission['sp_imposee']));
}
 
/**
* Retourne le numéro nomenclatural (nn) de l'espèce imposée si tel est
* le cas, null sinon
* @return string
*/
protected function getNnEspeceImposee() {
$nn = null;
if (isset($_GET['num_nom']) && is_numeric($_GET['num_nom'])) {
$nn = $_GET['num_nom'];
} else if (isset($this->configProjet['sp_imposee'])) {
$nn = $this->configProjet['sp_imposee'];
} else if (isset($this->configMission['sp_imposee'])) {
$nn = $this->configMission['sp_imposee'];
}
return $nn;
}
 
/**
* Consulte un webservice pour obtenir des informations sur le taxon dont le
* numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
* et non le taxon?)
* @param string|int $num_nom
* @return array
*/
protected function chargerInfosTaxon($num_nom) {
$url_service_infos = sprintf($this->config['chemins']['infosTaxonUrl'], $this->ns_referentiel, $num_nom);
$infos = json_decode(file_get_contents($url_service_infos));
// trop de champs injectés dans les infos espèces peuvent
// faire planter javascript
$champs_a_garder = array('id', 'nom_sci','nom_sci_complet', 'nom_complet',
'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique');
$resultat = array();
if (isset($infos) && !empty($infos)) {
$infos = (array)$infos;
if (isset($infos['nom_sci']) && $infos['nom_sci'] != '') {
$resultat = array_intersect_key($infos, array_flip($champs_a_garder));
$resultat['retenu'] = ($infos['id'] == $infos['nom_retenu.id']) ? "true" : "false";
}
}
return $resultat;
}
 
/**
* Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
* @param array $array
* @param boolean $show_keys
489,12 → 501,12
if (is_array($value)) {
$dimensions[$i] = array2js($value,$show_keys);
if ($show_keys) {
$dimensions[$i] = '"'.$key.'":'.$dimensions[$i];
$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
}
} else {
$dimensions[$i] = '"'.addslashes($value).'"';
$dimensions[$i] = '\"'.addslashes($value).'\"';
if ($show_keys) {
$dimensions[$i] = '"'.$key.'":'.$dimensions[$i];
$dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
}
}
if ($i == 0) {
510,3 → 522,4
return $tableauJs;
}
}
?>