Subversion Repositories eFlore/Applications.cel

Compare Revisions

Ignore whitespace Rev 1701 → Rev 1702

/trunk/jrest/lib/FormateurGroupeColonne.php
8,13 → 8,33
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
*/
 
define('SEPARATEUR_IMAGES', ",");
 
Class FormateurGroupeColonne {
 
// cache pour les données des fonctions
static $cache = Array();
 
// test sur la table cel_references, mis à TRUE si la table existe
static $is_table = false;
 
// les données baseflor à récupérer: colonnes présentes dans cel_references
// et intitulés associés
static $baseflor_col = array(
"ve_lumiere" => "Lumière",
"ve_temperature" => "Température",
"ve_continentalite" => "Continentalité",
"ve_humidite_atmos" => "Humidité Atmosphérique",
"ve_humidite_edaph" => "Humidité",
"ve_reaction_sol" => "Réaction (pH)",
"ve_nutriments_sol" => "Nutriments",
"ve_salinite" => "Salinité",
"ve_texture_sol" => "Texture" ,
"ve_mat_org_sol" => "Matière Organique",
"catminat_code" => "Code Catminat",
"syntaxon" => "Syntaxon",
);
 
/*
* @param $fieldSets: un liste de noms de colonnes ou de sets de colonnes
* séparés par des virgules
82,10 → 102,16
/* 'nom_commun' => self::GenColInfo('nom_commun', 'Nom Commun', 1, NULL, 'getNomCommun', FALSE),
'nom-commun' => self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v2'),
'nom-commun' => self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, 'getNomCommun_v3'), */
'nom-commun' => self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, NULL /* cas particu 'getNomCommun_v4' */, TRUE, 'getNomCommun_preload'),
'nom-commun' => self::GenColInfo('nom-commun', 'Nom Commun', 1, NULL, NULL /* cas particu 'getNomCommun_v4' */, TRUE, array(__CLASS__, 'getNomCommun_preload')),
);
}
 
if(isset($groupe_de_champs['baseflor'])) {
$colonnes += array(
// champ dynamique
'baseflor' => self::GenColInfo('baseflor', '', 1, NULL, NULL, FALSE, array(__CLASS__, 'baseflor_preload'), array(__CLASS__, 'baseflor_ligne')),
);
}
}
 
return $colonnes;
}
94,13 → 120,14
$result = array();
foreach($colonnes as $abbrev => $colonne) {
if(!$colonne['preload']) continue;
$result[$abbrev] = call_user_func(array(__CLASS__, $colonne['preload']), $cel, $ids);
$result[$abbrev] = call_user_func($colonne['preload'], $cel, $ids);
}
return $result;
}
public static function getIntitulesColonnes($colonnes) {
return array_map(array('FormateurGroupeColonne', 'retournerNomItem'), $colonnes);
// array_filter pour supprimer les colonnes "dynamique" n'ayant pas défini $nom (cf GenColInfo())
return array_filter(array_map(array('FormateurGroupeColonne', 'retournerNomItem'), $colonnes));
}
public static function retournerNomItem(&$item) {
112,7 → 139,7
$ligne_formatee = array();
foreach($colonnes as $abbrev => $colonne) {
$valeur = null;
if($colonne['extra'] == 2) continue;
if($colonne['extra'] == 2 || ! is_null($colonne['dyna'])) continue;
// valeur direct depuis cel_obs ?
if(isset($obs[$abbrev])) $valeur = $obs[$abbrev];
154,8 → 181,12
$ligne_formatee[] = $valeur;
}
 
// TODO:
// taxon => (code_catminat) => syntaxon => données baseveg
// uniquement les champŝ dynamiques
foreach($colonnes as $abbrev => $colonne) {
$valeur = null;
if(is_null($colonne['dyna'])) continue;
$colonne['dyna']($cel, $obs, $ligne_formatee);
}
 
return $ligne_formatee;
}
170,6 → 201,8
* cf: ImportXLS::detectionEntete()
* @param $nom (obligatoire): nom complet de colonne (utilisé pour la ligne d'en-tête)
* Les définition de champs dynamique (correspondant à de multiples colonnes) doivent laisser cette valeur
* vide afin de ne pas créer une colonne supplémentaire erronée.
* @param $is_extra:
* Si 0, la colonne est une colonne standard
190,9 → 223,13
 
* @param $preload (optionnel): défini une fonction de préchargement massif de donnée potentiellement utilisable par $fonction_data.
* Utile, notamment, dans le cadre de l'export
 
* @param $fonction_dynamique (optionnel): défini une fonction ajoutant un nombre arbitraire de colonnes à une ligne donnée
* Utile, notamment, dans le cadre de l'export des champs étendus ou des données baseflor
* La fonction doit TOUJOURS alterer la ligne en lui ajoutant une nombre CONSTANT d'éléments (NULL ou non)
* La fonction doit prendre comme arguments ($cel, $obs, &$ligne_formatee)
*/
static function GenColInfo($abbrev, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE, $preload = NULL) {
static function GenColInfo($abbrev, $nom, $is_extra = 0, $fonction = NULL, $fonction_data = NULL, $importable = TRUE, $preload = NULL, $fonction_dynamique = NULL) {
return Array('abbrev' => $abbrev,
'nom' => $nom,
'extra' => $is_extra ? 1 : 0,
200,6 → 237,7
'fonction_data' => $fonction_data,
'importable' => $importable,
'preload' => $preload,
'dyna' => $fonction_dynamique,
);
}
369,11 → 407,10
}
 
/* 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)
*/
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(!$cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return NULL;
if(!self::referenceTableExiste($cel)) 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" .
386,16 → 423,20
}
return NULL;
}
 
static function referenceTableExiste($cel) {
if(!self::$is_table) {
// une seule fois
if(! $cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return FALSE;
self::$is_table = TRUE;
}
return TRUE;
}
static function getNomCommun_v4($obs, $cel) {
static $is_table = false;
if(! $obs['nt']) return NULL;
if(! self::referenceTableExiste($cel)) return NULL;
 
if(!$is_table) {
// une seule fois
if(! $cel->executerRequete("SHOW TABLES LIKE 'cel_references'", Cel::SQL_RETOUR_LIGNE)) return NULL;
$is_table = true;
}
$langue = 'fra';
list($referentiel) = explode(':', strtolower($obs['nom_referentiel']));
$cache_id = $referentiel . '-' . $obs['nt'] . '-' . $langue;
418,6 → 459,70
self::$cache['getNomCommun'][$cache_id] = $nom;
return $nom;
}
 
 
/* Cette fonction initialise le cache des données baseflor en 1 fois, sur la liste des observations à exporter.
Ainsi, les appels successifs à baseflor_ligne() ne sont pas couteux (pas de requête SQL) */
static function baseflor_preload($cel, $obsids) {
if(!$obsids) return;
if(!self::referenceTableExiste($cel)) return NULL;
 
$req = sprintf("SELECT referentiel, num_nom_retenu, %s FROM cel_references r" .
" INNER JOIN cel_obs c ON (r.num_nom_retenu = c.nom_ret_nn)" .
" WHERE c.id_observation IN (%s)",
//" AND catminat_code IS NOT NULL", // TODO: suppression des NULL ici signifie que le cache sera partiel...
implode(',', array_keys(self::$baseflor_col)),
implode(',', $obsids));
$res = $cel->requeter($req);
 
foreach($res as $v) {
$data = $v;
unset($data['referentiel']); // non nécessaire
unset($data['num_nom_retenu']); // non nécessaire
self::$cache['getBaseflor'][$v['referentiel'] . '-' . $v['num_nom_retenu']] = $data;
}
 
return NULL;
}
 
static function baseflor_ligne($cel, $obs, &$ligne) {
 
if(! $obs['nom_ret_nn']) {
$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
return;
}
 
if(! self::referenceTableExiste($cel)) {
$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
return;
}
 
list($referentiel) = explode(':', strtolower($obs['nom_referentiel']));
$cache_id = $referentiel . '-' . $obs['nom_ret_nn'];
 
// XXX: problème de valeurs NULL pour utiliser simplement isset() ?
// @ car getBaseflor[] n'est peut-être pas encore initialisé
if(@array_key_exists($cache_id, self::$cache['getBaseflor'])) {
$ligne = array_merge($ligne, self::$cache['getBaseflor'][$cache_id]);
return;
}
 
// pas de cache:
$data = $cel->executerRequete(sprintf("SELECT %s FROM cel_references " .
"WHERE referentiel = '%s' AND num_nom_retenu = %d LIMIT 1",
implode(', ', array_keys(self::$baseflor_col)),
$referentiel,
$obs['nom_ret_nn']),
Cel::SQL_RETOUR_LIGNE);
 
if(! $data) {
$ligne = array_merge($ligne, array_fill(0, count(self::$baseflor_col), 'A'));
return;
}
 
// cache
self::$cache['getBaseflor'][$cache_id] = $data;
$ligne = array_merge($ligne, $data);
}
}