Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 3466 → Rev 3467

/trunk/jrest/bibliotheque/FormateurGroupeColonne.php
138,6 → 138,10
$colonnes += Array(
'guid' => self::GenColInfo(Array('abbrev' => 'guid',
'nom' => 'Identifiant unique')),
'id_observation' => self::GenColInfo(Array('abbrev' => 'id_observation',
'nom' => 'Identifiant',
'extra' => 1,
'importable' => FALSE)),
'nom_sel' => self::GenColInfo(Array('abbrev' => 'nom_sel',
'nom' => 'Espèce')),
'nom_sel_nn' => self::GenColInfo(Array('abbrev' => 'nom_sel_nn',
157,39 → 161,46
'importable' => FALSE)),
'nom_referentiel' => self::GenColInfo(Array('abbrev' => 'nom_referentiel',
'nom' => 'Referentiel taxonomique')),
'pays' => self::GenColInfo(Array('abbrev' => 'pays',
'certitude' => self::GenColInfo(Array('abbrev' => 'certitude',
'nom' => 'Certitude')),
'type_donnees' => self::GenColInfo(Array('abbrev' => 'type_donnees',
'nom' => 'Type d\'observation')),
'source' => self::GenColInfo(Array('abbrev' => 'source',
'nom' => 'Source de la saisie')),
'spontaneite' => self::GenColInfo(Array('abbrev' => 'spontaneite',
'nom' => 'Spontanéité')),
'latitude' => self::GenColInfo(Array('abbrev' => 'latitude',
'nom' => 'Latitude',
'extra' => 1)),
'longitude' => self::GenColInfo(Array('abbrev' => 'longitude',
'nom' => 'Longitude',
'extra' => 1)),
 
'geodatum' => self::GenColInfo(Array('abbrev' => 'geodatum',
'nom' => 'Référentiel Géographique',
'extra' => 1,
'importable' => FALSE)),
'pays' => self::GenColInfo(Array('abbrev' => 'pays',
'nom' => 'Pays')),
'zone_geo' => self::GenColInfo(Array('abbrev' => 'zone_geo',
'nom' => 'Commune')),
'ce_zone_geo' => self::GenColInfo(Array('abbrev' => 'ce_zone_geo',
'nom' => 'Identifiant Commune',
'fonction' => 'convertirCodeZoneGeoVersDepartement')),
'date_observation' => self::GenColInfo(Array('abbrev' => 'date_observation',
'nom' => 'Date',
'fonction' => 'formaterDate')),
'lieudit' => self::GenColInfo(Array('abbrev' => 'lieudit',
'nom' => 'Identifiant Commune')),
'localisation_floutage' => self::GenColInfo(Array('abbrev' => 'localisation_floutage',
'nom' => 'Floutage (niveau de localisation diffusé)')),
'altitude' => self::GenColInfo(Array('abbrev' => 'altitude',
'nom' => 'Altitude',
'extra' => 1)), // pas de trim0 car INT(5) en DB
'lieudit' => self::GenColInfo(Array('abbrev' => 'lieudit',
'nom' => 'Lieu-dit')),
'station' => self::GenColInfo(Array('abbrev' => 'station',
'nom' => 'Station')),
'milieu' => self::GenColInfo(Array('abbrev' => 'milieu',
'nom' => 'Milieu')),
'commentaire' => self::GenColInfo(Array('abbrev' => 'commentaire',
'date_observation' => self::GenColInfo(Array('abbrev' => 'date_observation',
'nom' => 'Date',
'fonction' => 'formaterDate')),
'commentaire' => self::GenColInfo(Array('abbrev' => 'commentaire',
'nom' => 'Notes')),
'latitude' => self::GenColInfo(Array('abbrev' => 'latitude',
'nom' => 'Latitude',
'extra' => 1,
'fonction' => 'trim0')),
'longitude' => self::GenColInfo(Array('abbrev' => 'longitude',
'nom' => 'Longitude',
'extra' => 1,
'fonction' => 'trim0')),
'altitude' => self::GenColInfo(Array('abbrev' => 'altitude',
'nom' => 'Altitude',
'extra' => 1)), // pas de trim0 car INT(5) en DB
'geodatum' => self::GenColInfo(Array('abbrev' => 'geodatum',
'nom' => 'Référentiel Géographique',
'extra' => 1,
'importable' => FALSE)),
'programme' => self::GenColInfo(Array('abbrev' => 'programme',
'nom' => 'Programme de sciences participatives ou observatoire citoyen',
'importable' => FALSE)),
196,91 → 207,123
'mots_cles_texte' => self::GenColInfo(Array('abbrev' => 'mots_cles_texte',
'nom' => 'Mots Clés',
'importable' => FALSE)),
'certitude' => self::GenColInfo(Array('abbrev' => 'certitude',
'nom' => 'Certitude',
'extra' => 1)),
'image' => self::GenColInfo(Array('abbrev' => 'image',
'nom' => 'Image(s)',
'extra' => 1)),
'validation_identiplante' => self::GenColInfo(Array('abbrev' => 'validation_identiplante',
'nom' => 'Détermination validée sur IdentiPlante',
'importable' => FALSE)),
'url_identiplante' => self::GenColInfo(Array('abbrev' => 'url_identiplante',
'nom' => "Lien vers l'observation sur IdentiPlante",
'importable' => FALSE)),
);
'image' => self::GenColInfo(Array('abbrev' => 'image',
'nom' => 'Image(s)',
'extra' => 1)),
);
} elseif (isset($groupe_de_champs['standard'])) {
$colonnes += Array(
'nom_sel' => self::GenColInfo(Array('abbrev' => 'nom_sel',
'nom' => 'Espèce')),
'nom_sel_nn' => self::GenColInfo(Array('abbrev' => 'nom_sel_nn',
'nom' => 'Numéro nomenclatural',
'importable' => FALSE)),
'nom_ret' => self::GenColInfo(Array('abbrev' => 'nom_ret',
'nom' => 'Nom retenu',
'importable' => FALSE)),
'nom_ret_nn' => self::GenColInfo(Array('abbrev' => 'nom_ret_nn',
'nom' => 'Numéro nomenclatural nom retenu',
'importable' => FALSE)),
'nt' => self::GenColInfo(Array('abbrev' => 'nt',
'nom' => 'Numéro taxonomique',
'importable' => FALSE)),
'famille' => self::GenColInfo(Array('abbrev' => 'famille',
'nom' => 'Famille',
'importable' => FALSE)),
'nom_referentiel' => self::GenColInfo(Array('abbrev' => 'nom_referentiel',
'nom' => 'Referentiel taxonomique')),
'pays' => self::GenColInfo(Array('abbrev' => 'pays',
'nom' => 'Pays')),
'zone_geo' => self::GenColInfo(Array('abbrev' => 'zone_geo',
'nom' => 'Commune')),
'ce_zone_geo' => self::GenColInfo(Array('abbrev' => 'ce_zone_geo',
'nom' => 'Identifiant Commune',
'fonction' => 'convertirCodeZoneGeoVersDepartement')),
'date_observation' => self::GenColInfo(Array('abbrev' => 'date_observation',
'nom' => 'Date',
'fonction' => 'formaterDate')),
'lieudit' => self::GenColInfo(Array('abbrev' => 'lieudit',
'nom' => 'Lieu-dit')),
'station' => self::GenColInfo(Array('abbrev' => 'station',
'nom' => 'Station')),
'milieu' => self::GenColInfo(Array('abbrev' => 'milieu',
'nom' => 'Milieu')),
'commentaire' => self::GenColInfo(Array('abbrev' => 'commentaire',
'nom' => 'Notes')),
'latitude' => self::GenColInfo(Array('abbrev' => 'latitude',
'nom' => 'Latitude',
'extra' => 1,
'fonction' => 'trim0')),
'longitude' => self::GenColInfo(Array('abbrev' => 'longitude',
'nom' => 'Longitude',
'extra' => 1,
'fonction' => 'trim0')),
'altitude' => self::GenColInfo(Array('abbrev' => 'altitude',
'nom' => 'Altitude',
'extra' => 1)), // pas de trim0 car INT(5) en DB
'geodatum' => self::GenColInfo(Array('abbrev' => 'geodatum',
'nom' => 'Référentiel Géographique',
'extra' => 1,
'importable' => FALSE)),
'guid' => self::GenColInfo(Array('abbrev' => 'guid',
'nom' => 'Identifiant unique')),
'id_observation' => self::GenColInfo(Array('abbrev' => 'id_observation',
'nom' => 'Identifiant',
'extra' => 1,
'importable' => FALSE)),
'nom_sel' => self::GenColInfo(Array('abbrev' => 'nom_sel',
'nom' => 'Espèce')),
'nom_sel_nn' => self::GenColInfo(Array('abbrev' => 'nom_sel_nn',
'nom' => 'Numéro nomenclatural',
'importable' => FALSE)),
'nom_ret' => self::GenColInfo(Array('abbrev' => 'nom_ret',
'nom' => 'Nom retenu',
'importable' => FALSE)),
'nom_ret_nn' => self::GenColInfo(Array('abbrev' => 'nom_ret_nn',
'nom' => 'Numéro nomenclatural nom retenu',
'importable' => FALSE)),
'nt' => self::GenColInfo(Array('abbrev' => 'nt',
'nom' => 'Numéro taxonomique',
'importable' => FALSE)),
'famille' => self::GenColInfo(Array('abbrev' => 'famille',
'nom' => 'Famille',
'importable' => FALSE)),
'nom_referentiel' => self::GenColInfo(Array('abbrev' => 'nom_referentiel',
'nom' => 'Referentiel taxonomique')),
'certitude' => self::GenColInfo(Array('abbrev' => 'certitude',
'nom' => 'Certitude')),
'type_donnees' => self::GenColInfo(Array('abbrev' => 'type_donnees',
'nom' => 'Type d\'observation')),
'source' => self::GenColInfo(Array('abbrev' => 'source',
'nom' => 'Source de la saisie')),
'spontaneite' => self::GenColInfo(Array('abbrev' => 'spontaneite',
'nom' => 'Spontanéité')),
'latitude' => self::GenColInfo(Array('abbrev' => 'latitude',
'nom' => 'Latitude',
'extra' => 1)),
'longitude' => self::GenColInfo(Array('abbrev' => 'longitude',
'nom' => 'Longitude',
'extra' => 1)),
'geodatum' => self::GenColInfo(Array('abbrev' => 'geodatum',
'nom' => 'Référentiel Géographique',
'extra' => 1,
'importable' => FALSE)),
'pays' => self::GenColInfo(Array('abbrev' => 'pays',
'nom' => 'Pays')),
'zone_geo' => self::GenColInfo(Array('abbrev' => 'zone_geo',
'nom' => 'Commune')),
'ce_zone_geo' => self::GenColInfo(Array('abbrev' => 'ce_zone_geo',
'nom' => 'Identifiant Commune')),
'localisation_floutage' => self::GenColInfo(Array('abbrev' => 'localisation_floutage',
'nom' => 'Floutage (niveau de localisation diffusé)')),
'altitude' => self::GenColInfo(Array('abbrev' => 'altitude',
'nom' => 'Altitude',
'extra' => 1)), // pas de trim0 car INT(5) en DB
'lieudit' => self::GenColInfo(Array('abbrev' => 'lieudit',
'nom' => 'Lieu-dit')),
'milieu' => self::GenColInfo(Array('abbrev' => 'milieu',
'nom' => 'Milieu')),
'date_observation' => self::GenColInfo(Array('abbrev' => 'date_observation',
'nom' => 'Date',
'fonction' => 'formaterDate')),
'commentaire' => self::GenColInfo(Array('abbrev' => 'commentaire',
'nom' => 'Notes')),
'programme' => self::GenColInfo(Array('abbrev' => 'programme',
'nom' => 'Programme de sciences participatives ou observatoire citoyen',
'importable' => FALSE)),
'mots_cles_texte' => self::GenColInfo(Array('abbrev' => 'mots_cles_texte',
'nom' => 'Mots Clés',
'importable' => FALSE)),
'image' => self::GenColInfo(Array('abbrev' => 'image',
'nom' => 'Image(s)',
'extra' => 1)),
'url_identiplante' => self::GenColInfo(Array('abbrev' => 'url_identiplante',
'nom' => "Lien vers l'observation sur IdentiPlante",
'importable' => FALSE)),
);
}
 
if(isset($groupe_de_champs['avance'])) {
$colonnes += array(
'localisation_coherence' => self::GenColInfo(Array('abbrev' => 'localisation_coherence',
'nom' => 'Cohérence entre la localité et les coordonnées GPS')),
'localisation_precision' => self::GenColInfo(Array('abbrev' => 'localisation_precision',
'nom' => 'Précision de la localisation')),
'station' => self::GenColInfo(Array('abbrev' => 'station',
'nom' => 'Station')),
'validation_identiplante' => self::GenColInfo(Array('abbrev' => 'validation_identiplante',
'nom' => 'Détermination validée sur IdentiPlante',
'importable' => FALSE)),
'score_identiplante' => self::GenColInfo(Array('abbrev' => 'score_identiplante',
'nom' => 'Détermination validée sur IdentiPlante',
'importable' => FALSE)),
'abondance' => self::GenColInfo(Array('abbrev' => 'abondance',
'nom' => 'Abondance',
'extra' => 1)),
'phenologie' => self::GenColInfo(Array('abbrev' => 'phenologie',
'nom' => 'Phénologie',
'extra' => 1)),
'herbier' => self::GenColInfo(Array('abbrev' => 'herbier',
'nom' => 'Présence d\'un échantillon d\'herbier',
'extra' => 1)),
// TODO: importable = FALSE car pas de merge de données importées
'ordre' => self::GenColInfo(Array('abbrev' => 'ordre',
'nom' => 'Ordre',
'extra' => 1,
'importable' => FALSE)),
'id_observation' => self::GenColInfo(Array('abbrev' => 'id_observation',
'nom' => 'Identifiant',
'extra' => 1,
'importable' => FALSE)),
 
'mots_cles_texte' => self::GenColInfo(Array('abbrev' => 'mots_cles_texte',
'nom' => 'Mots Clés',
'extra' => 1)),
'date_creation' => self::GenColInfo(Array('abbrev' => 'date_creation',
'nom' => 'Date Création',
'extra' => 1,
301,25 → 344,7
'nom' => 'Date Transmission',
'extra' => 1,
'importable' => FALSE)),
'abondance' => self::GenColInfo(Array('abbrev' => 'abondance',
'nom' => 'Abondance',
'extra' => 1)),
'certitude' => self::GenColInfo(Array('abbrev' => 'certitude',
'nom' => 'Certitude',
'extra' => 1)),
'phenologie' => self::GenColInfo(Array('abbrev' => 'phenologie',
'nom' => 'Phénologie',
'extra' => 1)),
 
// XXX: getImages() dépend du contexte de Cel, et doit être appelée comme cas particulier
// cf ExportXLS::traiterLigneObservation()
'images' => self::GenColInfo(Array('abbrev' => 'images',
'nom' => 'Image(s)',
'extra' => 1,
'fonction_data' => NULL /* cas particulier 'getImages' */,
'importable' => TRUE,
//'preload' => array(__CLASS__, 'getImages_preload')//TODO
)),
 
/* 'nom_commun' => self::GenColInfo(Array('abbrev' => 'nom_commun',
'nom' => 'Nom Commun',
336,13 → 361,13
'nom' => 'Nom Commun',
'extra' => 1,
'fonction_data' => 'getNomCommun_v3'),
'importable' => FALSE), */
'nom-commun' => self::GenColInfo(array(
'importable' => FALSE), */ /* cas particu 'getNomCommun_v4' */
/*'nom-commun' => self::GenColInfo(array(
'abbrev' => 'nom-commun',
'nom' => 'Nom Commun',
'extra' => 1,
'fonction_data' => null /* cas particu 'getNomCommun_v4' */,
'preload' => array(__CLASS__, 'getNomCommun_preload')))
'fonction_data' => null ,
'preload' => array(__CLASS__, 'getNomCommun_preload')))*/
);
}
 
375,10 → 400,9
if (isset($groupe_de_champs['auteur'])) {
$colonnes += array(
'observateur' => self::GenColInfo(array(
'abbrev' => 'observateur',
'nom' => 'Observateur',
'abbrev' => 'pseudo_utilisateur',
'nom' => 'Auteur',
'extra' => 1,
'fonction_data' => 'formaterUrlUser',
'importable' => false)),
);
}
431,15 → 455,9
$valeur = call_user_func(array(__CLASS__, $colonne['fonction_data']), $obs);
}
 
// // cette section devrait être vide:
// // cas particuliers ingérable avec l'architecture actuelle:
if (false && $abbrev == 'date_observation' && $valeur == '0000-00-00') {
/* blah */
}
// ici à cause du passage de $cel ($this->utilisateur)
if ($abbrev == 'images') {
$valeur = FormateurGroupeColonne::getImages($obs, $cel->id_utilisateur);
}
if ($abbrev == 'nom-commun') {
$valeur = FormateurGroupeColonne::getNomCommun_v4($obs);
}
540,58 → 558,10
return $date_formatee;
}
 
static function formaterUrlUser($obs) {
$is_id = is_numeric($obs['ce_utilisateur']);
return sprintf("%s %s <%s>%s",
$obs['prenom_utilisateur'],
$obs['nom_utilisateur'],
preg_replace(';@.*;', '@...', $obs['courriel_utilisateur']),
$is_id ? sprintf(' (' . USER_BASEURL . ')', $obs['ce_utilisateur']) : '');
}
 
static function getImages_preload($cel, $obsids) {
if (!$obsids) return;
$rec = Cel::db()->requeter(
sprintf("SELECT o.id_observation, GROUP_CONCAT(nom_original ORDER BY nom_original ASC SEPARATOR '%s') AS i " .
"FROM cel_images i LEFT JOIN cel_obs o ON (i.ce_observation = o.id_observation) " .
"WHERE o.ce_utilisateur = %d AND o.id_observation IN (%s) " .
"GROUP BY id_observation",
SEPARATEUR_IMAGES,
$cel->id_utilisateur,
implode(',', $obsids)));
foreach ($rec as $v) {
self::$cache['getImages'][$v['id_observation']] = $v['i'];
}
return null;
}
 
static function getImages($obs, $id_utilisateur) {
if(! $id_utilisateur) return NULL;
if(isset(self::$cache['getImages'][$obs['id_observation']]))
return self::$cache['getImages'][$obs['id_observation']];
 
$rec = Cel::db()->requeter(
sprintf("SELECT GROUP_CONCAT(nom_original ORDER BY nom_original ASC SEPARATOR '%s') AS i ".
"FROM cel_images i ".
" LEFT JOIN cel_obs o ON (i.ce_observation = o.id_observation) ".
"WHERE o.ce_utilisateur = %d ".
" AND o.id_observation = %d ".
'LIMIT 1',
SEPARATEUR_IMAGES,
$id_utilisateur,
$obs['id_observation']));
return $rec ? $rec[0]['i'] : NULL;
}
 
public static function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
$code_departement = '';
if(self::estUnCodeInseeDepartement($code_zone_geo)) {
$code_departement = substr(ltrim($code_zone_geo,'INSEE-C:'),0,2);
}
 
return $code_departement;
}
 
/**
* Enlève les zéros excédentaires (devenus nomades) au début et à la fin d'une
* latitude ou longitude, en prenant garde à ne pas foirer les nombres 0.xyz
609,10 → 579,8
return $transmission ? 'oui' : '';
}
 
public static function estUnCodeInseeDepartement($code_a_tester) {
return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester);
}
 
 
// TODO: référentiel ne devrait pas être généré au moment d'un Config::get,
// comme dans Config::get('nomsVernaRechercheLimiteeTpl')
// Par exemple, la variable pour "nva" ?
733,33 → 701,10
return $nom;
}
 
/* Cette fonction initialise le cache des noms communs en 1 fois, sur la liste des observations à exporter.
Ainsi, les appels successifs à getNomCommun_v4() ne sont pas couteux (pas de requête SQL) */
static function getNomCommun_preload($cel, $obsids) {
if(!$obsids) return;
if(!self::referenceTableExiste()) return NULL;
 
// CREATE INDEX i_nom_referentiel ON cel_obs (nom_referentiel(5));
$req = sprintf("SELECT r.referentiel, r.num_taxon, r.nom_commun FROM cel_references r" .
" INNER JOIN cel_obs c ON (r.referentiel = substring_index(c.nom_referentiel, ':', 1) and r.num_taxon = c.nt)" .
" WHERE c.id_observation IN (%s)",
implode(',', $obsids));
$res = Cel::db()->requeter($req);
foreach($res as $v) {
self::$cache['getNomCommun'][$v['referentiel'] . '-' . $v['num_taxon'] . '-' . 'fra'] = $v['nom_commun'];
}
return NULL;
}
 
static function referenceTableExiste() {
if (!self::$is_table) {
// une seule fois
if (! Cel::db()->requeterLigne("SHOW TABLES LIKE 'cel_references'")) return FALSE;
self::$is_table = TRUE;
}
return TRUE;
}
 
 
static function getNomCommun_v4($obs) {
// Attention la fonction suppose que l'on ait fait appel à getNomCommun_preload avant
// d'être appelée