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 |